python - 抓取/下载图像但抓取唯一图像时抓取返回重复的项目字段
问题描述
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
. 这是沿着这条路线起作用的东西。
谢谢你。
解决方案
我能够通过开始一个新项目来解决这个问题,因为我怀疑管道存在问题但无法找到它。
我最终使用这个片段来检查data-src
和src
属性:
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']]
谢谢!
推荐阅读
- c++ - std::accumulate 有参考?
- grafana - 无法在 grafana 中设置 HomePath 和配置
- c# - Rx Buffer 运行一次并完成
- c# - 在分配其余属性后无法将一个属性添加到列表中的对象
- python - nargs 取决于另一个设置?
- python - 验证单元格是否相同并构建一个 excelfile
- arrays - 如何返回包含哈希的数组数组
- .net - 处理从 [MSAL] [.Net] 返回的 AADSTS70008/AADSTS50173 错误代码
- google-apps-script - Apps 脚本 sheet.getCharts() 引发服务错误:电子表格
- sparql - SPARQL - 如果属性存在,如何过滤,否则按原样添加?