爬了个网站,结果发现该网站图片不好看,于是看程序员如何制作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')
刚好我也是写了个爬虫 制作了表情包, 如果想用自己的图片制作表情包,这个函数也是可以的。动手试试吧!
后记:这个真好玩,斗图再也没输过了。
总结到一个问题,学的越多,越难的很细节描述一个事物,角度不同吧,我感觉这个很简单,可能对于小白说,这个很难理解,没别的说。
喜欢就个关注和点赞,支持支持!!