在上一篇部落格 http://zhouxi2010.iteye.com/blog/1450177
中介紹了用scrapy抓取網頁,但是只能抓取普通html中的連結,對於ajax請求的網頁卻抓不到,但是實際應用中ajax請求又是十分普遍的,所以這裡在記錄下抓取ajax頁面的方法.
仍然是spiders/book.py:
Java代碼 class BookSpider(CrawlSpider): ................ ................ ................ def parse_item(self, response): hxs = HtmlXPathSelector(response) item = BookItem() ........ .......... #這裡url是虛構的,使用時需要修改 url = "http://test_url/callback.php?ajax=true" request = Request(url, callback=self.parse_ajax) request.meta['item'] = item #這裡將ajax的url找出來,然後夠找請求,架構執行請求收到返回後再回調 yield request def parse_ajax(self, response): data = response.body #這裡寫正則匹配或者選擇XPathSelector擷取需要捕獲的資料,略 ajaxdata = get_data(data) #由於返回可能是js,可以採用python來類比js解譯器,不過這裡偷懶就用json來進行轉換 if ajaxdata: x = '{"data": "' + ajaxdata.replace('\n', '') + '"}' ajaxdata = simplejson.loads(x)['data'] else: ajaxdata = '' item = response.meta['item'] item['ajaxdata'] = ajaxdata for key in item: if isinstance(item[key], unicode): item[key] = item[key].encode('utf8') #到這裡一個Item的全部元素都抓齊了,所以返回item以供儲存 return item