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实现bitmap数据结构详解
Feb 17 Python
Python中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
实例讲解Python中的私有属性
Aug 21 Python
Python下载懒人图库JavaScript特效
May 28 Python
Python中的日期时间处理详解
Nov 17 Python
Python中str.format()详解
Mar 12 Python
Python使用pyodbc访问数据库操作方法详解
Jul 05 Python
Python 做曲线拟合和求积分的方法
Dec 29 Python
Python3 chardet模块查看编码格式的例子
Aug 14 Python
详解字符串在Python内部是如何省内存的
Feb 03 Python
Python3运算符常见用法分析
Feb 14 Python
Python实现http接口自动化测试的示例代码
Oct 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
ThinkPHP表单自动验证实例
2014/10/13 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
js分页代码分享
2014/04/28 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
详解javascript事件冒泡
2016/01/09 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
Vue中"This dependency was not found"问题的解决方法
2018/06/19 Javascript
js实现秒表计时器
2019/12/16 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
python通过colorama模块在控制台输出彩色文字的方法
2015/03/19 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
2018/12/28 Python
python如何实现视频转代码视频
2019/06/17 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
python使用建议与技巧分享(二)
2020/08/17 Python
美国旅游网站:Tours4Fun
2017/02/17 全球购物
小学一年级评语大全
2014/04/22 职场文书
高三学生评语大全
2014/04/25 职场文书
火锅店的活动方案
2014/08/15 职场文书
2014幼儿教师个人工作总结
2014/12/03 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
2016年教育局“我们的节日——端午节”主题活动总结
2016/04/01 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
html5实现点击弹出图片功能
2021/07/16 HTML / CSS