Загрузка картинок с помощью скрапа

Я начинаю со скрапа, и у меня первая настоящая проблема. Это загрузка картинок. Так что это мой паук.

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

и я не могу скачать свои фотографии.

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

2 ответа

Решение

Я думаю, что 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, но в документах говорится:

В Spider вы очищаете элемент и помещаете URL-адреса его изображений в поле image_urls.

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

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

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

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

item['image_urls'] = [ 'http://www.domain.com' + item['image_urls'] ]
Другие вопросы по тегам