,有些網頁是在載入時動態建立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 seleniumhttp://npm.taobao.org/dist/phantomjs/ #下載安裝包(sudo apt-get install phantomjs安裝的不是最新的,發現不能用)phantomjs-2.1.1-linux-i686.tar.bz2tar -jxvf phantomjs-2.1.1-linux-i686.tar.bz2
使用:
from selenium import webdriverdriver = 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").textprint driver.find_element_by_csss_selector("#content").textprint driver.find_element_by_id("content").text