python抓取javascript動態生成HTML內容的實踐
本實驗在Ubuntu14.04上完成。使用的瀏覽器是火狐(Firefox 33.0),python版本是2.7.6。
大家都知道用urllib配合正則表示式抓取靜態HTML的內容很方便,但是如果網頁中有javascript動態生成的內容,urllib就無能為力了。
此時我們要藉助一個額外的工具:selenium。它的工作原理是操縱(火狐)瀏覽器瀏覽目標網頁,等待網頁中的javascript全部執行完畢後再對HTML原始碼進行操作。整個過程就好像是人工操作瀏覽器轉到目標網址檢視原始碼一樣。
從selenium的官網下載selenium-server-standalone-2.44.0.jar。為了大家方便我已經傳到了
$ chmod 664 selenium-server-standalone-2.44.0.jar
然後,安裝python的selenium工具包:
$ pip install -U selenium
準備工作就緒了,下面開始測試一下這套系統。首先執行起selenium的server:
$ sudo java -jar selenium-server-standalone-2.44.0.jar
注意,整個命令會在輸出了幾行資訊後就不動了。這不是卡死,而是server已經做好準備,等待python指令碼的呼叫。所以這個視窗就不要動了。
開個新視窗執行python指令碼:
$ python skk.py
skk.py的內容如下:
在指令碼執行的過程中,火狐瀏覽器會彈出來跳動一番,就好像人工操作瀏覽器看網頁一樣。不要理它,最後瀏覽器視窗會自動關掉。#!/usr/bin/python from selenium import selenium def selenium_init(browser,url,para): sel = selenium('localhost', 4444, browser, url) sel.start() sel.open(para) sel.set_timeout(60000) sel.window_focus() #sel.window_maximize() return sel if __name__ =="__main__" : browser='*firefox' html='' sel1=selenium_init(browser,'http://music.baidu.com','/top') try: html=sel1.get_html_source() finally: sel1.stop() print html
指令碼最終打印出http://music.baidu.com/top的HTML原始碼,存在字串變數html中。讀者可以繼續用正則表示式從“html”中獲取資料。
關於selenium的python介面的更多用法,可以參考官方文件:http://selenium.googlecode.com/git/docs/api/py/api.html