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中mechanize库的简单使用示例
Jan 10 Python
python实现查找两个字符串中相同字符并输出的方法
Jul 11 Python
Python六大开源框架对比
Oct 19 Python
Python使用filetype精确判断文件类型
Jul 02 Python
Windows下Anaconda2安装NLTK教程
Sep 19 Python
python 定义n个变量方法 (变量声明自动化)
Nov 10 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
Jul 23 Python
opencv之颜色过滤只留下图片中的红色区域操作
Jun 05 Python
使用tensorflow进行音乐类型的分类
Aug 14 Python
python利用pandas分析学生期末成绩实例代码
Jul 09 Python
Python如何让字典保持有序排列
Apr 29 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
【COS正片】蕾姆睡衣cos,纯洁可爱被治愈了 cn名濑弥七
2020/03/02 日漫
国外比较好的几个的Php开源建站平台小结
2010/04/22 PHP
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
php生成无限栏目树
2017/03/16 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
js 操作select相关方法函数
2009/12/06 Javascript
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
原生JS实现$.param() 函数的方法
2018/08/10 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
python中返回矩阵的行列方法
2018/04/04 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
python Timer 类使用介绍
2020/12/28 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
教师反腐倡廉演讲稿
2014/09/03 职场文书
营业员岗位职责范本
2015/04/14 职场文书
个人原因辞职信模板
2015/05/13 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js