【问题标题】:Scrapy returning duplicate item fields when scraping/downloading images but scrapes unique images抓取/下载图像但抓取唯一图像时抓取返回重复的项目字段
【发布时间】: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。正是这条路线奏效了。

谢谢。

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

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

    我最终使用这个 sn-p 来检查 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()
    

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

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

    谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多