Python自定义scrapy中间模块避免重复采集的方法

作者:pythoner 时间:2022-02-19 13:32:44 

本文实例讲述了Python自定义scrapy中间模块避免重复采集的方法。分享给大家供大家参考。具体如下:


from scrapy import log
from scrapy.http import Request
from scrapy.item import BaseItem
from scrapy.utils.request import request_fingerprint
from myproject.items import MyItem
class IgnoreVisitedItems(object):
 """Middleware to ignore re-visiting item pages if they
 were already visited before.
 The requests to be filtered by have a meta['filter_visited']
 flag enabled and optionally define an id to use
 for identifying them, which defaults the request fingerprint,
 although you'd want to use the item id,
 if you already have it beforehand to make it more robust.
 """
 FILTER_VISITED = 'filter_visited'
 VISITED_ID = 'visited_id'
 CONTEXT_KEY = 'visited_ids'
 def process_spider_output(self, response, result, spider):
   context = getattr(spider, 'context', {})
   visited_ids = context.setdefault(self.CONTEXT_KEY, {})
   ret = []
   for x in result:
     visited = False
     if isinstance(x, Request):
       if self.FILTER_VISITED in x.meta:
         visit_id = self._visited_id(x)
         if visit_id in visited_ids:
           log.msg("Ignoring already visited: %s" % x.url,
               level=log.INFO, spider=spider)
           visited = True
     elif isinstance(x, BaseItem):
       visit_id = self._visited_id(response.request)
       if visit_id:
         visited_ids[visit_id] = True
         x['visit_id'] = visit_id
         x['visit_status'] = 'new'
     if visited:
       ret.append(MyItem(visit_id=visit_id, visit_status='old'))
     else:
       ret.append(x)
   return ret
 def _visited_id(self, request):
   return request.meta.get(self.VISITED_ID) or request_fingerprint(request)

希望本文所述对大家的Python程序设计有所帮助。

标签:Python,scrapy,采集
0
投稿

猜你喜欢

  • asp测字符串长度及截取定长字符串汉字的处理

    2007-10-12 13:14:00
  • 关于基于字体大小(em)的设计

    2008-06-17 15:01:00
  • Pytorch提取模型特征向量保存至csv的例子

    2022-09-28 00:41:17
  • 关于Python网络爬虫框架scrapy

    2023-03-17 17:02:50
  • python 实现手机自动拨打电话的方法(通话压力测试)

    2021-03-19 08:10:34
  • python实现超级玛丽游戏

    2023-10-02 20:19:28
  • python+tkinter编写电脑桌面放大镜程序实例代码

    2023-08-02 17:10:43
  • Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法

    2022-11-16 20:48:41
  • python遍历文件目录、批量处理同类文件

    2021-10-19 14:58:12
  • python监控网卡流量并使用graphite绘图的示例

    2022-06-24 22:35:54
  • 一个修改Oracle数据库用户密码的小诀窍

    2009-09-30 15:29:00
  • matplotlib之pyplot模块坐标轴范围设置(autoscale(),xlim(),ylim())

    2022-03-15 09:01:16
  • Python requests HTTP验证登录实现流程

    2021-02-27 16:43:04
  • python实现数值积分的Simpson方法实例分析

    2023-08-01 17:35:01
  • 如何利用Python实现简易的音频播放器

    2022-07-16 11:47:32
  • python实现手机通讯录搜索功能

    2023-11-04 08:04:08
  • Python学习之不同数据类型间的转换总结

    2021-10-04 06:06:57
  • python使用socket进行简单网络连接的方法

    2021-05-16 22:53:03
  • SQL提供的进行数据传输的实用程序—BCP

    2009-01-23 13:45:00
  • Python3中urlopen()的用法解读

    2023-11-22 20:26:19
  • asp之家 网络编程 m.aspxhome.com