python + selenium + chrome headless 的一些備忘

使用python3.6在Ubuntu中進行了一項使用Chrome headless瀏覽器的工做, 在此記錄下遇到的問題以及解決方法.

入門?

參考 unning-selenium-with-headless-chromepython

Ubuntu中如何安裝chrome瀏覽器, 以及chromedriver?

參考 Installing ChromeDriver on Ubuntulinux

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_idweb

opener.command_executor._url, opener.session_id #opener爲webdriver對象

以後經過remote方式連接chrome

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是最長等待時間cookie

selenium 打開新標籤頁

偏向使用js函數來執行網絡

opener.execute_script('''window.open("http://baidu.com","_blank");''')

selenium 得到頁面的網絡請求信息

有些時候頁面在你點擊後會異步進行請求, 完成一些操做, 這時可能就會生成輸出數據的url, 只要抓到這個url就能夠跳過token驗證等安全監測, 直接得到數據.session

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就能夠得到全部的請求信息.app

おわり.

相關文章
相關標籤/搜索