Scrapy - 蜘蛛抓取重复网址(Scrapy - Spider crawls duplicat

2019-07-20 14:27发布

我爬行搜索结果页面,并在同一页面刮标题和链接信息。 作为其搜索页面,我有链接到下一个页面为好,这是我在SgmlLinkExtractor指定允许。

问题的描述,在第一页,我发现第2页第3页和的链接爬行,它完全一样。 但是,当它是爬第2页,它再次包含到第1页(接上页)和第3页(下页)。 所以重新检索第1页使用推荐的第二页及其循环下去。

该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)

我的目的是让蜘蛛本身忽略已经抓取的网页,而不是在列表中抓取网页的每一个页面cralwed与否与列表匹配的时间。

任何对此的思考吧。

Answer 1:

你是不是给你的蜘蛛的代码示例,但是,可能的话,你传递参数dont_filter = True ,当调用Request的方法。 尽量明确指定Request(dont_filter=False) 这指出了蜘蛛,他不必须重复相同的请求。



文章来源: Scrapy - Spider crawls duplicate urls