python + selenium + chrome headless 的一些備忘

JhonSmith發表於2019-02-16

使用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就可以獲得所有的請求資訊.

おわり.

相關文章