1. 程式人生 > >(python解析js)selenium結合phantomjs抓取js生成的頁面

(python解析js)selenium結合phantomjs抓取js生成的頁面

,有些網頁是在載入時動態建立HTML內容,只要在js程式碼完全執行完後才會顯示最終結果。如果用傳統的方法抓取頁面,就只能獲得js程式碼執行之前頁面上的內容。

要解決這個問題有兩種方法:

  1.直接從js程式碼中抓取資料(執行js程式碼,解析js變數)。
  2.用第三方庫執行js,抓取執行後的最終html頁面。

在python中使用selenium執行js

selenium是一個強大的網路資料採集工具,其最初是為網站自動化測試而開發的。selenium可以讓瀏覽器自動載入頁面,獲取需要的資料,甚至頁面截圖,或判斷網站上某些動作是否發生。

selenium自己不帶瀏覽器,它需要與第三方瀏覽器結合一起使用。這裡使用phantomjs的工具代替真實的瀏覽器。

PhantomJS 是一個基於 WebKit 的伺服器端 JavaScript API。它全面支援web而不需瀏覽器支援,其快速,原生支援各種Web標準: DOM 處理, CSS 選擇器, JSON, Canvas, 和 SVG。 PhantomJS 可以用於 頁面自動化 , 網路監測 , 網頁截圖 ,以及 無介面測試 等。

把selenium和phantomjs結合在一起,就可以執行一個非常強大的爬蟲了,可以處理cookie,js,header,以及任何需要你做的事。

安裝:

selenium有python庫,可以用pip等安裝;phantomjs是一個功能完善的“無頭“瀏覽器,並非一個python庫,所以它不需要想python的其他庫一樣安裝,也不能用pip安裝。

sudo pip install selenium
http://npm.taobao.org/dist/phantomjs/ 
#下載安裝包(sudo apt-get install phantomjs安裝的不是最新的,發現不能用)
phantomjs-2.1.1-linux-i686.tar.bz2
tar -jxvf phantomjs-2.1.1-linux-i686.tar.bz2

使用:

from selenium import webdriver
driver = webdriver.PhantomJS(executable_path='/opt/phantomjs-2.1.1-linux-i686/bin/phantomjs'
) #executable_path為你的phantomjs可執行檔案路徑 driver.get("http://news.sohu.com/scroll/") #或得js變數的值 r = driver.execute_script("return newsJason") print r #selenium在webdriver的DOM中使用選擇器來查詢元素,名字直接了當,by物件可使用的選擇策略有:id,class_name,css_selector,link_text,name,tag_name,tag_name,xpath等等 print driver.find_element_by_tag_name("div").text print driver.find_element_by_csss_selector("#content").text print driver.find_element_by_id("content").text