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

 更新时间:2015年04月07日 16:36:56   作者:pythoner  
这篇文章主要介绍了Python自定义scrapy中间模块避免重复采集的方法,实例分析了Python实现采集的技巧,非常具有实用价值,需要的朋友可以参考下

本文实例讲述了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 由字符串函数名得到对应的函数(实例讲解)

    Python 由字符串函数名得到对应的函数(实例讲解)

    下面小编就为大家带来一篇Python 由字符串函数名得到对应的函数(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 深入剖析Python的列表和元组

    深入剖析Python的列表和元组

    这篇文章主要介绍了深入剖析Python的列表和元组,Python有4个内建的数据结构,它们可以统称为容器,因为它们实际上是一些“东西”组合而成的结构,而这些“东西”,可以是数字、字符甚至列表,或是它们的组合,需要的朋友可以参考下
    2023-07-07
  • 使用Python从有道词典网页获取单词翻译

    使用Python从有道词典网页获取单词翻译

    这篇文章主要介绍了使用Python从有道词典网页获取单词翻译的相关资料,需要的朋友可以参考下
    2016-07-07
  • 深入了解Python中计数器Counter的使用

    深入了解Python中计数器Counter的使用

    计数器counter是包含在collections模块中的容器,这篇文章主要来和大家聊聊计数器counter的使用,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-09-09
  • Python学习笔记嵌套循环详解

    Python学习笔记嵌套循环详解

    这篇文章主要介绍了Python学习笔记嵌套循环详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • Python爬虫框架Scrapy常用命令总结

    Python爬虫框架Scrapy常用命令总结

    这篇文章主要介绍了Python爬虫框架Scrapy常用命令,结合实例形式总结分析了Scrapy框架中常见的全局命令与项目命令功能、使用方法及操作注意事项,需要的朋友可以参考下
    2018-07-07
  • Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))

    Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))

    这篇文章主要介绍了Pycharm使用远程linux服务器conda/python环境在本地运行的方法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Python-numpy实现灰度图像的分块和合并方式

    Python-numpy实现灰度图像的分块和合并方式

    今天小编就为大家分享一篇Python-numpy实现灰度图像的分块和合并方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 25个值得收藏的Python文本处理案例

    25个值得收藏的Python文本处理案例

    这篇文章主要给大家分享的是25个值得收藏的Python文本处理案例。Python 处理文本是一项非常常见的功能,本文整理了多种文本提取及NLP相关的案例,还是非常有收藏价值的,文章很长,可以收藏起来,总会用到的
    2022-02-02
  • python3 读写文件换行符的方法

    python3 读写文件换行符的方法

    下面小编就为大家分享一篇python3 读写文件换行符的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04

最新评论