2016-12-14 2 views
1

Hallo Ich habe diesen Scrapy-Code unten (ich habe viele if-Schleifen gelöscht und vereinfacht es leicht verständlich). Das Problem ist dieses scrapy, scabs nur die erste Seite der Website. Ich habe herausgefunden, dass hte scrapy.request die neue URL nicht bekommt, und im Element ['url'] wird immer nur die Basis-URL angehängt und daher heruntergeladen.Scrapy.request bekommt nicht die neue URL

import scrapy 
from collections import Counter 
from scrapy.selector import Selector 
from Mycode.items import * 

class ExampleSpider(scrapy.Spider): 
    name = "full_sites" 
    def __init__(self, site=None, *args, **kwargs): 
     super(ExampleSpider, self).__init__(*args, **kwargs) 
     self.start_urls = [site] 
     self.base_url = site 
     self._site = site 
     self.allowed_domains = [self._site] 

    def parse(self, response): 
     for i in response.xpath('//a/@href').extract(): 
      print '================' 
      print 'i entered=', i 
      url = self.base_url + i 
      print url, 'go to scrapy' 
      yield scrapy.Request(url= url, callback=self.parse) 

      item = FullSitesItem() 
      item['url'] = response.url 
      print 'item=', item['url'] 
      yield item 

bekomme ich diese Ausgänge auf meinem Monitor:

================ 
i entered= /service 
http://webscraper.io/service go to scrapy 
item= http://webscraper.io 
================ 
i entered= /sitemap-specialist 
http://webscraper.io/sitemap-specialist go to scrapy 
item= http://webscraper.io 
================ 
i entered= /screenshots 
http://webscraper.io/screenshots go to scrapy 
item= http://webscraper.io 
================ 

so unabhängig von der URL zu scrapy.Requests geben, das Element [ 'url'] ist das gleiche! Wie kann ich dieses Problem beheben?

dank

Antwort

1

Du Schleifen über i so response.url wird immer das gleiche Ergebnis zurück.

Sie können Ihre parse Methode wie folgt halten:

def parse(self, response): 
    for i in response.xpath('//a/@href').extract(): 
     print '================' 
     print 'i entered=', i 
     url = self.base_url + i 
     print url, 'go to scrapy' 
     yield scrapy.Request(url= url, callback=self.parse) 

Dies wird die Haupt-Seite behandeln.

Erstellen Sie eine andere Analyse-Methode, um die anderen Seiten zu behandeln, und wechseln Sie callback=self.parse zu der neuen Methode.

+0

danke für die Antwort. Was meinst du mit "neuer Methode"? Du meinst eine andere Funktion? – nakisa

+0

Ja, erstellen Sie eine andere Analysefunktion. –

+0

Danke für die Hilfe. – nakisa

Verwandte Themen