scrapy分页抓取网页(使用Scrapy处理JSONAPI和AJAXAJAX页面的方法 )
优采云 发布时间: 2022-01-01 23:23scrapy分页抓取网页(使用Scrapy处理JSONAPI和AJAXAJAX页面的方法
)
摘要:介绍了如何使用Scrapy处理JSON API和AJAX页面
有时你可能会发现你要爬取的页面的HTML源代码不存在,比如在浏览器中打开:9312/static/,然后在空白处右击,选择“查看网页”源代码”,如下图:
你会发现一个空格
我注意到红线处指定了一个名为 api.json 的文件,于是我在浏览器的调试器中打开了 Network 面板,找到了名为 api.json 的标签
您可以在上面的红框中找到原创网页的内容。这是一个简单的 JSON API。一些复杂的 API 将要求您先登录、发送 POST 请求或返回一些更有趣的数据结构。 Python 提供了一个解析 JSON 的库,可以使用语句 json.loads(response.body) 将 JSON 数据转换为 Python 对象
api.py文件的源代码地址:
%2Fproperties%2Fproperties%2Fspiders%2Fapi.py
复制manual.py文件,重命名为api.py,并做如下修改:
start_urls = (
'http://web:9312/properties/api.json',
)
如果需要先登录再获取json api,使用start_request()函数(参考《学习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_d.html" % id # 构建一个每个条目的完整url
yield Request(url, callback=self.parse_item)
上面的js变量是一个列表,每个元素代表一个条目,可以使用scrapy shell工具验证:
scrapy shell http://web:9312/properties/api.json
运行蜘蛛:scrapy crawl api
可以看到总共发送了31个请求,获得了30个项目
看上图用scrapy shell工具检查js变量。其实除了id字段,还可以获取title字段,所以可以同时在parse函数中获取title字段,并将字段的值传递给parse_item函数填充到item中(省略了parse_item函数中使用xpath提取标题的步骤),修改parse函数如下:
title = item["title"]
yield Request(url, meta={"title": title},callback=self.parse_item) #meta变量是一个字典,用于向回调函数传递数据
在parse_item函数中,这个字段可以从响应中提取
l.add_value('title', response.meta['title'],
MapCompose(unicode.strip, unicode.title))