图片折腾的经历——文件批处理、爬虫、图片工具

2022-11-03 15:41:05 浏览数 (2)

背景

由于很久之前的某一次在抖音上刷到了一个很赞的,分享海贼王壁纸的up主,后面他也经常更新高质量海贼王壁纸的图集,我觉得很赞,因此想自己全部下载保存下来,所以有了这次图片采集的折腾经历。过程大概就是先从某个渠道采集抖音该UP主的图片资源,然后使用shell脚本处理这些图片的名称和快速导入某个文件夹,最后挑选不好的图片删掉。 后来又想到自己搞一个个人的专属图库,就想到使用python爬虫爬取线上壁纸图片,由于技术问题,爬取的这些图片并不是4K图片,因此又折腾图片AI优化转4K,但转出来的图片有些大,最后就进行尽量的无损压缩,最终得到的图片大小竟然和1K的图片大小差不太多,但图片已经是4K,画质也高了不少。因此想把这个折腾的过程记录一下!

图片获取

抖音解析图集

抖音采集使用的抖音采集工具。 下载地址:

代码语言:javascript复制
aHR0cDovL3Bhbi5xa29uZ3Rhby5jbi8lRTQlQjglQkIlRTclQkQlOTElRTclOUIlOTgvJUU4JUJEJUFGJUU0JUJCJUI2L1BDJUU4JUJEJUFGJUU0JUJCJUI2LyVFNiU4QSU5NiVFOSU5RiVCMyVFOSU4NyU4NyVFOSU5QiU4NiVFNSVCNyVBNSVFNSU4NSVCNy43eg==

这个工具使用很简单,应该稍微看一下就能上手使用了,可以采集某个视频作者的全部作品,包括图集,具体就不多介绍。

另外如果想去水印解析单个作品,则可以使用下面的工具: 工具一 工具二

抖音采集后的目录大概是这样子

每个图集作品的结构如下

图片整理(Linux批量文件处理)

这样就会有一个问题,好几十个图集文件夹,里面图片的名称全部都是01.webp ~ 13.webp,如果放在同一个文件夹里面就会文件名冲突。 因此需要一个方法可以快速将文件重命名,并且全部移入一个总的文件夹里面。 作为程序员,我第一个想到的肯定是使用linux命令,通过写一个脚本就可以很轻松的实现这样的功能:

  • 遍历文件加下面所有文件夹里面的图片文件
  • 生成UUID(时间戳)不允许重复的字符串命名图片
  • 将图片剪切或者拷贝到另外一个文件夹中

脚本具体如下:

代码语言:javascript复制
#! /bin/bash

mkdir all
#mkdir mp3
#mv ./图集*/* .mp3. /mp3/

oldIFS=$IFS
IFS=$'n'
for file in `ls ./图集*/*`
do
i=`date  %s%N`;
newFile=`echo ./all/${i}.jpg`;
mv $file $newFile
done
IFS=$oldIFS

windows系统如何执行Linux脚本呢? 可以使用 git bash here,条件就是得先安装git啦

其实也可以使用编写.bat脚本或者编写python脚本来实现同样的功能。但我作为一个后端程序员,最熟悉的还是Linux脚本。

爬虫

该方法主要是通过观察图片网站上获取图片的规律,根据原网站拼接出具体图片的url,然后保存图片文件。 爬虫的方法网上很多,贴一个亲试可用的代码:

代码语言:javascript复制
<code class="language-python">import asyncio
import re
import aiohttp
import logging
import os

# 定义日志文件
logging.basicConfig(level=logging.INFO,format="%(asctime)s-%(levelname)s:%(message)s")

# 定义初始页的url
INDEX_URL = "http://pic.netbian.com/4kdongman/index_{page}.html"
# 定义详情页的url
DETAIL_URL = "http://pic.netbian.com{id}.html"
# 定义壁纸的初始url
IMG_URL = 'http://pic.netbian.com{img_url}'

# 定义将要爬取的页数
PAGE_NUMBER = 147
# 定义爬取的信号量
CONCURRENCY = 5

# 构造存储壁纸的路径
PATH = "D:img"
if not os.path.exists(PATH):
    os.mkdir(PATH)

# 初始化信号量
semaphore = asyncio.Semaphore(CONCURRENCY)
session = None

# 此函数的功能是定义一个基本的抓取方法,传入url即可返回网页的源代码
async def scrape_api(url):
    async with semaphore:
        try:
            logging.info('scraping %s',url)
            async with session.get(url) as response:
                return await response.text()
        except aiohttp.ClientError:
            logging.error('error occurred while scraping %s',url,exc_info=True)

# 此函数的功能是构造初始页的url
async def scrape_index(page):
    url = INDEX_URL.format(page=page)
    return await scrape_api(url)

# 此函数的功能是定义详情页的url,并解析详情页,拿到img的url和名字
async def scrape_detail(id):
    url = DETAIL_URL.format(id=id)
    data = await scrape_api(url)
    IMG = re.search('<img src="(.*?)" data-pic',data,re.S).group(1)
    img_url = IMG_URL.format(img_url=IMG)
    name = re.findall('<img.*?title="(.*?)"',data,re.S)[0]
    return await scrape_save_img(img_url,name)

