当前位置: 首页 > 编程笔记 >

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

卫骏
2023-03-14
本文向大家介绍Python自定义scrapy中间模块避免重复采集的方法,包括了Python自定义scrapy中间模块避免重复采集的方法的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了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 import自定义模块方法,包括了Python import自定义模块方法的使用技巧和注意事项,需要的朋友参考一下 python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。 下面将具体介绍几种常用情况: (1)主程序与模块程序在同一目录下: 如下面程序结构:     若在程序test1.py中导入模块mod1, 则直接使用im

  • 问题内容: 我在一个项目中工作,在该项目中,我们有多个域类来对业务数据进行建模。这些类是简单的POJO,我必须使用它们显示几个表。例如,考虑此类: 然后,我创建了自己的表模型,该表模型从AbstractTableModel扩展,以便直接与类一起使用: 到目前为止,一切都很好。但是,此方法至少有两个问题: 由于我必须为每个类实现一个表模型,因此我将生成大量重复代码以实质上完成三件事:定义适当的表头,

  • 主要内容:自定义模块编写说明文档到目前为止,读者已经掌握了导入 Python 标准库并使用其成员(主要是函数)的方法,接下来要解决的问题是,怎样自定义一个模块呢? 前面章节中讲过,Python 模块就是 Python 程序,换句话说,只要是 Python 程序,都可以作为模块导入。例如,下面定义了一个简单的模块(编写在 demo.py 文件中): 可以看到,我们在 demo.py 文件中放置了变量(name 和 add)、函数(

  • 日志采集配置 在应用详情页中间有一个叫作“日志采集”的模块 点击右边的“添加”按钮,在弹出的对话框中选择日志的路径及正则规则 文件路径:你日志文件的位置 日志规则:如果没有特殊需求的话默认就好 提交后服务会自动重启动。 日志采集 如果配置了上面采集器,那么它会向服务所在的Pod注入一个Filebeat采集器对应用服务的业务日志进行采集。把采集到的日志入到kafka集群,然后logstash进行消息

  • 创建表(int(10)不为空AUTO_INCREMENT,int(30),varchar(30),varchar(4)不为空,int(2)不为空,主键()); 创建表(varchar(10),主键()); 创建表(int(10),int(30),varchar(30),varchar(4),int(2), varchar(10), varchar(2)not null默认'p'); 分隔符$$ 为

  • 问题 你在类中需要重复的定义一些执行相同逻辑的属性方法,比如进行类型检查,怎样去简化这些重复代码呢? 解决方案 考虑下一个简单的类,它的属性由属性方法包装: class Person: def __init__(self, name ,age): self.name = name self.age = age @property def n