Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面

摘要:介绍了使用Scrapy处理JSON API和AJAX页面的方法html

有时候,你会发现你要爬取的页面并不存在HTML源码,譬如,在浏览器打开http://localhost:9312/static/,而后右击空白处,选择“查看网页源代码”,以下所示:git

Image 107

就会发现一片空白github

Image 108

留意到红线处指定了一个名为api.json的文件,因而打开浏览器的调试器中的Network面板,找到名为api.json的标签web

Image 109

在上图的红色框里就找到了原网页中的内容,这是一个简单的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登陆网站》)

  • 修改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))
相关文章
相关标签/搜索