目前許多網站大量運用js腳本進行一些頁面的處理,這些頁面的抓取對爬蟲是個挑戰。 這類頁面的抓取,我用到了下面的方法javascript
分析頁面(firebug/chrome調試工具 等),找到ajax獲取的數據源,看是否能夠直接發請求獲取java
調用瀏覽器引擎(webkit)獲取最後 js 執行過完成的頁面python
調用無界面依賴的瀏覽器引擎(headless browser) casperjs,phantomjs 獲取最後的頁面web
安裝須要的軟件ajax
# Xvfb 模擬 Xwindows sudo apt-get install xvfb # 安裝 python webkit包
添加增長下面的下載代碼(增長的位置我後面說明)chrome
webview = webkit.WebView() webview.connect( 'load-finished', lambda v,f: gtk.main_quit() ) webview.load_uri( request.url ) gtk.main() renderedBody = str(webview.execute_script('document.documentElement.innerHTML')) # renderedBody 是執行後頁面的內容
注意的上面的代碼我沒有說明寫在哪裏,網上不少例子都是說寫 下載中間件(DownloaderMiddleware)裏,這是有些問題的windows
scrapy 是基於twisted的異步網絡框架。若是下載中間件中長時間阻塞,就會阻塞整個異步處理流程瀏覽器
scrapy 自己的下載 delay 功能,是在中間件下面一層生效(中間件和下載器之間),也就是說若是在下載中間件這裏中斷處理流程,下載時間間隔功能將失去做用。網絡
還有一個問題就是 上面的方案須要啓動模擬的 x-server (xvfb)框架
casperjs,phantomjs 無界面瀏覽器(headless browser)
寫一個 scrapy 的 下載handler,這是scrapy支持的插件,而且不影響其餘框架功能的運行,下載器的開發我會在下一篇講一下