基于python的scrapy爬虫,关于增量爬取是怎么处理的
答案:2 悬赏:30 手机版
解决时间 2021-01-29 07:40
- 提问者网友:动次大次蹦擦擦
- 2021-01-28 15:49
基于python的scrapy爬虫,关于增量爬取是怎么处理的
最佳答案
- 五星知识达人网友:撞了怀
- 2021-01-28 17:13
对于只是读取某几个网站更新内容的爬虫完全没必要在python代码中实现增量的功能,直接在item中增加Url字段。
item['Url'] = response.url
然后在数据端把储存url的column设置成unique。
之后在python代码中捕获数据库commit时返回的异常,忽略掉或者转入log中都可以。
网上有说支持增量的,我看了代码+实际测试,还是觉得不是增量的...
我的做法是pipeline的open_spider时读取所有item里面的url,做成一个parsed_urls的list,在rule的process_link中过滤掉这些已经下载的url,如果需要的话可以再item里面加入last_notify属性进一步扩展...
item['Url'] = response.url
然后在数据端把储存url的column设置成unique。
之后在python代码中捕获数据库commit时返回的异常,忽略掉或者转入log中都可以。
网上有说支持增量的,我看了代码+实际测试,还是觉得不是增量的...
我的做法是pipeline的open_spider时读取所有item里面的url,做成一个parsed_urls的list,在rule的process_link中过滤掉这些已经下载的url,如果需要的话可以再item里面加入last_notify属性进一步扩展...
全部回答
- 1楼网友:廢物販賣機
- 2021-01-28 17:55
对于只是读取某几个网站更新内容的爬虫完全没必要在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。
对于小规模的爬虫,这种重复抓取的成本基本可以忽略。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