Selemium參考文章:
比較好的綜合對比各種方案的文章
Python 分布式動態頁面爬蟲研究
Python 分布式動態頁面爬蟲研究
分布式Scrapy+chromedriver或Selenium Grid是實現分布式動態爬蟲較好的選擇。
chromedriver資源地址
以當當圖書詳情頁為例,多次對比了Splash和Selenium chome的采集效率:
Splash的平均采集時間為40s,並且時不時會失敗
Selenium chrome的平均采集時間為10s,很少碰到失敗。
說明chrome的效率和穩定性還是挺有保證的。
一、開發環境
安裝selenium
pip install selenium
pip install isbnlib
根據平台選擇安裝chromedriver並移動至系統目錄下,如/usr/local/bin
運行”chromedriver"檢測是否安裝成功。
二、使用
這里碰到了一個棘手的問題,就是在driver.get的時候,經常等待兩分鍾以上才會進入下一步,通過幾天的摸索和搜索,發現可以通過配置加載策略解決這個問題。
1. PageLoadStrategy
參考文章:
當調用driver.get("
https://xxxx.xxx.xxx")來訪問某頁面時,get方法通常會阻塞瀏覽器直到頁面完全加載后才執行后面的動作,若一個頁面加載過慢,則會導致get方法一直阻塞。有時候希望頁面在加載過程中就開始檢測元素是否存在,而不是等到頁面加載完了才開始檢測,想要實現這個效果,可以用ChromeOptions類下的setPageLoadStrategy方法:
desired_capabilities = DesiredCapabilities.CHROME
desired_capabilities["pageLoadStrategy"] = "none"
driver = webdriver.Chrome(desired_capabilities=desired_capabilities,chrome_options=chrome_options)
其中PageLoadStrategy有三種選擇:
(1) none: 當html下載完成之后,不等待解析完成,selenium會直接返回
(2) eager: 要等待整個dom樹加載完成,即DOMContentLoaded這個事件完成,僅對html的內容進行下載解析
(3) normal: 即正常情況下,selenium會等待整個界面加載完成(指對html和子資源的下載與解析,如JS文件,圖片等,不包括ajax)
實際上,對於一個新加載的dom,頁面啥時候開始接受命令由頁面的加載策略決定,也就是說,我們通過修改頁面加載策略,可以使頁面即使處於加載中,也能接受我們的命令,從這點可以解決webdriver.get的阻塞問題。而每類webdriver都有一個對應的配置文件放在特定的類DesiredCapabilities里面,通過修改里面的pageLoadStrategy,可以使webdriver的頁面加載策略發生改變。
2、chrome參數設置
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox") # 取消沙盒模式, for linux root
chrome_options.add_argument("--headless") # 瀏覽器不提供可視化頁面
chrome_options.add_argument('--start-maximized') # 最大化運行(全屏窗口),不設置,取元素會報錯
chrome_options.add_argument('--disable-infobars') # 禁用瀏覽器正在被自動化程序控制的提示
chrome_options.add_argument('--incognito') # 隱身模式(無痕模式)
chrome_options.add_argument('blink-settings=imagesEnabled=false') # 不加載圖片
chrome_options.add_argument('log-level=2’) # 日志級別
# info(default) = 0
# warning = 1
# LOG_ERROR = 2
# LOG_FATAL = 3
3、代理設置
這里發現動態變更代理是個挺麻煩的事情,目前根據下面的文章已經摸索成功並投入運行。
麻煩的一點是打開的chrome實例需要定期清理,否則CPU使用率一直下不來,導致系統壓力過大。
4、scrapy-async-selenium
Selenium在scrapy的異步使用,解決了已知阻塞的效率問題,又一篇神作,給了很大的啟發!
整體方案是非常合理有效的。
已經在系統中成功使用,期間還有一些細節問題待進一步梳理。