scrapy抓取ajax請求的網頁

鴨脖發表於2014-03-13

在上一篇部落格

http://zhouxi2010.iteye.com/blog/1450177

中介紹了用scrapy抓取網頁,但是隻能抓取普通html中的連結,對於ajax請求的網頁卻抓不到,但是實際應用中ajax請求又是十分普遍的,所以這裡在記錄下抓取ajax頁面的方法.

仍然是spiders/book.py:

Java程式碼  收藏程式碼
  1. class BookSpider(CrawlSpider):    
  2.     ................  
  3.     ................  
  4.     ................  
  5.     def parse_item(self, response):    
  6.         hxs = HtmlXPathSelector(response)    
  7.         item = BookItem()    
  8.         ........  
  9.         ..........  
  10.         #這裡url是虛構的,使用時需要修改  
  11.         url =  "http://test_url/callback.php?ajax=true"  
  12.         request =  Request(url, callback=self.parse_ajax)  
  13.         request.meta['item'] = item  
  14.         #這裡將ajax的url找出來,然後夠找請求,框架執行請求收到返回後再回撥  
  15.         yield request  
  16.   
  17.     def parse_ajax(self, response):  
  18.         data = response.body  
  19.         #這裡寫正則匹配或者選擇XPathSelector獲取需要捕獲的資料,略  
  20.         ajaxdata = get_data(data)  
  21.   
  22.         #由於返回可能是js,可以採用python來模擬js直譯器,不過這裡偷懶就用json來進行轉換  
  23.         if ajaxdata:  
  24.             x = '{"data": "' + ajaxdata.replace('\n''') + '"}'  
  25.             ajaxdata = simplejson.loads(x)['data']  
  26.         else:  
  27.             ajaxdata = ''  
  28.          
  29.         item = response.meta['item']  
  30.         item['ajaxdata'] = ajaxdata  
  31.         for key in item:  
  32.             if isinstance(item[key], unicode):  
  33.                 item[key] = item[key].encode('utf8')  
  34.         #到這裡一個Item的全部元素都抓齊了,所以返回item以供儲存  
  35.         return item  

相關文章