Chrome Headless使用
測試 Chrome 版本: 62.0.3202.89(正式版本)(64 位)
Python環(huán)境:python2.7
注: Headless模式需要59版本及以上!
Chrome的安裝與配置不在此贅述, 不過需要注意的是:
版本號與驅(qū)動的映射關(guān)系!
版本號與驅(qū)動的映射關(guān)系??!
版本號與驅(qū)動的映射關(guān)系!?。?/h3>
Chrome與Chromedriver的映射關(guān)系表:
Chromedriver下載鏈接:http://chromedriver.storage.googleapis.com/index.html
1. 使用Headless模式
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 無頭模式啟動
chrome_options.add_argument('--headless')
# 谷歌文檔提到需要加上這個屬性來規(guī)避bug
chrome_options.add_argument('--disable-gpu')
# 初始化實例
driver= webdriver.Chrome(chrome_options=chrome_options)
# 請求百度
driver.get("http://www.baidu.com")
2. 禁用圖片
2.1 網(wǎng)上大多數(shù)的資料給的是以下這種方式, 但是在Headless的模式下并沒有生效, 在非Headless的模式下是生效的。
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)
2.2 以下的這種方式在Headless的模式下是生效的, 非Headless模式下也是生效的。
chrome_options.add_argument('blink-settings=imagesEnabled=false')
3. 添加代理
chrome_options.add_argument("--proxy-server=http://" + ip:port)
4. 修改User-Agent
Chrome Headless模式為什么要修改User-Agent, 來看一下同一個瀏覽器不同模式下的User-Agent:
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3202.89 Safari/537.36"
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36"
# 修改User-Agent
chrome_options.add_argument('user-agent= '你想修改成的User-Agent')
5. 打開新的標(biāo)簽頁
#打開空白標(biāo)簽頁的方式有很多, 在此只演示一種
js='window.open("http://www.itdecent.cn/p/4fef4142b33f");'
driver.execute_script(js) # 通過打開新的標(biāo)簽頁, 可以節(jié)省瀏覽器打開的時間,減少資源的浪費。
6. 關(guān)閉新打開的標(biāo)簽頁
# 分兩步走
# 1.獲取標(biāo)簽頁的句柄
handlesList = driver.window_handles # 返回一個瀏覽器中所有標(biāo)簽的句柄列表, 順序為打開窗口的順序
# 2. 切換窗口, 關(guān)閉標(biāo)簽
driver.switch_to.window(handlesList[0]) # 切換到百度標(biāo)簽
driver.close() # 關(guān)閉標(biāo)簽,這里必須用 driver.close() ,用driver.quit()會導(dǎo)致瀏覽器關(guān)閉
7. driver使用完之后切記要driver.quit(), 不然或?qū)е聝?nèi)存爆滿
8. 其他:
切換標(biāo)簽的時候,我之前用的方法會出現(xiàn)這種狀況, 原因是該方法不支持了:不支持的不只是這一種, 還有如下:
driver.switch_to_active_element() ==> driver.switch_to.active_element() 定位到當(dāng)前聚焦的元素上
driver.switch_to_alert() ==> driver.switch_to.alert() 切換到alert彈窗
driver.switch_to_default_content() ==> driver.switch_to.default_content() 切換到最上層頁面
driver.switch_to_frame(frame_reference) ==> driver.switch_to.frame(frame_reference) 通過id、name、element(定位的某個元素)、索引來切換到某個frame
driver.switch_to_window() ==> driver.switch_to.window() 切換到指定的標(biāo)簽頁
driver.switch_to.parent_frame() switch_to中獨有,可以切換到上一層的frame,對于層層嵌套的frame很有用
注: 用pycharm編程的時候還是提示switch_to_window, 但此方法已經(jīng)不能用了!!