scrapy只能获取最后一张图片

scrapy只能获取最后一张图片

import scrapy
import re
from venv.moc.parsetest.scrapy001.scrapy_project.tubatu.items import TubatuItem

class TuvatuSpider(scrapy.Spider):
    name = 'tubatu'
    allowed_domains = ['to8to.com']
    start_urls = ['https://xiaoguotu.to8to.com/case/type3/p1.html']

    def parse(self, response):
        print(response.request.headers)
        pic_item_list = response.xpath('//div[@class = "item"]')
        for item in pic_item_list:
            info ={}
            info["content_name"] = item.xpath('.//div//a[@class="title"]/text()').extract_first().replace('\n','')
            info["content_url"] = item.xpath('.//div//a[@class="title"]/@href').extract_first()
            yield scrapy.Request(info["content_url"],callback=self.hanle_pic_parse,meta=info)
            break

        # if response.xpath("//a[@id='nextpageid']"):
        #     now_page = int(response.xpath("//div[@class='pages']/strong/text()").extract_first())
        #     next_page_url = 'https://xiaoguotu.to8to.com/case/type3/p%d.html' % (now_page + 1)
        #     # print(now_page)
        #     yield scrapy.Request(url=next_page_url, callback=self.parse)

        # for i in range(2,3):
        #     next_url = 'https://xiaoguotu.to8to.com/case/type3/p%d.html' % (i)
        #     print("当前爬取第{}页".format(i))
        #     yield scrapy.Request(url=next_url, callback=self.parse)


    def hanle_pic_parse(self,response):
        tubatu_info = TubatuItem()
        tubatu_info["content_name"] = response.request.meta["content_name"]
        tubatu_info["content_url"] = response.request.meta["content_url"]
        # tubatu_info['case_designer'] = response.xpath('//div[@class="small-avatar"]//div/img/@alt').extract_first()
        tubatu_info['house_type'] = response.xpath('//div[@class="info-wrapper"]//span[1]/a/text()').extract_first()
        tubatu_info['house_style'] = response.xpath('//div[@class="info-wrapper"]//span[2]/a/text()').extract_first()
        tubatu_info['area'] = response.xpath('//div[@class="info-wrapper"]//span[3]/a/text()').extract_first()
        pic_url_list = response.xpath('//div[@id="js-viewer"]//img//@data-original')
        for pic_url in pic_url_list:
            pic_id_search = re.compile(r"case/(.*?)\?x-oss-process")
            id = pic_id_search.search(pic_url.extract()).group(1)
            tubatu_info["pic_name"] = id
   
            tubatu_info["image_urls"] = [pic_url.extract()]
            yield tubatu_info

相关代码:

import pymongo
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem


class TubatuPipeline(object):
    def __init__(self):
        myclient = pymongo.MongoClient(host='linzpao.zjjy.vip',port=27017,username='linzpao-admin', password='linzpao123')
        mydb = myclient['linzpao']
        self.mycollection =mydb['tubutu']
    def process_item(self, item, spider):
        # self.mycollection.delete_many({})
        data = dict(item)
        self.mycollection.insert_one(data)
        return item

class tubatuImagePipeline(ImagesPipeline):
    # def get_media_requests(self, item, info):
    #     pass
    def item_completed(self, results, item, info):
        image_paths = [x ['path']for ok,x in results if ok]
        if not image_paths:
            raise DropItem('item contains no images')
        return item


    def file_path(self, request, response=None, info=None, *, item):
        print(item['pic_name'])
        file_name= item['pic_name'].split('/')[-1]
        return file_name

问题描述:

请老师帮我看看,为什么每个主题只能获取一张图片

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕美 2022-08-10 15:59:07

同学,你好!同学的代码实现方式在获取数据时会有重复数据,因此在下载图片时会有问题

https://img1.sycdn.imooc.com//climg/62f36389094af8fa17700682.jpg

可以先获取到所有的图片url

https://img1.sycdn.imooc.com//climg/62f363db09d1cfe814030368.jpg

在下载图片时请求image_urls列表中的数据并下载图片

https://img1.sycdn.imooc.com//climg/62f3652509bb2fae09610398.jpg

祝学习愉快!

  • 提问者 weixin_慕UI7443657 #1

    谢谢老师!

    另,请问老师pic_name其实已经在item中了,能否直接读取,如果可以的话应该怎么操作?

    2022-08-10 16:11:11
  • 好帮手慕美 回复 提问者 weixin_慕UI7443657 #2

    同学,你好!更改代码之后是直接获取到了所有图片url的列表,这一个html中的是一条数据,没有办法再使用for循环获取url中图片的名字了,在下载图片时设置图片名字即可

    https://img1.sycdn.imooc.com//climg/62f36e7809fa64d614040361.jpg

    https://img1.sycdn.imooc.com//climg/62f36ec809e0d6a117740615.jpg

    祝学习愉快!

    2022-08-10 16:41:13
  • 提问者 weixin_慕UI7443657 回复 好帮手慕美 #3
    请问老师,要下载的地址是必须要放在同一个列表中,还是下载地址只要是列表即可
    2022-08-10 17:16:05
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师