2012-01-07 3 views
7

Я начинаю с scrapy, и у меня есть первая настоящая проблема. Это загрузка изображений. Так что это мой паук.Загрузка изображений с помощью 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 

Когда я цитирую ITEM_PIPELINES и IMAGES_STORE в settings.py таким образом я получаю правильный URL для изображения я хочу, чтобы загрузить (скопировать вставить его в браузер для проверки).

Но когда я конец цитаты тех, я получаю следующее сообщение об ошибке:

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

и я не могу загрузить мои фотографии.

Я искал весь день и не нашел ничего полезного.

+0

у вас есть конвейер для обработки URL-адресов? Вы зарегистрировали свой конвейер в settings.py? http://doc.scrapy.org/en/latest/topics/images.html, это отличная рекомендация. есть ли у вас надлежащие права на запись на путь IMAGE_STORE? – dm03514

+0

да, я сделал все, как сказано, на самом деле я использовал эту ссылку, но все же ... нет – iblazevic

ответ

12

Я думаю, что URL-адрес изображения, который вы очистили, относительный. Для построения абсолютного использования 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] 
    ... 

не использовали ITEM_PIPELINES, но docs сказать:

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

Таким образом, пункт [ 'image_urls'] должен быть список изображения URL-адрес. Но ваш код:

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

Таким образом, я предполагаю, что он перебирает свой единственный URL полукокса по полукокса - с использованием каждого в качестве URL.

+0

Это не помогло. Как я уже сказал, у меня уже есть абсолютный путь, я проверил URL-адрес, который я получил, и это действительно был URL-адрес изображения. Я пробовал это, и результат такой же, как и раньше, я получаю хороший url, но когда я включаю ITEM_PIPELINES и IMAGES_STORE, я получаю ту же ошибку, что и раньше – iblazevic

+0

, но этот способ получения абсолютного URL-адреса определенно лучше, поэтому спасибо за это – iblazevic

+0

@iblazevic, см. мое обновление. И не забудьте ответить и принять ответы – warvariuc

5

Я думаю, что вам, возможно, потребуется предоставить свой адрес изображения в списке Пункт:

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

Это правильно. Даже если ваш URL-адрес правильный, image_urls должен быть списком URL-адресов, нет строки. – rvnovaes

+0

Да, это должен быть список. Спасибо за комментарий –

+0

100% согласен с вами, что решает мою проблему. благодаря –

Смежные вопросы