# 此函数的功能是访问图片的链接,并返回二进制数据
async def scrape_save_img(url,name):
    async with semaphore:
        try:
            logging.info('scraping %s',url)
            async with session.get(url) as response:
                img = await response.read()
                return await save_data(img,name)
        except aiohttp.ClientError:
            logging.error('error occurred while scraping %s',url,exc_info=True)

# 此函数的功能是存储图片
async def save_data(img,name):
    with open(f'D:img\{name}.jpg',"wb") as f:
        print('正在存储图片')
        f.write(img)
        f.close()
        print('图片存储成功')

# 主函数
async def main():
    global session
    # 初始化session
    session = aiohttp.ClientSession()
    # 定义爬取列表页的所有task
    scrape_index_tasks = [asyncio.ensure_future(scrape_index(page))for page in range(2,PAGE_NUMBER 1)]
    # 调用asyncio.gather方法传入task列表,将结果赋值给result,这个result就是所有task返回结果的列表
    result = await asyncio.gather(*scrape_index_tasks)
    logging.info('result %s',result)

    # 遍历result
    for index_data in result:
        # 判断index_data是否为空,防止出现空白index_data导致程序意外终止
        if not index_data:continue
        ids = re.findall('<li><a href="(.*?).html" target="_blank"><img',index_data,re.S)[1:20]
        # 声明爬取所有详情页task组成的列表
        scrape_index_tasks = [asyncio.ensure_future(scrape_detail(id))for id in ids]
        # 调用asyncio.wait方法调用执行,也可以用gather方法,效果一样,返回结果有差异
        await asyncio.wait(scrape_index_tasks)
    # 关闭session
    await session.close()

# 程序开始运行
if __name__ == '__main__':
    # 调用异步协程
    asyncio.get_event_loop().run_until_complete(main())

该方法获取的图片好像不是4K高清的,只有1K的清晰度

可以使用下面提供的方法,现将图片转4K,然后再无损压缩一下,就可以得到一个质量比较高的图片了。

其他方法获取高清壁纸

资源分享

分享一

分享二

免费图库

360壁纸

必应壁纸

动漫壁纸

搜图神器

搜图神器

图片优化

添加水印、图片压缩等

临时可以使用下面三个网站

改图鸭

改图宝

色彩笔(可以下载app)

图片去水印

非常好用的免费软件下载

代码语言:javascript复制
aHR0cDovL3Bhbi5xa29uZ3Rhby5jbi8lRTQlQjglQkIlRTclQkQlOTElRTclOUIlOTgvJUU4JUJEJUFGJUU0JUJCJUI2L1BDJUU4JUJEJUFGJUU0JUJCJUI2LyVFNSU5QiVCRSVFNyU4OSU4NyVFNSU4RSVCQiVFNiVCMCVCNCVFNSU4RCVCMC9JbnBhaW50X3Y4LjFfeDY0Nl85Znh3LmNvbS5leGU=

转4K

AI处理变清晰软件下载

代码语言:javascript复制
aHR0cDovL3Bhbi5xa29uZ3Rhby5jbi8lRTQlQjglQkIlRTclQkQlOTElRTclOUIlOTgvJUU4JUJEJUFGJUU0JUJCJUI2L1BDJUU4JUJEJUFGJUU0JUJCJUI2LyVFNiVBOCVBMSVFNyVCMyU4QSVFNSU5QiVCRSVFNyU4OSU4NyVFNSU4RiU5OCVFNiVCOCU4NSVFNiU5OSVCMC9BSSVFNSU5QiVCRSVFNSU4QyU5NiVFRiVCQyU4OEZ1bGwlRUYlQkMlODkuZXhl

一张很模糊的图片通过该软件处理后,可以变成一张质量很高的图片,真的能看出巨大的区别。 示例 图片处理前:

图片处理并压缩后:

gif截图和处理

gif截图工具

推荐两款巨好用的动图截图工具

GifCam

代码语言:javascript复制
aHR0cDovL3Bhbi5xa29uZ3Rhby5jbi8lRTQlQjglQkIlRTclQkQlOTElRTclOUIlOTgvJUU4JUJEJUFGJUU0JUJCJUI2L1BDJUU4JUJEJUFGJUU0JUJCJUI2L0dpZkNhbS56aXA=

Gif录屏

代码语言:javascript复制
aHR0cDovL3Bhbi5xa29uZ3Rhby5jbi8lRTQlQjglQkIlRTclQkQlOTElRTclOUIlOTgvJUU4JUJEJUFGJUU0JUJCJUI2L1BDJUU4JUJEJUFGJUU0JUJCJUI2L0dpZiVFNSVCRCU5NSVFNSVCMSU4Ri5leGU=

这两个功能差不多

Gif处理工具

图贴士

开源个人图库源码

这是一个很常见的图库源码,里面的图片是360壁纸、必应壁纸等开源图片。

预览地址:http://code.qkongtao.cn/wallpaper/

源码地址:https://gitee.com/KT1205529635/wallpaper

效果如下:

base64工具

base64工具

解码上面的下载链接

0 人点赞