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实现屏幕截图的两种方式
Feb 05 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
python os模块简单应用示例
May 23 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
Python实现TCP通信的示例代码
Sep 09 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
Dec 11 Python
基于python3生成标签云代码解析
Feb 18 Python
python实现在线翻译
Jun 18 Python
python中plt.imshow与cv2.imshow显示颜色问题
Jul 16 Python
Python tempfile模块生成临时文件和临时目录
Sep 30 Python
浅析Python OpenCV三种滤镜效果
Apr 11 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 Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
js实现文本框输入文字个数限制代码
2015/12/25 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
在vue-cli中组件通信的方法
2017/12/16 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
python将图片文件转换成base64编码的方法
2015/03/14 Python
浅谈Python中数据解析
2015/05/05 Python
Python中的推导式使用详解
2015/06/03 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
python Gabor滤波器讲解
2020/10/26 Python
印度服装购物网站:Limeroad
2018/09/26 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
水毁工程实施方案
2014/04/01 职场文书
房产买卖委托公证书
2014/04/04 职场文书
商业用房租赁协议书
2014/10/13 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
2019年大学推荐信
2019/06/24 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL