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 Trie树实现字典排序
Mar 28 Python
跟老齐学Python之正规地说一句话
Sep 28 Python
python中string模块各属性以及函数的用法介绍
May 30 Python
Django视图之ORM数据库查询操作API的实例
Oct 27 Python
python re模块findall()函数实例解析
Jan 19 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
对python append 与浅拷贝的实例讲解
May 04 Python
浅谈python新式类和旧式类区别
Apr 26 Python
Python计算一个点到所有点的欧式距离实现方法
Jul 04 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
关于pytorch中全连接神经网络搭建两种模式详解
Jan 14 Python
Python reversed反转序列并生成可迭代对象
Oct 22 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
利用PHP制作简单的内容采集器的原理分析
2008/10/01 PHP
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
php session的应用详细介绍
2017/03/22 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
js评分组件使用详解
2017/06/06 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
使用tensorflow实现线性svm
2018/09/07 Python
Python3几个常见问题的处理方法
2019/02/26 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
Django-xadmin+rule对象级权限的实现方式
2020/03/30 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
送给他或她的礼物:FUN.com
2018/08/17 全球购物
自我评价200字分享
2013/12/17 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
网吧消防安全制度
2014/01/28 职场文书
干部作风建设工作总结
2014/10/29 职场文书
三峡导游词
2015/01/31 职场文书
DE1107机评
2022/04/05 无线电