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 05 Python
深入浅出分析Python装饰器用法
Jul 28 Python
基于python实现简单日历
Jul 28 Python
Python常见内置高效率函数用法示例
Jul 31 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
python3中eval函数用法使用简介
Aug 02 Python
python word转pdf代码实例
Aug 16 Python
python 字典的打印实现
Sep 26 Python
使用Python生成200个激活码的实现方法
Nov 22 Python
Python基于requests实现模拟上传文件
Apr 21 Python
基于python实现百度语音识别和图灵对话
Nov 02 Python
基于python爬取梨视频实现过程解析
Nov 09 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判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
在vs2010中调试javascript代码方法
2011/02/11 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
基于jquery实现下拉框美化特效
2016/02/02 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
python基础知识小结之集合
2015/11/25 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
python求最大连续子数组的和
2018/07/07 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
2019/08/16 Python
django实现用户注册实例讲解
2019/10/30 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
高一地理教学反思
2014/01/18 职场文书
旷课检讨书大全
2014/01/21 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
安全责任书范本
2014/04/15 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
教师考核评语大全
2014/12/31 职场文书
思想政治表现评语
2015/01/04 职场文书
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle