2012-01-07 4 views
7

Je commence par scrapy, et j'ai d'abord un vrai problème. Il télécharge des images. Donc c'est mon araignée.Téléchargement de photos avec 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 

Quand je cite ITEM_PIPELINES et IMAGES_STORE à settings.py cette façon, j'obtenir l'URL correcte pour l'image que je veux télécharger (copier collé dans le navigateur pour l'enregistrement).

Mais quand je CITATION ceux que je reçois l'erreur suivante:

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

et je ne peux pas télécharger mes photos.

J'ai cherché toute la journée et je n'ai rien trouvé d'utile.

+0

avez-vous un pipeline pour traiter les urls? avez-vous enregistré votre pipeline dans settings.py? http://doc.scrapy.org/en/latest/topics/images.html, est une excellente référence. avez-vous les autorisations appropriées pour écrire sur le chemin IMAGE_STORE? – dm03514

+0

oui j'ai tout fait comme il est dit, en fait j'ai utilisé cette référence mais toujours ... non – iblazevic

Répondre

12

Je pense que l'URL de l'image que vous avez grattée est relative. Pour construire l'utilisation d'URL absolue 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] 
    ... 

ont pas utilisé ITEM_PIPELINES, mais le docs dire:

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

Ainsi, l'article [ 'image_urls'] devrait être une liste d'images URL. Mais votre code a:

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

Donc, je suppose que votre URL unique itère omble chevalier par char - en utilisant chacun comme URL.

+0

Cela n'a pas aidé. Comme je l'ai dit j'ai déjà un chemin absolu à ma façon, j'ai testé l'URL que j'ai et c'était en effet l'URL d'une image. J'ai essayé ceci et le résultat est le même qu'avant, je reçois une bonne url mais quand j'allume ITEM_PIPELINES et IMAGES_STORE j'obtiens la même erreur qu'avant – iblazevic

+0

mais cette manière d'obtenir l'url absolue est définitivement meilleure, donc merci pour cela – iblazevic

+0

@iblazevic, voir ma mise à jour. Et n'oubliez pas d'upvote/accepter les réponses – warvariuc

5

Je pense que vous devrez fournir votre URL de l'image dans une liste à l'article:

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

C'est correct. Même si votre URL est correcte, image_urls est censé être une liste d'URL, pas de chaîne. – rvnovaes

+0

ouais, c'est censé être une liste. Merci pour le commentaire –

+0

100% d'accord avec vous, cela résout mon problème. Merci –

Questions connexes