Python Scrapy-Spider爬行重复的URL

Python Scrapy-Spider爬行重复的URL,python,scrapy,web-crawler,Python,Scrapy,Web Crawler,我正在搜索一个搜索结果页面,并从同一页面上抓取标题和链接信息。由于它是一个搜索页面,我也有到下一个页面的链接,这是我在SGMLLinkedExtractor中指定允许的 问题的描述是,在第1页中,我找到了要爬网的第2页和第3页的链接,它做得很好。但当它是爬行第二页时,它又有到第1页(上一页)和第3页(下一页)的链接。因此,它再次爬行第1页,引用者为第2页,并进入循环 我使用的刮擦版是0.17 我在网上搜索了答案,并尝试了以下方法:, (一) 但unique命令未标识为有效参数 (二) 我已尝试在

我正在搜索一个搜索结果页面,并从同一页面上抓取标题和链接信息。由于它是一个搜索页面,我也有到下一个页面的链接,这是我在SGMLLinkedExtractor中指定允许的

问题的描述是,在第1页中,我找到了要爬网的第2页和第3页的链接,它做得很好。但当它是爬行第二页时,它又有到第1页(上一页)和第3页(下一页)的链接。因此,它再次爬行第1页,引用者为第2页,并进入循环

我使用的刮擦版是0.17

我在网上搜索了答案,并尝试了以下方法:, (一)

但unique命令未标识为有效参数

(二) 我已尝试在设置中将默认过滤器指定为DUPEFILTER\u CLASS=RFPDupeFilter

    DUPEFILTER_CLASS = RFPDupeFilter
NameError: name 'RFPDupeFilter' is not defined
3) 我还尝试了一个自定义过滤器,我在web中找到了这个代码段,但对它了解不多。代码如下。访问id和状态已被捕获,但它无法识别已爬网的页面

注意:这个片段是从网上复制的,我没有太多的细节

from scrapy import log
from scrapy.http import Request
from scrapy.item import BaseItem
from scrapy.utils.request import request_fingerprint
from Amaze.items import AmazeItem

class IgnoreVisitedItems(object):
    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)
我的意图是让爬行器本身忽略已经爬网的网页,而不是将爬网的网页放在列表中,并在每次页面被爬网或未被爬网时与列表匹配


请对此有任何想法。

您没有收到Spider的代码示例,但是,在调用
请求
方法时,您可能会传递参数
dont\u filter=True
。尝试显式指定
请求(dont\u filter=False)
。这向Spider指出,他不必重复相同的请求。

你能发布一些示例URL吗?这是我试图抓取的页面,我允许的链接是“allow=(“ref=sr\u pg\u*”),因此它与第2页和第3页的链接相匹配。有没有办法只选择指定条件中的一个链接。如果需要更多详细信息,请与我联系。在进行一些更改以从scrapy.dupefilter添加导入库后,从scrapy.utils.request import request\u指纹导入RFPDupeFilter,RFPDupeFilter已识别,但爬网重复筛选器的问题不起作用。此外,我还更正了linkextractor中“unique”参数的声明,但即使tht也不能帮助处理重复项。
from scrapy import log
from scrapy.http import Request
from scrapy.item import BaseItem
from scrapy.utils.request import request_fingerprint
from Amaze.items import AmazeItem

class IgnoreVisitedItems(object):
    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)