python scrapy:蜘蛛跟随链接,但不会下载图像

时间:2017-10-23 15:20:55

标签: python scrapy

我已经建立了一个基本的爬虫,从xkcd中抓取漫画图像并跟踪每个漫画的链接并继续抓取。蜘蛛跟随链接很好,但我实际上没有刮到图像。

我已经尝试了多个xpath和css选择器以及编写parse_item方法的方法,但是由于scrapy尝试使用url的第一个字母作为完整url或者不可用类型,我得到错误'列表'错误并且已经没有了想法。

蜘蛛:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class XkcdSpider(CrawlSpider):
    name = 'xkcd'
    allowed_domains = ['xkcd.com']
    start_urls = ['http://xkcd.com/']

    rules = (
    Rule(LinkExtractor(allow=r'\/\d{4}\/', unique=True),
         callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        i = {}
        relative_url = response.xpath(
            '//*[@id="comic"]/img/@src').extract_first()

        absolute_url = response.urljoin(relative_url)
        i['image_urls'] = absolute_url
        return i

产品:

import scrapy


class XkcdItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    images = scrapy.Field()
    image_urls = scrapy.Field()

图像管道设置如下:

ITEM_PIPELINES = {
   'scrapy.pipelines.images.ImagesPipeline': 1,
}

回溯是这样的:

TypeError: unhashable type: 'list'

或者这个:

ValueError: Missing scheme in request url: h

我理解的是scrapy试图使用网址的第一个字母而不是整个网页,但我找不到让它工作的方法,只尝试了.extract()而不是{{ 1}}但这不起作用。

任何帮助非常感谢

2 个答案:

答案 0 :(得分:0)

尝试这样

srcs = response.xpath('//*[@id="comic"]/img/@src').extract()
i['image_urls'] = [response.urljoin(src) for src in srcs]

可能您已经完成了此操作,但为了以防万一,请务必正确设置IMAGES_STORE设置。

答案 1 :(得分:0)

在向OP询问他回复absolute_url的输出时。

[root] INFO: imgs.xkcd.com/comics/state_borders.png Does this look right? – 

这是不正确的,就是刮刀告诉你的,Missing scheme in request url:表示你的网址缺少HTTP方案信息。

还提供dsads变量的列表。

i['image_urls'] = ["https://" + absolute_url] #adding scheme to URL