爬虫进阶:框架功能升级之增量爬虫
增量爬虫#
增量爬虫设计原理#
增量抓取,意即针对某个站点的数据抓取,当网站的新增数据或者该站点的数据发生了变化后,自动地抓取它新增的或者变化后的数据
实现关闭请求去重#
为 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("添加请求成功<disable去重>[%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 方法都没执行完毕前,不要进行退出判断,避免退出过早
推荐文章: