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

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

1.寻找目标

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

爬虫-Scrapy (五) 爬取美女图片_第1张图片

我们按F12看下页面源码结构
爬虫-Scrapy (五) 爬取美女图片_第2张图片

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

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 路径下,图片下载完成。是不是非常简单。
爬虫-Scrapy (五) 爬取美女图片_第3张图片

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.再次运行看效果

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

爬虫-Scrapy (五) 爬取美女图片_第4张图片
爬虫-Scrapy (五) 爬取美女图片_第5张图片

你可能感兴趣的:(爬虫-Scrapy,爬虫)