2012-01-07 27 views
7

Estoy empezando con scrapy, y tengo el primer problema real. Está descargando imágenes. Entonces esta es mi araña.Descarga de imágenes 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 

Cuando cito ITEM_PIPELINES y IMAGES_STORE en settings.py esta manera puedo obtener la URL correcta para la imagen que deseo descarga (copia pegada en el navegador para el check).

Pero cuando me dijeron ellos los que me sale error siguiente:

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

y no puedo descargar mis fotos.

He buscado todo el día y no encontré nada útil.

+0

tienes una tubería para procesar las URL? ¿Registraste tu canalización en settings.py? http://doc.scrapy.org/en/latest/topics/images.html, es una gran referencia. ¿tiene los permisos adecuados para escribir en la ruta IMAGE_STORE? – dm03514

+0

sí Hice todo lo que se dice, de hecho usé esa referencia pero aún así ... no – iblazevic

Respuesta

12

Creo que la URL de la imagen que raspaste es relativa. Para construir el uso de URL absoluta 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] 
    ... 

no ha utilizado ITEM_PIPELINES, pero el docs decir:

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

Así, punto [ 'image_urls'] debería ser una lista de imagen URLs Sin embargo, el código tiene:

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

lo tanto, supongo que itera tu personaje URL sencillo de carbón - con ayuda de cada uno como URL.

+0

Esto no ayudó. Como dije, ya tengo un camino absoluto a mi manera, probé la URL y la url de una imagen. Intenté esto y el resultado es el mismo que antes, obtengo una buena url pero cuando enciendo ITEM_PIPELINES e IMAGES_STORE recibo el mismo error que antes de – iblazevic

+0

, pero esta forma de obtener la URL absoluta es definitivamente mejor, así que gracias por eso – iblazevic

+0

@iblazevic, consulte mi actualización Y no se olvide de votar/aceptar respuestas – warvariuc

5

creo que es posible que tenga que proporcionar su URL de la imagen en una lista al artículo:

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

Eso es correcto. Incluso si su URL es correcta, se supone que image_urls es una lista de urls, no una cadena. – rvnovaes

+0

Sí, se supone que es una lista. Gracias por el comentario –

+0

100% de acuerdo con usted, que resuelve mi problema. Gracias –