細談Scrapy框架中運用selenium的經驗
首先我是個技術小白,工作的經驗也不到一年的時間,但是卻在這一年的時間裡讓我深深體會到了面對問題時對解決的問題的感悟。話不多說,總結一句話就是:這是我的第一篇技術部落格,希望大家在閱讀的同時能給予一些建議,共同學習進步。
我們平時寫爬蟲的程式碼就是想著構造請求獲取響應,但是這只是一般的網站能夠讓你獲取到你想要的資料,面對訪問量大、資料寶貴的情況下,你可能就比較失望了。因為正常的傳送請求獲取到的資料往往是js加密後的資料,所以面對這類的網站,如其研究怎麼解密,倒不如直接換一種方案解決,說到這裡有經驗的人直接就想到了selenium,嗯沒錯我說的就是selenium,但是我所說的是我工作中真正運用的,所以不同於其他的純技術類的部落格,接下來我就開始詳細說一下我對selenium的理解和運用。
1.什麼是selenium?
就是能夠模擬瀏覽器傳送請求獲取響應,響應的資料就是瀏覽器上人眼看到的資料(所見即所得),再運用Xpath(這裡的語法可以參考官方的用法)來抓取頁面上的資料,因為載入的頁面資料是沒有加密的,所以直接就能獲取。
2.PhantomJs無介面的瀏覽器
相對於selenium,PhantomJs的無介面瀏覽器佔用記憶體較小,在爬取資料的時候無需自動開啟介面,但是可以通過設定來實現selenium的我介面抓取,具體操作:
from selenium import webdriver # 建立chrome引數物件 opt = webdriver.ChromeOptions() # 把chrome設定成無介面模式,不論windows還是linux都可以,自動適配對應引數 opt.set_headless() # 建立chrome無介面物件 driver = webdriver.Chrome(options=opt) # 訪問百度 driver.get('https://baidu.com/') #列印內容 print(driver.page_source)
同時這裡的ChromeOptions()也可以設定代理來應對反爬,具體操作
from selenium import webdriver chromeOptions = webdriver.ChromeOptions() # 設定代理 chromeOptions.add_argument("--proxy-server=http://202.20.16.82:10152") # 一定要注意,=兩邊不能有空格,不能是這樣--proxy-server = http://202.20.16.82:10152 browser = webdriver.Chrome(chrome_options = chromeOptions) # 檢視本機ip,檢視代理是否起作用 browser.get("http://httpbin.org/ip") print(browser.page_source) # 退出,清除瀏覽器快取 browser.quit()
注意:這裡的代理的數量,我目前只用了一個效率較高的代理,因為selenium爬蟲採用的是瀏覽器渲染技術,本身速度就很慢。如果選擇的代理IP速度較慢,就會大大增加爬取的時間。所以使用代理前需要慎重,你要知道你使用的代理是不是訪問的速度快。
3. selenium抓取時應對滾動載入類的介面時如何抓取?
方法一: 通過selenium模擬瀏覽器,然後設定瀏覽器高度足夠長,然後延時使之能夠將頁面的內容都能夠加載出來
from selenium import webdriver
driver = webdriver.Firefox()
driver.set_window_size(1000,30000)
driver.get(url)
time.sleep(5)
方法二: 通過模擬瀏覽器去執行js去拉動滑滾條
from selenium import webdriver
driver = webdriver.Firefox()
driver.get(url)
driver.execute_script("window.scrollBy(0,3000)")
time.sleep(1)
driver.execute_script("window.scrollBy(0,5000)")
time.sleep(1)
注意:這種方法你得根據載入的內容去判定下拉的位置和次數,否則會只能獲取到部分內容(建議使用方法一)
4. selenium中三種頁面載入等待
我這裡就不多說因為我看了一位博主寫的比較生動形象了,點選此處可以參考一下,相信你能一目瞭然的。
關於selenium就暫時講到這裡,後面關於selenium的知識點還會繼續更新,學無止境,一起共勉吧 !