基於selenium的元素查詢及chrome-headless設定-爬取動態網頁
本文就是介紹第二篇中介紹的方法二:利用selenium操縱瀏覽器來模擬瀏覽器行為從而獲取資料。
如上篇介紹,我們發現網頁原始碼和檢查元素不一致,這是AJAX非同步載入所致。這同時也說明瀏覽器可以識別出這些加載出來的東西,所以如果我們可以直接控制瀏覽器,自然也可以抓取到這些本看不到的元素。
Selenium是一個自動化的測試工具,這裡主要用到了它的Webdriver操作瀏覽器。Selenium可以操作大多數主流瀏覽器(可能需要相應的驅動),windows系統下命令列輸入:
pip install selenium
即可安裝。
往常而言,selenium的搭檔通常是PhantomJS,簡單點說PhantomJS就是一個沒有介面的瀏覽器,提供了JavaScript介面。 在Windows平臺,下載好PhantomJS後,將phantomjs.exe放到Python的檔案路徑裡即可呼叫。
但是!!現在python3.6.4已經不支援PhantomJS了,也就是說,相應的模組即將或者已經下架了。
那麼支援什麼呢?推薦使用firefox或者chrome的headless版本。本文的搭檔就選擇chrome。
windows平臺的話,chrome6.0版本以上才支援headless,而Mac和Linux則是5.9版本以上。
1.chromedriver下載
chromedriver各版本下載
可以自行查詢一下chromedriver和chrome的版本對應關係,以確保可以使用headless模式
2.chrome的headless模式設定
不多說,直接上關鍵程式碼:
from selenium.webdriver.chrome.options import Options
chrome_options=Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver=webdriver.Chrome(options=chrome.options)
#webdriver.Chrome(chrome_options=chrome_options)也可以
以上,即可實現headless模式,所謂headless,即瀏覽器後臺執行,無介面
3.selenium操縱chrome瀏覽器
如何操縱呢?很簡單很直接很方便很好理解:
from selenium import webdriver
#driver=webdriver.PhantomJS() # 獲取瀏覽器物件,操縱PhantomJS
driver=webdriver.Chrome() # 獲取瀏覽器物件,操縱chrome
driver.get('baidu/')
print driver.page_source #此時driver.page_source已經將JS渲染部分讀取出來了
以上,即可實現操縱,要注意和之前的不同之處,此時的get不能直接傳遞頭資訊,需要另外設定。
而之所以專門把page_source標出,是為了說明,driver.page_source可以傳入bs4從而實現之前那種模式的篩選資料,這樣也算是比較熟悉的領域,當然,webdriver中也內建許多find_element方法
4.selenium元素查詢及處理
總共內建18種查詢方法:
前八種是單一元素的定位選取
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:
find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5定位:find_element_by_link_text(self, link_text)
6.partial_link定位
find_element_by_partial_link_text(self,link_text)
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:
find_element_by_css_selector(self,css_selector)
這八種是以上的複數形式,結果返回為list形式,因為之前的BeatifulSoup.select()同樣返回list,故這幾種可能用起來更方便
9.id複數定位find_elements_by_id(self, id_)
10.name複數定位find_elements_by_name(self, name)
11.class複數定位
find_elements_by_class_name(self, name)
12.tag複數定位find_elements_by_tag_name(self, name)
13複數定位
find_elements_by_link_text(self, text)
14.partial_link複數定位
find_elements_by_partial_link_text(self,link_text)
15.xpath複數定位find_elements_by_xpath(self, xpath)
16.css複數定位
find_elements_by_css_selector(self,css_selector
還有兩種不怎樣用的
find_element(self, by='id', value=None)
find_elements(self, by='id', value=None)
選取之後呢?怎麼處理呢?
我們知道之前的BeautifulSoup選取後,可以get_text()得到標籤之間的文字,get()可以得到標籤內的元素值
對應的,以上篩選方式篩選後,可以直接 .text 顯示標籤之間的文字,而get_attribute()則可以得到標籤內的元素值
……………………………………………………………………………………………………………………………………………………………………………………
emmm,剩下的呢,基本就是之前的思路了。
第二篇中講過,這種方式相對比較籠統,如果資料量大的話,很佔記憶體。另外如果要用以上方法的話,一定要記住兩種退出方式:close()以及quit(),其中close()作用即相當於關閉當前頁面,而quit()則相當於關閉整個瀏覽器的效果。