Scrapy - 蜘蛛抓取重复的网址

2023-12-13

我正在抓取搜索结果页面并从同一页面抓取标题和链接信息。作为一个搜索页面,我也有到下一页的链接,我已在 SgmlLinkExtractor 中指定允许这些链接。

问题的描述是,在第1页中,我找到了Page2和Page3的链接进行爬行,并且效果很好。但是当它爬行第二页时,它再次具有指向Page1(上一页)和Page3(下一页)的链接。因此它再次抓取 Page1,并将引用者作为 Page2 并进入循环。

scrapy版本,我用的是0.17。

我通过网络搜索答案并尝试了以下方法, 1)

Rule(SgmlLinkExtractor(allow=("ref=sr_pg_*")), callback="parse_items_1", unique= True, follow= True),

但该唯一命令未被识别为有效参数。

2) 我尝试在设置中将默认过滤器指定为 DUPEFILTER_CLASS = RFPDupeFilter

    DUPEFILTER_CLASS = RFPDupeFilter
NameError: name 'RFPDupeFilter' is not defined

3)我还尝试过使用自定义过滤器,我在网络中找到了该片段,但从中了解不多。代码如下。访问 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_filter = True,调用时Request方法。尝试明确指定Request(dont_filter=False)。这向蜘蛛表明他不必重复相同的请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scrapy - 蜘蛛抓取重复的网址 的相关文章

随机推荐