就這? 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')

剛好我也是寫了個爬蟲 製作了表情包, 如果想用自己的圖片製作表情包,這個函數也是可以的。動手試試吧!

後記:這個真好玩,鬥圖再也沒輸過了。

在這裏插入圖片描述

總結到一個問題,學的越多,越難的很細節描述一個事物,角度不同吧,我感覺這個很簡單,可能對於小白說,這個很難理解,沒別的說。

喜歡就個關注和點贊,支持支持!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章