情景:传统的爬虫只需要设置fetch_type=js
即可,因为可以获取到整个页面。但是现在ajax应用越来越广泛,所以有的网页不能用此种爬虫类型来获取页面的数据,只能用slef.crawl()
来发起http请求来抓取数据。
直接上例子:
可以看到,该网页的每一页的数据是通过ajax请求获取到的,方式为POST
,所以不能用传统方法。
可以看到该请求的请求体
,我们需要把请求体和请求方法写到crawl函数的参数里。
直接上代码:
# coding: utf-8
from pyspider.libs.base_handler import *
class Handler(BaseHandler):
@every(minutes=10)
def on_start(self):
data = {
'channelid': 229105,
'sortfield': '-docorderpri,-docreltime',
'classsql': 'chnlid=40078',
'classcol': 'publishyear',
'classnum': 100,
'classsort': 0,
'cache': 'true',
'page': 1,
'prepage': 75,
}
save = {
'req_body':data
}
# method指定POST,data指定请求体,save保存一些自定义字段。
self.crawl('http://yjt.fujian.gov.cn/fjdzapp/search', callback=self.index_page, method="POST", data=data, save=save)
# 抓取请求的响应数据后会调用此接口
@config(age=10*60)
def index_page(self, response):
print(response.save['req_body']) # 查看请求体
print(response.json) # 获取所抓到的数据
return response.json
def on_result(self, result):
# 处理结果 ...
请求体和响应如下:
需要注意的地方
可以看到,字典的字段都是u'...'
,这表明是Unicode
编码,所以想要获取字典中的字段,需要做下面的处理:
response字典中有个recordCount
的key,我想获取他的值,需要将其先按照utf-8的编码方式解码为Unicode(python2默认Unicode编码,但是我们的脚本是utf-8的编码方式),这样就可以获取到字典的值啦
recordCount = response.json.get('recordCount'.decode('utf-8'))