2012-01-07 3 views
7

Zaczynam od scrapy i mam pierwszy poważny problem. Pobiera zdjęcia. To jest mój pająk.Pobieranie zdjęć ze złomowaniem

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 

Kiedy cytuję ITEM_PIPELINES i IMAGES_STORE w settings.py ten sposób uzyskać prawidłowego URL obrazu Chcę pobrać (kopia wklejone go w wyszukiwarce check).

Ale kiedy cytatu tych i uzyskać następujący błąd:

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

i nie mogę ściągnąć moje zdjęcia.

Szukałem przez cały dzień i nie znalazłem nic przydatnego.

+0

masz rurociągu do przetwarzania adresów URL? czy zarejestrowałeś swój potok w settings.py? http://doc.scrapy.org/en/latest/topics/images.html, to świetne odniesienie. czy masz odpowiednie uprawnienia do zapisu do ścieżki IMAGE_STORE? – dm03514

+0

tak Zrobiłem wszystko, co zostało powiedziane, właściwie użyłem tego odniesienia, ale nadal ... nie – iblazevic

Odpowiedz

12

Myślę, że URL obrazu, który skrobałeś, jest względny. Aby skonstruować absolutną użycie URL 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] 
    ... 

nie wykorzystali ITEM_PIPELINES, ale docs słownie:

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

Więc pozycja [ 'image_urls'] powinna być lista obrazu Adresy URL. Ale twój kod ma:

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

Tak, myślę, że iteruje twój pojedynczy URL char przez char - używając każdego jako adresu URL.

+0

To nie pomogło. Jak już powiedziałem, mam już absolutną ścieżkę na mojej drodze, przetestowałem adres URL i rzeczywiście był to URL obrazu. Próbowałem tego i wynik jest taki sam jak poprzednio, dostaję dobry adres URL, ale kiedy włączam ITEM_PIPELINES i IMAGES_STORE pojawia się ten sam błąd co przed – iblazevic

+0

, ale ten sposób uzyskiwania bezwzględnego adresu URL jest zdecydowanie lepszy, więc dzięki za to – iblazevic

+0

@iblazevic, zobacz moja aktualizacja. I nie zapomnij o pobraniu/zaakceptowaniu odpowiedzi – warvariuc

5

myślę, że być może trzeba podać URL obrazu w liście do artykułu:

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

To prawda. Nawet jeśli adres URL jest poprawny, image_urls ma być listą adresów URL, bez ciągów. – rvnovaes

+0

tak, to powinna być lista. Dzięki za komentarz –

+0

100% zgadzam się z Tobą, że rozwiązuje mój problem. Dzięki –