2012-01-07 12 views
7

Sto iniziando con scrapy, e ho il primo vero problema. Sta scaricando le foto. Quindi questo è il mio ragno.Download di immagini con scrapy

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.selector import HtmlXPathSelector 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from example.items import ProductItem 
from scrapy.utils.response import get_base_url 

import re 

class ProductSpider(CrawlSpider): 
    name = "product" 
    allowed_domains = ["domain.com"] 
    start_urls = [ 
      "http://www.domain.com/category/supplies/accessories.do" 
    ] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     items = [] 
     sites = hxs.select('//td[@class="thumbtext"]') 
     number = 0 
     for site in sites: 
      item = ProductItem() 
      xpath = '//div[@class="thumb"]/img/@src' 
      item['image_urls'] = site.select(xpath).extract()[number] 
      item['image_urls'] = 'http://www.domain.com' + item['image_urls'] 
      items.append(item) 
      number = number + 1 
     return items 

Quando cito ITEM_PIPELINES e IMAGES_STORE in settings.py questo modo ottengo l'URL corretto per l'immagine Vorrei scaricare (copia incollato in del browser per il controllo).

Ma quando ho unquote quelli ottengo l'errore seguente:

raise ValueError('Missing scheme in request url: %s' % self._url') 
exceptions.ValueError: Missing scheme in request url:h 

e non riesco a scaricare le mie foto.

Ho cercato per l'intera giornata e non ho trovato nulla di utile.

+0

avete una pipeline per elaborare gli URL? hai registrato la tua pipeline in settings.py? http://doc.scrapy.org/en/latest/topics/images.html, è un ottimo riferimento. hai le autorizzazioni appropriate per scrivere sul percorso di IMAGE_STORE? – dm03514

+0

sì ho fatto tutto come si dice, in realtà ho usato quel riferimento ma ancora ... no – iblazevic

risposta

12

Penso che l'URL dell'immagine che hai raschiato sia relativo. Per costruire l'uso URL assoluto urlparse.urljoin:

def parse(self, response): 
    ... 
    image_relative_url = hxs.select("...").extract()[0] 
    import urlparse 
    image_absolute_url = urlparse.urljoin(response.url, image_relative_url.strip()) 
    item['image_urls'] = [image_absolute_url] 
    ... 

non hanno usato ITEM_PIPELINES, ma il docs dire:

In a Spider, you scrape an item and put the URLs of its images into a image_urls field.

Quindi, punto [ 'image_urls'] dovrebbe essere un elenco di immagini URL. Ma il vostro codice ha:

item['image_urls'] = 'http://www.domain.com' + item['image_urls'] 

Quindi, credo che itera il tuo personaggio unico URL da char - utilizzando ciascuno come URL.

+0

Questo non ha aiutato. Come ho già detto, ho già un percorso assoluto a modo mio, ho provato l'url che ho ricevuto ed è stato davvero l'URL di un'immagine. Ho provato questo e il risultato è lo stesso di prima, ottengo un buon URL ma quando accendo ITEM_PIPELINES e IMAGES_STORE ho lo stesso errore di prima – iblazevic

+0

ma questo modo di ottenere l'URL assoluto è decisamente migliore, quindi grazie per questo – iblazevic

+0

@iblazevic, vedere il mio aggiornamento E non dimenticare di confermare/accettare le risposte – warvariuc

5

penso che potrebbe essere necessario fornire l'URL dell'immagine in una lista alla voce:

item['image_urls'] = [ 'http://www.domain.com' + item['image_urls'] ] 
+0

Che è corretto. Anche se il tuo URL è corretto, si suppone che image_urls sia un elenco di URL, non una stringa. – rvnovaes

+0

sì, dovrebbe essere una lista. Grazie per il commento –

+0

100% d'accordo con te, che risolve il mio problema. Grazie –

Problemi correlati