2017-10-14 4 views
0

Hier verwendet, ist der Code, den ich zum Schaben alle Urls einer Domain bin mit:eine Domäne für Links Scraping rekursiv 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) 

Wie Sie sehen können, dass ich unique=True verwendet habe, aber es ist immer noch doppelte Druck URLs im Terminal, während ich nur die eindeutigen URLs und nicht doppelte URLs möchte.

Jede Hilfe zu diesem Thema wird sehr hilfreich sein.

+0

Scrapy verwendet standardmäßig 'scrapy.dupefilters.RFPDupeFilter', um doppelte Anfragen zu erkennen und zu filtern. Das heißt, Sie können eine URL mehrmals in der Protokollausgabe sehen, aber diese wird nur einmal getroffen (es sei denn, Sie setzen 'dont_filter' auf True). Ich würde vorschlagen, ein "Link" -Element zu erstellen und eine Pipeline wie diese zu verwenden: https://doc.scrapy.org/en/latest/topics/item-pipeline.html?highlight=item%20duplicate#duplicates-filter –

Antwort

0

Da der Code den Inhalt der URLs rekursiv betrachtet, sehen Sie die doppelten URLs beim Parsen anderer Seiten. Sie haben im Wesentlichen mehrere Instanzen von LxmlLinkExtractor().