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中使用全局日志时需要注意的问题
May 06 Python
利用Python如何生成随机密码
Apr 20 Python
Python中matplotlib中文乱码解决办法
May 12 Python
win10下Python3.6安装、配置以及pip安装包教程
Oct 01 Python
python Crypto模块的安装与使用方法
Dec 21 Python
python 把文件中的每一行以数组的元素放入数组中的方法
Apr 29 Python
python安装pil库方法及代码
Jun 25 Python
使用pyecharts生成Echarts网页的实例
Aug 12 Python
python实现数字炸弹游戏
Jul 17 Python
python实现简单遗传算法
Sep 18 Python
Python如何使用ElementTree解析xml
Oct 12 Python
基于Python实现全自动下载抖音视频
Nov 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将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
laravel学习教程之关联模型
2016/07/30 PHP
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
vue的token刷新处理的方法
2018/07/17 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
python实现泊松图像融合
2018/07/26 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
python图形用户接口实例详解
2019/12/16 Python
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
庆七一活动总结
2014/08/27 职场文书
十佳党员事迹材料
2014/08/28 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
茶花女读书笔记
2015/06/29 职场文书
Python自动化爬取天眼查数据的实现
2021/06/15 Python