2017-10-14 103 views
0

以下链接访问我使用刮域的所有URL代码:刮递归使用Scrapy

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor 

class UrlsSpider(scrapy.Spider): 
    name = 'urlsspider' 
    allowed_domains = ['example.com'] 
    start_urls = ['http://example.com/'] 

    rules = (Rule(LxmlLinkExtractor(allow=(), unique=True), callback='parse', follow=True)) 

    def parse(self, response): 
     for link in LxmlLinkExtractor(allow_domains=self.allowed_domains, unique=True).extract_links(response): 
      print link.url 

      yield scrapy.Request(link.url, callback=self.parse) 

正如你可以看到,我用unique=True但它仍然重复打印在终端的网址,而我只想要独特的网址,而不是重复的网址。

任何有关此事的帮助都会非常有帮助。

+0

Scrapy默认使用'scrapy.dupefilters.RFPDupeFilter'来检测和过滤重复的请求。也就是说,你可能在日志输出中多次看到一个URL,但这些只会被命中一次(除非你将'dont_filter'设置为True)。我建议创建一个'Link'项并使用像这样的管道:https://doc.scrapy.org/en/latest/topics/item-pipeline.html?highlight=item%20duplicate#duplicates-filter –

回答

0

由于代码以递归方式查看URL的内容,因此您将在解析其他页面时看到重复的URL。你基本上有多个LxmlLinkExtractor()实例。