Selemium參考文章:
比較好的綜合對比各類方案的文章
Python 分佈式動態頁面爬蟲研究
Python 分佈式動態頁面爬蟲研究
分佈式Scrapy+chromedriver或Selenium Grid是實現分佈式動態爬蟲較好的選擇。
chromedriver資源地址
以噹噹圖書詳情頁爲例,屢次對比了Splash和Selenium chome的採集效率:
Splash的平均採集時間爲40s,而且時不時會失敗
Selenium chrome的平均採集時間爲10s,不多碰到失敗。
說明chrome的效率和穩定性仍是挺有保證的。
1、開發環境
安裝selenium
pip install selenium
pip install isbnlib
根據平臺選擇安裝chromedriver並移動至系統目錄下,如/usr/local/bin
運行」chromedriver"檢測是否安裝成功。
2、使用
這裏碰到了一個棘手的問題,就是在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的頁面加載策略發生改變。
二、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
三、代理設置
這裏發現動態變動代理是個挺麻煩的事情,目前根據下面的文章已經摸索成功並投入運行。
麻煩的一點是打開的chrome實例須要按期清理,不然CPU使用率一直下不來,致使系統壓力過大。
四、scrapy-async-selenium
Selenium在scrapy的異步使用,解決了已知阻塞的效率問題,又一篇神做,給了很大的啓發!
總體方案是很是合理有效的。
已經在系統中成功使用,期間還有一些細節問題待進一步梳理。