摘要:介紹了使用Scrapy處理JSON API和AJAX頁面的方法html
有時候,你會發現你要爬取的頁面並不存在HTML源碼,譬如,在瀏覽器打開http://localhost:9312/static/,而後右擊空白處,選擇「查看網頁源代碼」,以下所示:git
就會發現一片空白github
留意到紅線處指定了一個名爲api.json的文件,因而打開瀏覽器的調試器中的Network面板,找到名爲api.json的標籤web
在上圖的紅色框裏就找到了原網頁中的內容,這是一個簡單的JSON API,有些複雜的API會要求你先登陸,發送POST請求,或者返回一些更加有趣的數據結構。Python提供了一個用於解析JSON的庫,能夠經過語句json.loads(response.body)將JSON數據轉變成Python對象shell
api.py文件的源代碼地址:json
https://github.com/Kylinlin/scrapybook/blob/master/ch05%2Fproperties%2Fproperties%2Fspiders%2Fapi.pyapi
複製manual.py文件,重命名爲api.py,作如下改動:瀏覽器
將spider名修改成api數據結構
將start_urls修改成JSON API的URL,以下scrapy
start_urls = ( 'http://web:9312/properties/api.json', )
若是在獲取這個json的api以前,須要登陸,就使用start_request()函數(參考《Learning Scrapy筆記(五)- Scrapy登陸網站》)
def parse(self, response): base_url = "http://web:9312/properties/" js = json.loads(response.body) for item in js: id = item["id"] url = base_url + "property_%06d.html" % id # 構建一個每一個條目的完整url yield Request(url, callback=self.parse_item)
上面的js變量是一個列表,每一個元素都表明了一個條目,能夠使用scrapy shell工具來驗證:
scrapy shell http://web:9312/properties/api.json
運行該spider:scrapy crawl api
能夠看到總共發送了31個request,獲取了30個item
再觀察上圖中使用scrapy shell工具檢查js變量的圖,其實除了id字段外,還能夠獲取title字段,因此能夠在parse函數中同時獲取title字段,並將該字段的值傳送到parse_item函數中填充到item裏(省去了在parse_item函數中使用xpath來提取title的步驟),修改parse函數以下:
title = item["title"] yield Request(url, meta={"title": title},callback=self.parse_item) #meta變量是一個字典,用於向回調函數傳遞數據
在parse_item函數中,能夠在response中提取這個字段
l.add_value('title', response.meta['title'], MapCompose(unicode.strip, unicode.title))