基于python的scrapy爬虫,关于增量爬取是怎么处理的

发布网友 发布时间:2022-04-23 04:04

我来回答

3个回答

热心网友 时间:2022-04-07 10:27

一、增量爬取的思路:即保存上一次状态,本次抓取时与上次比对,如果不在上次的状态中,便视为增量,保存下来。对于scrapy来说,上一次的状态是抓取的特征数据和上次爬取的 request队列(url列表),request队列可以通过request队列可以通过scrapy.core.scheler的pending_requests成员得到,在爬虫启动时导入上次爬取的特征数据,并且用上次request队列的数据作为start url进行爬取,不在上一次状态中的数据便保存。
二、选用BloomFilter原因:对爬虫爬取数据的保存有多种形式,可以是数据库,可以是磁盘文件等,不管是数据库,还是磁盘文件,进行扫描和存储都有很大的时间和空间上的开销,为了从时间和空间上提升性能,故选用BloomFilter作为上一次爬取数据的保存。保存的特征数据可以是数据的某几项,即监控这几项数据,一旦这几项数据有变化,便视为增量持久化下来,根据增量的规则可以对保存的状态数据进行约束。比如:可以选网页更新的时间,索引次数或是网页的实际内容,cookie的更新等

热心网友 时间:2022-04-07 11:45


提供几个思路:

如果只是一次性的抓取某个网站的全部内容, 中途需要暂停并且恢复,只需要scrapy crawl somespider -s JOBDIR=crawls/somespider-1

如果需求是过滤某些url,但是网站的主入口不被过滤掉,比如典型的论坛类网站,你只想过滤掉帖子,但是却不想过滤掉板块,你可以定制一下requestSeen


如果使所有网站的动态过滤,比如是不是多了一个新回复,在url上的变化并不能体现出来,搜索引擎采用的是一系列的算法,判断某一个页面的更新时机。个人应用一般不会使用到(其实是自己也不懂,写出来提供一下思路,也许你会呢)。大部分的网页在进入下一级页面的时候都会有一个类似于最后更新时间,最后活动时间等等,可以根据这个来进行判断。

热心网友 时间:2022-04-07 13:19

对于只是读取某几个网站更新内容的爬虫完全没必要在python代码中实现增量的功能,直接在item中增加Url字段。

item['Url'] = response.url

然后在数据端把储存url的column设置成unique。
之后在python代码中捕获数据库commit时返回的异常,忽略掉或者转入log中都可以。
我使用的是SqlAlchemy。我是这么写的

from sqlalchemy.exc import IntegrityError

class XxxPipeline(object):
def process_item(self, item, spider):
#一些session.add()
#........
try:
session.commit()
print 'crawl %s done!' % item['Url']
except IntegrityError:
print 'skip %s .' % item['Url']
return item

虽然每次crawl都会重复抓取一些数据,但最终结果库内不会有相同的Url。
对于小规模的爬虫,这种重复抓取的成本基本可以忽略。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com