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中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
linux系统使用python获取cpu信息脚本分享
Jan 15 Python
Python格式化压缩后的JS文件的方法
Mar 05 Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 Python
Python2.7简单连接与操作MySQL的方法
Apr 27 Python
python删除文本中行数标签的方法
May 31 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
对python自动生成接口测试的示例讲解
Nov 30 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 Python
python实现任意位置文件分割的实例
Dec 14 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 Python
python热力图实现的完整实例
Jun 25 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安全配置
2006/10/09 PHP
PHP中overload与override的区别
2017/02/13 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
服务端 VBScript 与 JScript 几个相同特性的写法 By shawl.qiu
2007/03/06 Javascript
javascript 网页跳转的方法
2008/12/24 Javascript
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
JQuery记住用户名和密码的具体实现
2014/04/04 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
[01:29:46]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第二局
2016/02/27 DOTA
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
python中的内置函数getattr()介绍及示例
2014/07/20 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
如何完美的建立一个python项目
2020/10/09 Python
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
煤矿班组长的职责
2013/12/25 职场文书
法学专业求职信
2014/07/15 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
优质服务标语口号
2015/12/26 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL