爬了個網站,結果發現該網站圖片不好看,於是看程序員如何製作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')
剛好我也是寫了個爬蟲 製作了表情包, 如果想用自己的圖片製作表情包,這個函數也是可以的。動手試試吧!
後記:這個真好玩,鬥圖再也沒輸過了。
總結到一個問題,學的越多,越難的很細節描述一個事物,角度不同吧,我感覺這個很簡單,可能對於小白說,這個很難理解,沒別的說。
喜歡就個關注和點贊,支持支持!!