蜘蛛爬重复的网址

2024-05-03 20:18:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我用的是0.17。在

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

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

但是unique命令没有被标识为有效参数。在

(二) 我试图在设置中指定默认筛选器为DUPEFILTER_CLASS=RFPDupeFilter

^{pr2}$

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)

我的目的是让爬行器本身忽略已经爬网的网页,而不是让爬行的网页在一个列表中,并在每次页面被crawed或不与列表匹配时进行匹配。在

有什么想法吗。在


Tags: fromimportselfidtrueidsif链接
1条回答
网友
1楼 · 发布于 2024-05-03 20:18:12

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

相关问题 更多 >