【发布时间】:2020-10-29 22:41:34
【问题描述】:
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]
这个特殊的 sn-p 不起作用,因为本节的前 2 行将引发 KeyError。正是这条路线奏效了。
谢谢。
【问题讨论】: