Learning Scrapy筆記(六)- Scrapy處理JSON API和AJAX頁面


摘要:介紹了使用Scrapy處理JSON API和AJAX頁面的方法

有時候,你會發現你要爬取的頁面並不存在HTML源碼,譬如,在瀏覽器打開http://localhost:9312/static/,然后右擊空白處,選擇“查看網頁源代碼”,如下所示:

Image 107

就會發現一片空白

Image 108

留意到紅線處指定了一個名為api.json的文件,於是打開瀏覽器的調試器中的Network面板,找到名為api.json的標簽

Image 109

在上圖的紅色框里就找到了原網頁中的內容,這是一個簡單的JSON API,有些復雜的API會要求你先登錄,發送POST請求,或者返回一些更加有趣的數據結構。Python提供了一個用於解析JSON的庫,可以通過語句json.loads(response.body)將JSON數據轉變成Python對象

 

api.py文件的源代碼地址:

https://github.com/Kylinlin/scrapybook/blob/master/ch05%2Fproperties%2Fproperties%2Fspiders%2Fapi.py

 

復制manual.py文件,重命名為api.py,做以下改動:

  • 將spider名修改為api

  • 將start_urls修改為JSON API的URL,如下

start_urls = (
'http://web:9312/properties/api.json',
)

如果在獲取這個json的api之前,需要登錄,就使用start_request()函數(參考《Learning Scrapy筆記(五)- Scrapy登錄網站》)

  • 修改parse函數
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

Image 110

運行該spider:scrapy crawl api

Image 111

可以看到總共發送了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))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM