使用python3.6在Ubuntu中進行了一項使用Chrome headless瀏覽器的工作, 在此記錄下遇到的問題以及解決方法.
入門?
參考 unning-selenium-with-headless-chrome
Ubuntu中如何安裝chrome瀏覽器, 以及chromedriver?
參考 Installing ChromeDriver on Ubuntu
selenium啟動瀏覽器時常用的屬性
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument(`window-size=1920x3000`) #指定瀏覽器解析度
chrome_options.add_argument(`--disable-gpu`) #谷歌文件提到需要加上這個屬性來規避bug
chrome_options.add_argument(`--hide-scrollbars`) #隱藏滾動條, 應對一些特殊頁面
chrome_options.add_argument(`blink-settings=imagesEnabled=false`) #不載入圖片, 提升速度
chrome_options.add_argument(`--headless`) #瀏覽器不提供視覺化頁面. linux下如果系統不支援視覺化不加這條會啟動失敗
chrome_options.binary_location = r`/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary` #手動指定使用的瀏覽器位置
selenium如何連線到已經開啟的瀏覽器?
需要在開啟瀏覽器後, 獲取瀏覽器的command_executor url
, 以及session_id
opener.command_executor._url, opener.session_id #opener為webdriver物件
之後通過remote
方式連結
from selenium import webdriver
opener = webdriver.Remote(command_executor=_url,desired_capabilities={}) #_url為上面的_url
opener.close() #這時會開啟一個全新的瀏覽器物件, 先把新的關掉
opener.session_id = session_id #session_id為上面的session_id
之後對opener
的任何操作都會反映在之前的瀏覽器上.
selenium 的 desired_capabilities 如何傳遞--headless
這樣的瀏覽器引數
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
capabilities = DesiredCapabilities.CHROME
capabilities.setdefault(`chromeOptions`, {`args`:[`--headless`, `--disable-gpu`]})
selenium 使用 crontab等環境啟動時提示chromedriver not in PATH
初始化的時候, 傳入chromedriver絕對路徑
opener = webdriver.Chrome(r`/usr/local/bin/chromedriver`, chrome_options=chrome_options)
selenium使用cookies
- 獲得cookies
opener.get_cookies()
- 寫入cookies
opener.add_cookie(cookie) #需要先訪問該網站產生cookies後再進行覆寫
selenium 等待頁面所有非同步函式完成
opener.implicitly_wait(30) #30是最長等待時間
selenium 開啟新標籤頁
偏向使用js函式來執行
opener.execute_script(```window.open("http://baidu.com","_blank");```)
selenium 獲得頁面的網路請求資訊
有些時候頁面在你點選後會非同步進行請求, 完成一些操作, 這時可能就會生成輸出資料的url, 只要抓到這個url就可以跳過token驗證等安全監測, 直接獲得資料.
script = "var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {}; var network = performance.getEntries() || {}; return network;"
performances = opener.execute_script(script)
script裡是js程式碼, 一般用來進行效能檢查, 網路請求狀況, 使用selenium執行這段js就可以獲得所有的請求資訊.
おわり.