首页 > 解决方案 > 抓取/下载图像但抓取唯一图像时抓取返回重复的项目字段

问题描述

Scrapy 在输出中返回重复的项目字段,但会抓取/下载唯一的图像。当我不抓取图像时,刮板工作正常,返回每个项目的所有唯一值。

我在 settings.py 中修改的唯一行是:

ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 300,
}
IMAGES_STORE = '.../posters'

这是我的解析函数,它返回重复值但唯一的图像文件:

def parse(self, response):
    item = AnimeItem()
    for anime in response.css('.seasonal-anime'):
        item['rating'] = anime.css('.score::text').get().strip()
        item['airdate'] = anime.css('.remain-time::text').get().strip()
        item['url'] = anime.css('.link-title').attrib['href']
        item['title'] = anime.css('.link-title::text').get()
        item['synopsis'] = anime.css('.preline::text').get()
        try:
            item['image_urls'] = [anime.css('.image a img').attrib['src']]
        except KeyError:
            item['image_urls'] = [anime.css('.image a img').attrib['data-src']]
        yield item

我需要检查src属性的原因是因为页面(https://myanimelist.net/anime/season)延迟加载元素但那些延迟加载的元素不会返回src属性,KeyError尽管它存在于html。所以我检查一个data-src返回相同值的属性。data-src前十几个元素不存在该属性。我尝试使用 xpath 来查看它是否会读取src属性,但它会做同样的事情。

我能够使用 if/else 语句让它工作一次,但我已经丢失了代码,因为我想使用 try/except。我认为是这样的:

image_src = anime.css('.image a img').attrib['src']
image_data_src = anime.css('.image a img').attrib['data-src']
if image_src:
    item['image_urls'] = [image_src]
elif image_data_src:
    item['image_urls'] = [image_data_src]

这个特定的片段不起作用,因为本节的前 2 行将引发KeyError. 这是沿着这条路线起作用的东西。

谢谢你。

标签: pythonscrapy

解决方案


我能够通过开始一个新项目来解决这个问题,因为我怀疑管道存在问题但无法找到它。

我最终使用这个片段来检查data-srcsrc属性:

if element.css('.image a img::attr(src)').get() is None:
    item['image_urls'] = element.css('.image a img::attr(data-src)').extract()
else:
    item['image_urls'] = element.css('.image a img::attr(src)').extract()

我仍然很困惑为什么这个片段会产生独特的图像,但会在其余字段中创建重复。

try:
    item['image_urls'] = [anime.css('.image a img').attrib['src']]
except KeyError:
    item['image_urls'] = [anime.css('.image a img').attrib['data-src']]

谢谢!


推荐阅读