首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用管道保存图片时,最后一项覆盖的所有项目

当使用管道保存图片时,最后一项覆盖的所有项目
EN

Stack Overflow用户
提问于 2022-11-24 19:55:29
回答 1查看 45关注 0票数 1

我刚开始学刮刮,也不是以英语为母语的人,如果我犯了一些愚蠢的错误或者说不出我的观点,我很抱歉。我想从一个中文网站(music.douban.com/tag/%E6%91%87%E6%BB%9A?start=0&type=T).上搜集摇滚专辑的信息和封面。当我只是使用xpath获取非图片信息(艺术家、细节页面的url和封面的url)时,没有什么问题:

代码语言:javascript
复制
import scrapy
from myscrapy.items import musicItem

class doubanAlbumSpider(scrapy.Spider):
    name = "albumspider"
    start_urls = ['https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=0&type=T']
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',
    }

    def start_requests(self):
        url = 'https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=0&type=T'
        yield scrapy.Request(url, headers=self.headers)
    
    def parse(self,response):
        item = musicItem()
        albums = response.xpath(r"//tr[@class='item']")
        for album in albums:
            item['alname'] = " ".join(album.xpath(r"./td/div/a/text()")[0].extract().split())
            item['detailUrl'] = album.xpath(r"./td/a/@href")[0].extract()
            item['imageUrl'] = (r"/m/").join(album.xpath(r"./td/a/img/@src")[0].extract().split(r"/s/"))
            yield(item)
代码语言:javascript
复制
class musicItem(scrapy.Item):
    alname = scrapy.Field()
    imageUrl = scrapy.Field()
    detailUrl = scrapy.Field()
    image = scrapy.Field()
    image_paths = scrapy.Field()

在这里输入图像描述

但是当我添加了一个下载tye图片的管道时,这些图片就被成功下载了,而非图片信息却出了问题。它们都被最后一条所覆盖,那是在深红国王的宫廷里。还有其他类似的问题吗?

代码语言:javascript
复制
class DoubanImagePipeline(ImagesPipeline):
    default_headers = {
        'accept': 'image/webp,image/*,*/*;q=0.8',
        'accept-encoding': 'gzip, deflate, sdch, br',
        'accept-language': 'zh-CN,zh;q=0.8,en;q=0.6',
        'cookie': 'bid=yQdC/AzTaCw',
        'referer': 'https://www.douban.com/',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
    }
 
    def get_media_requests(self, item, info):
        yield scrapy.Request(url=item['imageUrl'])

在这里输入图像描述

EN

回答 1

Stack Overflow用户

发布于 2022-11-24 20:49:39

Item字段是可变的,现在在parse方法中,您可以在方法主体的开头创建一个项,并在生成每个结果时使用相同的项。您需要做的是在for loop的每个迭代中创建一个唯一的项。

例如:

代码语言:javascript
复制
    def parse(self,response):
        albums = response.xpath(r"//tr[@class='item']")
        for album in albums:
            item = musicItem()
            item['alname'] = " ".join(album.xpath(r"./td/div/a/text()")[0].extract().split())
            item['detailUrl'] = album.xpath(r"./td/a/@href")[0].extract()
            item['imageUrl'] = (r"/m/").join(album.xpath(r"./td/a/img/@src")[0].extract().split(r"/s/"))
            yield(item)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74565693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档