1. 程式人生 > >python抓取javascript動態生成HTML內容的實踐

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