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


Posted in Python onApril 07, 2015

本文实例讲述了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中MYSQLdb出现乱码的解决方法
Oct 11 Python
python实现Adapter模式实例代码
Feb 09 Python
在Windows中设置Python环境变量的实例讲解
Apr 28 Python
python 巧用正则寻找字符串中的特定字符的位置方法
May 02 Python
dataframe 按条件替换某一列中的值方法
Jan 29 Python
Python叠加两幅栅格图像的实现方法
Jul 05 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
深入学习python多线程与GIL
Aug 26 Python
Python常用库Numpy进行矩阵运算详解
Jul 21 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
Sep 16 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 #Python
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 #Python
Python中使用pprint函数进行格式化输出的教程
Apr 07 #Python
利用QT写一个极简单的图形化Python闹钟程序
Apr 07 #Python
分析Python编程时利用wxPython来支持多线程的方法
Apr 07 #Python
Python中尝试多线程编程的一个简明例子
Apr 07 #Python
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 #Python
You might like
php的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
php实现rc4加密算法代码
2012/04/25 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
学习PHP session的传递方式
2016/06/15 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
看了就知道什么是JSON
2007/12/09 Javascript
jquery 将disabled的元素置为enabled的三种方法
2009/07/25 Javascript
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
告诉你什么是javascript的回调函数
2014/09/04 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
Jquery的Ajax技术使用方法
2019/01/21 jQuery
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
[37:47]IG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
使用Python实现音频双通道分离
2020/12/25 Python
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
如何在C# winform中异步调用web services
2015/09/21 面试题
关于安全的演讲稿
2014/05/09 职场文书
离婚协议书范文2014
2014/10/16 职场文书
何玥事迹观后感
2015/06/16 职场文书