Загрузка картинок с помощью скрапа - PullRequest
7 голосов
/ 08 января 2012

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

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 ]

12 голосов
/ 08 января 2012

Я думаю, что 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']

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

6 голосов
/ 07 июня 2013

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

item['image_urls'] = [ 'http://www.domain.com' + item['image_urls'] ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...