爬虫进阶:框架功能升级之增量爬虫 | 爬虫 |《python学习之路》| python 技术论坛-金年会app官方网
增量爬虫
增量爬虫设计原理
增量抓取,意即针对某个站点的数据抓取,当网站的新增数据或者该站点的数据发生了变化后,自动地抓取它新增的或者变化后的数据
实现关闭请求去重
为request对象增加属性filter
# scrapy/http/reqeust.py
'''封装request对象'''
class request(object):
'''请求对象,设置请求信息'''
def __init__(self, url, method='get', headers=none, params=none, data=none, filter=true):
self.url = url # 请求地址
self.method = method # 请求方法
self.headers = headers # 请求头
self.params = params # 请求参数
self.data = data # 请求体
self.filter = filter # 是否进行去重,默认是true
###
- 修改调度器,进行判断
# scrapy_plus/core/scheduler.py
class scheduler(object):
......
def add_request(self, request):
'''添加请求对象'''
# 先判断是否要去重
if request.filter is false:
self.queue.put(request)
logger.info("添加请求成功[%s %s]" % (request.method, request.url))
self.total_request_number = 1 # 统计请求总数
return # 必须return
# 添加请求对象前,先进性去重判断
fp = self._gen_fp(request)
if not self.filter_request(fp, request): # 如果指纹不存在,那么添加该请求
self.queue.put(request)
logger.info("添加请求成功[%s %s]"%(request.method, request.url))
self._filter_container.add_fp(fp) # 添加完请求后,将指纹也记录下来
self.total_request_number = 1 # 统计请求总数
else:
logger.info("发现重复的请求 [%s %s]" % (request.method, request.url))
self.repeat_request_number = 1
......
实现无限发起请求
在start_reqeusts中改成无限循环,并设置对应请求为非去重模式。但由于框架调用start_requests方法时同步,如果设置为死循环后,那么位于之后的爬虫的start_requests方法就不会被调用,因此需要在调用每个爬虫的start_reqeusts时设置为异步的。让程序的主线程在,多个start_reqeusts方法都没执行完毕前,不要进行退出判断,避免退出过早