2013-02-27 127 views
3

我爬行搜索结果页面,并在同一页面刮标题和链接信息。作为一个搜索页面,我也有指向下一页的链接,我已经在SgmlLinkExtractor中指定允许。Scrapy - 蜘蛛抓取重复网址

问题的描述,在第一页,我发现第2页第3页和的链接爬行,它完全一样。但是当它抓取第二页时,它又连接到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)我也试图有一个自定义过滤器,我发现在网上的片段,但不从中了解很多。代码如下。访问身份和状态会被捕获,但它不会识别已经爬网的页面。

注:段来自网络复制,我不有这么多的细节,

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) 

我的目的是让蜘蛛本身忽略已经抓取的网页,而不是在被抓取网页列表和匹配每次页面是否被抄送或不与列表匹配。

对此有任何想法请。

+0

你可以发布一些示例网址吗? – Blender 2013-02-27 05:30:24

+0

这是网页我试图抓取,http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=books&rh=i%3Aaps%2Ck%3Abooks和链接我允许的是“allow =(”ref = sr_pg_ *“)”,因此它与第2页和第3页的链接相匹配。有没有办法只选择指定条件的1个链接。让我知道是否需要更多细节。 – Srikanth 2013-02-27 05:36:54

+0

作出一些改变,从scrapy.dupefilter进口RFPDupeFilter 从scrapy.utils.request进口request_fingerprint 添加导入库之后,RFPDupefileter被认定但具有抓取重复过滤器的问题,没有工作。另外,我更正了链接提取器中“唯一”参数的声明,但即使这样也没有帮助重复。 – Srikanth 2013-02-27 08:14:02

回答

1

您没有给出您的Spider的代码示例,但是,可能的话,您在调用Request方法时传递参数dont_filter = True。尝试明确指定Request(dont_filter=False)。这指出蜘蛛他不必重复相同的请求。