2017-01-30 3 views
1

Ich baue einen Schaber, um verschiedene Links mit scrapy zu kratzen. Scrapy kratzt die Links von der ersten Seite. Obwohl GET Anfragen von verschiedenen URLs sind, ist response.url immer die gleiche, die bewirkt, dass die gleiche Seite geschabt wird. Ich glaube nicht, dass es irgendwelche Umleitungen gibt, weil Links nicht in normalen Browsern umgeleitet werden. Ich habe auch eine zufällige DELAY_INTERVAL sowie rotierende Benutzer-Agenten mit this festgelegt. Hier ist meine Analyse Funktion:Scrapy kratzt Start-Seite trotz anderer Anfrage erhalten URL

def parse(self,response): 
     scraped_data = response.xpath("*//h3/a/@href").extract()   
     if self.urls is not None:    #urls has all the different links to be crawled. 
      yield scrapy.Request(urls[self.k],callback=self.parse,dont_filter=True) 
      self.k = self.k + 1 
     else: 
      yield self.logger.info("next page unavailable|LIMIT REACHED") 

Wie komme ich über diese doppelte Kratzen?

+0

Können Sie mehr von Ihrem Spider-Code und einige Protokolle (mit LOG_LEVEL = 'DEBUG'), die doppelte URLs abrufen, bereitstellen? Sie können auch eine Anweisung 'self.logger.debug (urls [self.k]) 'vor' yield scrapy.Request 'hinzufügen, um sicherzugehen, dass Sie tatsächlich die gewünschten Anfragen in die Warteschlange stellen. –

Antwort

0

ist Ihre Schleife hier fehlerhaft und Sie haben eine Reihe von nicht definierten Variablen:

def parse(self,response): 
    links = response.xpath("*//h3/a/@href").extract()  
    if urls is not None: # urls is not even defined 
     yield scrapy.Request(url[k],callback=self.parse,dont_filter=True) 
     k = k + 1 # k is not defined either 
    else: 
     yield self.logger.info("next page unavailable|LIMIT REACHED") 

so etwas wie dieses stattdessen versuchen:

def parse(self,response): 
    links = response.xpath("*//h3/a/@href").extract()  
    for link in links: 
     yield scrapy.Request(link, callback=self.parse) 
    if not links: 
     yield self.logger.info("next page unavailable|LIMIT REACHED") 

Auch sollten Sie dont_filter Flagge vermeiden, wenn Sie Duplikate vermeiden möchten .

+0

Ich entschuldige mich hier, Urls und k sind Instanzvariablen. Der Einfachheit halber hatte ich ihre Details übersprungen. Ich habe die ursprüngliche Frage bearbeitet. Wenn ich dont_filter meide, erhalte ich nur ein Ergebnis, weil die Antwort-URLs immer gleich sind, obwohl die URL unterschiedlich ist. – CodeFanatic23