爬虫进阶:框架功能升级之增量爬虫

未匹配的标注

增量爬虫

增量爬虫设计原理

增量抓取,意即针对某个站点的数据抓取,当网站的新增数据或者该站点的数据发生了变化后,自动地抓取它新增的或者变化后的数据

实现关闭请求去重

为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

###

  1. 修改调度器,进行判断
# 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方法都没执行完毕前,不要进行退出判断,避免退出过早

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~