Python自定义scrapy中间模块避免重复采集的方法_python

本文实例讲述了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
, 重复
, 采集
, 自定义
scrapy模块
scrapy 避免重复爬取、scrapy 采集多个网站、python scrapy、python 爬虫 scrapy、scrapy python3,以便于您获取更多的相关知识。

时间: 2024-09-23 14:18:36

Python自定义scrapy中间模块避免重复采集的方法_python的相关文章

Python使用scrapy抓取网站sitemap信息的方法_python

本文实例讲述了Python使用scrapy抓取网站sitemap信息的方法.分享给大家供大家参考.具体如下: import re from scrapy.spider import BaseSpider from scrapy import log from scrapy.utils.response import body_or_str from scrapy.http import Request from scrapy.selector import HtmlXPathSelector c

在Python中使用glob模块查找文件路径的方法

  这篇文章主要介绍了在Python中使用glob模块查找文件路径的方法,使用模块其中的iglob方法实现起来非常简单,需要的朋友可以参考下 glob模块是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用windows下的文件搜索差不多.查找文件只用到三个匹配符:"*", "?", "[]"."*"匹配0个或多个字符;"?"匹配单个字符;"[]"匹配指定范围内的

JSP使用自定义标签防止表单重复提交的方法_JSP编程

本文实例讲述了JSP使用自定义标签防止表单重复提交的方法.分享给大家供大家参考.具体如下: 1. 编写servelt: package cn.itcast.apsliyuan.web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletReques

使用Python的Scrapy框架编写web爬虫的简单示例_python

 在这个教材中,我们假定你已经安装了Scrapy.假如你没有安装,你可以参考这个安装指南. 我们将会用开放目录项目(dmoz)作为我们例子去抓取. 这个教材将会带你走过下面这几个方面:     创造一个新的Scrapy项目     定义您将提取的Item     编写一个蜘蛛去抓取网站并提取Items.     编写一个Item Pipeline用来存储提出出来的Items Scrapy由Python写成.假如你刚刚接触Python这门语言,你可能想要了解这门语言起,怎么最好的利用这门语言.假如

Python去除列表中重复元素的方法_python

本文实例讲述了Python去除列表中重复元素的方法.分享给大家供大家参考.具体如下: 比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) print l2 还有一种据说速度更快的,没测试过两者的速度差别 l1 = ['b','c','d','b','c','a','a'] l2 = {}.fromkeys(l1).keys() print l2 这两种都有个缺点,祛除重复元素后排序变了: ['a', 'c',

python使用datetime模块计算各种时间间隔的方法_python

本文实例讲述了python使用datetime模块计算各种时间间隔的方法.分享给大家供大家参考.具体分析如下: python中通过datetime模块可以很方便的计算两个时间的差,datetime的时间差单位可以是天.小时.秒,甚至是微秒,下面的代码就演示了datetime模块在计算时间差时的强大功能 # -*- coding: utf-8 -*- #!/usr/bin/env python import datetime #datetime一般的时间计算 d1 = datetime.datet

python使用点操作符访问字典(dict)数据的方法_python

本文实例讲述了python使用点操作符访问字典(dict)数据的方法.分享给大家供大家参考.具体分析如下: 平时访问字典使用类似于:dict['name']的方式,如果能通过dict.name的方式访问会更方便,下面的代码自定义了一个类提供了这种方法. class DottableDict(dict): def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs) self.__dict__ = self de

python使用cStringIO实现临时内存文件访问的方法_python

本文实例讲述了python使用cStringIO实现临时内存文件访问的方法.分享给大家供大家参考.具体分析如下: 如果希望从网络读取文件进行处理,但是又不希望保存文件到硬盘,可以使用cStringIO模块进行处理 res = urllib2.urlopen(pic,timeout=10) f = cStringIO.StringIO(res.read()) f 是一个文件对象, 它和:f = open('c:/1.jpg','rw')  打开的文件一样 可以向操作本地文件一样对内存文件进行读写

python实现在目录中查找指定文件的方法_python

本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 复制代码 代码如下: import os from glob import glob #用到了这个模块 def search_file(pattern, search_path=os.environ['PATH'], pathsep=os.pathsep):     for path in search_path.split(os.pathsep):         for mat