1. 程式人生 > 其它 >基於selenium的元素查詢及chrome-headless設定-爬取動態網頁

基於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()則相當於關閉整個瀏覽器的效果。