【问题标题】:Downloading pictures with scrapy用scrapy下载图片
【发布时间】:2012-02-05 02:54:01
【问题描述】:

我从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 时,我会得到要下载的图片的正确URL(复制粘贴到浏览器中进行检查)。

但是当我取消引用那些我得到以下错误:

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

我无法下载我的图片。

我已经搜索了一整天,但没有发现任何有用的信息。

【问题讨论】:

  • 您有处理网址的管道吗?您是否在 settings.py 中注册了您的管道? doc.scrapy.org/en/latest/topics/images.html,很好的参考。您是否具有写入 IMAGE_STORE 路径的适当权限?
  • 是的,我按照所说的做了一切,实际上我使用了那个参考,但仍然......没有

标签: python scrapy


【解决方案1】:

我认为您抓取的图像 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说:

在 Spider 中,您抓取一个项目并将其图像的 URL 放入 image_urls 字段中。

因此,item['image_urls'] 应该是图像 URL 的列表。但是你的代码有:

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

所以,我猜它会逐个字符地迭代您的单个 URL 字符 - 将每个 URL 用作 URL。

【讨论】:

  • 这没有帮助。正如我所说,我已经有了绝对路径,我测试了我得到的 url,它确实是图像的 url。我试过这个,结果和以前一样,我得到了很好的 url,但是当我打开 ITEM_PIPELINES 和 IMAGES_STORE 时,我得到了和以前一样的错误
  • 但是这种获取绝对网址的方式肯定更好,所以谢谢
  • @iblazevic,查看我的更新。不要忘记投票/接受答案
  • 在scrapy源中编辑文件:scrapy/scrapy/contrib/pipeline/images.py,方法ImagesPipeline.get_media_requests。放在那里print item.get('image_urls', [])
  • 您甚至可以在引发异常的位置之前添加打印,以查看 what url 无效。 > 越来越令人沮丧
【解决方案2】:

我认为您可能需要在列表中向项目提供您的图片网址:

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

【讨论】:

  • 没错。即使您的网址正确,image_urls 也应该是网址列表,而不是字符串。
  • 是的,它应该是一个列表。感谢您的评论
  • 更聪明的方法@sir alecxe。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 2018-12-15
  • 2023-03-18
  • 2017-02-06
  • 1970-01-01
相关资源
最近更新 更多