zg手冊 之 scrapy 開發(4)-- javascript 動態頁面的抓取

zsz 10年前發布 | 62K 次閱讀 動態頁面抓取 網絡爬蟲 Python Scrapy

javascript 動態頁面

目前許多網站大量運用js腳本進行一些頁面的處理,這些頁面的抓取對爬蟲是個挑戰。這類頁面的抓取,我用到了下面的方法

  1. 分析頁面(firebug/chrome調試工具 等),找到ajax獲取的數據源,看是否可以直接發請求獲取
  2. 調用瀏覽器引擎(webkit)獲取最后 js 執行過完成的頁面
  3. 調用無界面依賴的瀏覽器引擎(headless browser) casperjs,phantomjs 獲取最后的頁面

 

使用 webkit 抓取

安裝需要的軟件

# Xvfb 模擬 Xwindows 
sudo apt-get install xvfb
# 安裝 python webkit包

添加增加下面的下載代碼(增加的位置我后面說明)

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)里,這是有些問題的

  1. scrapy 是基于twisted的異步網絡框架。如果下載中間件中長時間阻塞,就會阻塞整個異步處理流程
  2. scrapy 本身的下載 delay 功能,是在中間件下面一層生效(中間件和下載器之間),也就是說如果在下載中間件這里中斷處理流程,下載時間間隔功能將失去作用。
  3. 還有一個問題就是 上面的方案需要啟動模擬的 x-server (xvfb)

 

目前的方案

  1. casperjs,phantomjs 無界面瀏覽器(headless browser)
  2. 寫一個 scrapy 的 下載handler,這是scrapy支持的插件,并且不影響其他框架功能的運行,下載器的開發我會在下一篇講一下

 

    原文鏈接:zg手冊 之 scrapy 開發(4)-- javascript 動態頁面的抓取

     本文由用戶 zsz 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!