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 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
python 中random模块的常用方法总结
Jul 08 Python
Python语言描述最大连续子序列和
Dec 05 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
selenium+PhantomJS爬取豆瓣读书
Aug 26 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
解决python 执行sql语句时所传参数含有单引号的问题
Jun 06 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 Python
python 批量下载bilibili视频的gui程序
Nov 20 Python
python xlsxwriter模块的使用
Dec 24 Python
用python 绘制茎叶图和复合饼图
Feb 26 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 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
锋利的jQuery jQuery中的DOM操作
2010/03/21 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
JavaScript位移运算符(无符号) >>> 三个大于号 的使用方法详解
2016/03/31 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
jQuery中将json数据显示到页面表格的方法
2018/05/27 jQuery
Vue实现本地购物车功能
2018/12/05 Javascript
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
Python实现partial改变方法默认参数
2014/08/18 Python
web.py在模板中输出美元符号的方法
2014/08/26 Python
Python random模块常用方法
2014/11/03 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
Python实时获取cmd的输出
2015/12/13 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
2015年工商所工作总结
2015/05/21 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
php+laravel 扫码二维码签到功能
2021/05/15 PHP