使用scrapy下载图片

7 投票
2 回答
11133 浏览
提问于 2025-04-17 09:45

我刚开始学习使用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

当我在settings.py文件中把ITEM_PIPELINESIMAGES_STORE这两个设置引号去掉时,我能得到我想下载的图片的正确网址(我把网址复制粘贴到浏览器里检查过)。

但是当我把它们加上引号后,就出现了以下错误:

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

这样我就无法下载我的图片了。

我整整搜索了一天,也没有找到任何有用的信息。

2 个回答

7

我觉得你可能需要把你的图片网址放在一个列表里,然后给这个项目使用:

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

我觉得你抓取到的图片链接是相对链接。要把它变成绝对链接,可以用 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,但 文档上说:

在一个爬虫里,你抓取一个项目,然后把它的图片链接放到一个叫 image_urls 的字段里。

所以,item['image_urls'] 应该是一个图片链接的列表。但是你的代码里有:

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

所以,我猜它是一个字符一个字符地遍历你的单个链接,把每个字符都当作链接。

撰写回答