2012-05-29 2 views
8

sotto è il mio codice di ragno,La combinazione di URL di base con href conseguente Scrapy

class Blurb2Spider(BaseSpider): 
    name = "blurb2" 
    allowed_domains = ["www.domain.com"] 

    def start_requests(self): 
      yield self.make_requests_from_url("http://www.domain.com/bookstore/new") 


    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     urls = hxs.select('//div[@class="bookListingBookTitle"]/a/@href').extract() 
     for i in urls: 
      yield Request(urlparse.urljoin('www.domain.com/', i[1:]),callback=self.parse_url) 


    def parse_url(self, response): 
     hxs = HtmlXPathSelector(response) 
     print response,'------->' 

Qui sto cercando di combinare il link href con il collegamento di base, ma sto ottenendo il seguente errore,

exceptions.ValueError: Missing scheme in request url: www.domain.com//bookstore/detail/3271993?alt=Something+I+Had+To+Do 

chiunque può farmi sapere perché sto ottenendo questo errore e come partecipare URL di base con link href e la resa di una richiesta

risposta

9

e 'perché non è stato aggiunto lo schema, ad esempio http: // nella vostra base url.

Prova: urlparse.urljoin('http://www.domain.com/', i[1:])

o anche di più facile: urlparse.urljoin(response.url, i[1:]) come urlparse.urljoin sarà risolvere l'URL di base in sé.

+1

Grazie mille ho la risposta. –

+0

E allo stesso tempo puoi dirmi la differenza tra urlparse e urljoin perché utilizzando uno di essi anch'io sono in grado di ottenere la risposta –

+0

Entrambi i metodi urlparse.urlparse e urlparse.urljoin fanno parte del modulo urlparse. Vedi anche: http://docs.python.org/library/urlparse.html –

0

Una soluzione alternativa, se non si vuole usare urlparse:

response.urljoin(i[1:])

Questa soluzione va ancora un passo ulteriore: qui Scrapy risolve la base del dominio a unirsi. E come puoi vedere, non devi fornire l'ovvio http://www.example.com per partecipare.

Questo rende il codice riutilizzabile in futuro se si desidera modificare il dominio che si sta sottoponendo a scansione.