就这? Scrapy框架被我用了个遍,结果只制作了表情包!

爬了个网站,结果发现该网站图片不好看,于是看程序员如何制作DIY表情包?

在这里插入图片描述


前提: 本篇博客涵盖scrapy知识点过多,需要一定基础,理解不了的可以留言, 同时还包含一个gif’制作库的使用,剩下的模块我觉得挺简单的!
效果图如上:

在这里插入图片描述

前言:

其实爬虫一直爬取图片挺没意思的,单纯满足自我私欲之外,然后我就想搞点其他的,于是想到了可以爬图片制作表情包这样的想法,加上最近学了scrapy框架的知识, 正好一起使用上来,加快了爬虫的效率,以及制作图片的资源快捷性!

  • 首先: 分析网站
  • 编码: 使用scrapy框架爬取图片保存下来
  • 制作: 使用imageio生成gif图片

博客分为三大块,按照自我需求寻找思路, 觉得不错的还是点个关注和赞吧,创作不易,没动力哎。


分析网站:

  • 本次使用scrapy框架爬取一个小网站, 挺担心这个网站的!

  • first_url: https://www.52doutu.cn/post/1/
    在这里插入图片描述

  • 从中点开任意一个查看全部,网址规模都是一样的:https://www.52doutu.cn/p/99/
    也就是p后面的数值不一样, 这里可以匹配过去。后面代码细讲:之后打开这样的页面:

在这里插入图片描述

  • 别想了, 哪有这么简单直接索取的,这里存在一个js加载,直接获取不了
    打开页面源代码,从这里获取,图片url。

在这里插入图片描述

具体网站具体分析,不是所有网站都是傻逼网站那么简单爬取。


编写代码:

编写spider:

爬虫程序

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from joke_image.items import JokeImageItem
import time


class JokeImgSpiderSpider(CrawlSpider):
    name = 'joke_img_spider'
    allowed_domains = ['52doutu.cn']
    start_urls = ['https://www.52doutu.cn/post/1/']

    rules = (
        Rule(LinkExtractor(allow=r'.*www.52doutu.cn/post/\d+/'), follow=True),
        Rule(LinkExtractor(allow=r'.*www.52doutu.cn/p/\d+/'),
             callback="parse_img", follow=False)
    )

    def parse_img(self, response):
        time.sleep(0.2)
        title = response.xpath('//h1[@class="entry-title"]/text()').get()
        image_urls = response.xpath('//section[@class="post-gallery"]/div/a/img/@data-original').getall()
        # image_urls = response.xpath('//div[@class="article-content"]//div/a/img/@data-original').getall()
        #  获得真实xpath格式
        items = JokeImageItem()
        print(image_urls)
        items['title'] = title
        items['image_urls'] = image_urls
        yield items

编写items:

管道

import scrapy


class JokeImageItem(scrapy.Item):
    image = scrapy.Field()
    image_urls = scrapy.Field()
    title = scrapy.Field()

编写pipeline:

这里实现了图片分类的功能:
IMAGES_STORE 这个是图片仓库, setting自己设置:

from joke_image.settings import IMAGES_STORE
from scrapy.http import Request
from scrapy.pipelines.images import ImagesPipeline


class JokeImagePipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        # 不断的请求 , 然后返回, 把items传回
        for url in item['image_urls']:
            yield Request(url, meta={'item': item})

    def file_path(self, request, response=None, info=None):

        title = request.meta['item']['title']
        path = IMAGES_STORE + f'\\{title}\\{request.url.split("/")[-1]}'
        print(f'保存在:{path}')
        return path

然后我们在运行程序:之后得到的效果图如下:

在这里插入图片描述

制作表情包:

制作表情包的函数库刚开始选择二种;
from images2gif import writeGif
import imageio
结果发现 image2gif 存在一个bug 图片只会加载第一张 就闪退
所以重写代码 最后成功:

最后将这个函数功能封装了下:
参数也就是一个path, 存放图片的地方, 给个例子:

path = r’D:\pyth\scrapy 项目\joke_image\表情包’

类似这样的

import imageio
import os

# 导入制作gif函数库

class MakeImagesMovie(object):
    """
    from class get the images_list
    return:  small gif
    params: path  * images path
    """

    def __init__(self, path):
        self.path = path
        self.image_files = []

    def get_image(self):
        for dirpath, dirnames, filenames in os.walk(path):
            # dirpath 所有目录的路径  包括主目录 和子目录
            # dirnames 所有子目录的名称
            # filenames 所有文件的名称
            # 中转列表
            title_img = [os.path.join(dirpath, i) for i in os.listdir(dirpath)]
            self.image_files.append(title_img)  # 构造二维数组

    def create_gif(self, image_list, gif_path, duration):
        frames = []
        for image_name in image_list:
            frames.append(imageio.imread(image_name))
        imageio.mimsave(gif_path, frames, 'GIF', duration=duration)
        return

    def make_movies(self):
        self.get_image()
        for title_img in self.image_files[1:]:  # 遍历大列表
            # frames = []  # 存放每个文件夹网址的目录
            name = title_img[0].split('/')[5][:6]
            gif_path = f'D:/pyth/scrapy 项目/表情包gif/{name}.gif'
            self.create_gif(title_img[:10], gif_path, duration=0.25)
            print(f'成功制作出{name}的gif')

刚好我也是写了个爬虫 制作了表情包, 如果想用自己的图片制作表情包,这个函数也是可以的。动手试试吧!

后记:这个真好玩,斗图再也没输过了。

在这里插入图片描述

总结到一个问题,学的越多,越难的很细节描述一个事物,角度不同吧,我感觉这个很简单,可能对于小白说,这个很难理解,没别的说。

喜欢就个关注和点赞,支持支持!!

猜你喜欢

转载自blog.csdn.net/qq_45906219/article/details/106837697
今日推荐