我已经建立了一个基本的爬虫,从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}}但这不起作用。
任何帮助非常感谢
答案 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