爬虫-Scrapy (五) 爬取美女图片

Scrapy 框架的piplelines下提供了现在图片和视频的类,这使得我们将页面中的图片下载到本地非常方便。

1.寻找目标

百度搜索‘美女’,就可以找到很多有美女图片的网站,这里不贴地址了,反正很多。我找个是这样个的一个网站

在这里插入图片描述

我们按F12看下页面源码结构
在这里插入图片描述

非常清晰,我们的目标就是爬取页面中的图片,并按主题保存到本地,动手。

2.item

定义2个属性,主题名称和图片地址列表。

图片Item

class ImageItem(scrapy.Item):
    topic_name = scrapy.Field()         # 主题名
    img_url_list = scrapy.Field()       # 图片url列表

3.spider

解析元素存入item,没什么特别说明的。
复制代码

import scrapy
from scpy1.items import ImageItem

class ImagespiderSpider(scrapy.Spider):
    name = 'ImageSpider'
    allowed_domains = ['www.*****.com']       #替换成目标网址
    start_urls = ['https://www.****/meinv/']  #替换成目标网址

    def parse(self, response):
        topic_list = response.xpath('//div[@id="container"]/div')[1:-1]
        # 遍历主题
        for topic in topic_list:
            topic_name = topic.xpath('.//h3[@class="list_title"]//span/text()').extract_first()
            img_url_list = topic.xpath('.//img/@src').extract()
            item = ImageItem()
            item['topic_name'] = topic_name      # 主题名称
            item['img_url_list'] = img_url_list  # 图片url列表
            yield item

4.pipeline

这里注意要继承ImagePipeline ,然后重写get_media_request 方法。

class ImageSpiderPipeline(ImagesPipeline):

    def get_media_requests(self, item, spider):
        # 循环每一张图片地址下载
        for image_url in item['img_url_list']:
            yield Request(image_url)

5.settings

a.开启pipeline

ITEM_PIPELINES = {
   'scpy1.pipelines.ImageSpiderPipeline': 300
}

b.设置图片存储根路径(必须)

#set image store path
IMAGES_STORE = './image'

6. 运行看下结果

项目路径/image/full 路径下,图片下载完成。是不是非常简单。
在这里插入图片描述

7.重写路径

我们观察下图片路径 项目路径/image 是我们在settings 里指定的路径,full是自动生成的,然后图片并没有按照主题分类,这时候我们重新下pipeline里的file_path方法,

代码如下:

class ImageSpiderPipeline(ImagesPipeline):

    def get_media_requests(self, item, spider):
        # 循环每一张图片地址下载
        for image_url in item['img_url_list']:
            # 这里meta={'item': item},目的事件item传递到file_path中
            yield Request(image_url,meta={'item':item})

    def file_path(self, request, response=None, info=None, *, item=None):
        # 读取item中topic_name 作为路径名称
        item = request.meta['item']
        path = item['topic_name']
        # 通过分割图片路径获取图片名字
        img_name = request.url.split("/")[-1]
        return '{}/{}.jpg'.format(path,img_name)

8.再次运行看效果

图片已经按主题分好了,看着和小电影似的,下次尽量不做这种类型的了。

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值