由于很久之前的某一次在抖音上刷到了一个很赞的,分享海贼王壁纸的up主,后面他也经常更新高质量海贼王壁纸的图集,我觉得很赞,因此想自己全部下载保存下来,所以有了这次图片采集的折腾经历。过程大概就是先从某个渠道采集抖音该UP主的图片资源,然后使用shell脚本处理这些图片的名称和快速导入某个文件夹,最后挑选不好的图片删掉。 后来又想到自己搞一个个人的专属图库,就想到使用python爬虫爬取线上壁纸图片,由于技术问题,爬取的这些图片并不是4K图片,因此又折腾图片AI优化转4K,但转出来的图片有些大,最后就进行尽量的无损压缩,最终得到的图片大小竟然和1K的图片大小差不太多,但图片已经是4K,画质也高了不少。因此想把这个折腾的过程记录一下!
抖音采集使用的抖音采集工具。 下载地址:
aHR0cDovL3Bhbi5xa29uZ3Rhby5jbi8lRTQlQjglQkIlRTclQkQlOTElRTclOUIlOTgvJUU4JUJEJUFGJUU0JUJCJUI2L1BDJUU4JUJEJUFGJUU0JUJCJUI2LyVFNiU4QSU5NiVFOSU5RiVCMyVFOSU4NyU4NyVFOSU5QiU4NiVFNSVCNyVBNSVFNSU4NSVCNy43eg==
这个工具使用很简单,应该稍微看一下就能上手使用了,可以采集某个视频作者的全部作品,包括图集,具体就不多介绍。
另外如果想去水印解析单个作品,则可以使用下面的工具: 工具一 工具二
抖音采集后的目录大概是这样子
每个图集作品的结构如下
这样就会有一个问题,好几十个图集文件夹,里面图片的名称全部都是01.webp ~ 13.webp,如果放在同一个文件夹里面就会文件名冲突。 因此需要一个方法可以快速将文件重命名,并且全部移入一个总的文件夹里面。 作为程序员,我第一个想到的肯定是使用linux命令,通过写一个脚本就可以很轻松的实现这样的功能:
脚本具体如下:
#! /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,然后保存图片文件。 爬虫的方法网上很多,贴一个亲试可用的代码:
<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,然后再无损压缩一下,就可以得到一个质量比较高的图片了。
临时可以使用下面三个网站
非常好用的免费软件下载
aHR0cDovL3Bhbi5xa29uZ3Rhby5jbi8lRTQlQjglQkIlRTclQkQlOTElRTclOUIlOTgvJUU4JUJEJUFGJUU0JUJCJUI2L1BDJUU4JUJEJUFGJUU0JUJCJUI2LyVFNSU5QiVCRSVFNyU4OSU4NyVFNSU4RSVCQiVFNiVCMCVCNCVFNSU4RCVCMC9JbnBhaW50X3Y4LjFfeDY0Nl85Znh3LmNvbS5leGU=
AI处理变清晰软件下载
aHR0cDovL3Bhbi5xa29uZ3Rhby5jbi8lRTQlQjglQkIlRTclQkQlOTElRTclOUIlOTgvJUU4JUJEJUFGJUU0JUJCJUI2L1BDJUU4JUJEJUFGJUU0JUJCJUI2LyVFNiVBOCVBMSVFNyVCMyU4QSVFNSU5QiVCRSVFNyU4OSU4NyVFNSU4RiU5OCVFNiVCOCU4NSVFNiU5OSVCMC9BSSVFNSU5QiVCRSVFNSU4QyU5NiVFRiVCQyU4OEZ1bGwlRUYlQkMlODkuZXhl
一张很模糊的图片通过该软件处理后,可以变成一张质量很高的图片,真的能看出巨大的区别。 示例 图片处理前:
图片处理并压缩后:
推荐两款巨好用的动图截图工具
GifCam
aHR0cDovL3Bhbi5xa29uZ3Rhby5jbi8lRTQlQjglQkIlRTclQkQlOTElRTclOUIlOTgvJUU4JUJEJUFGJUU0JUJCJUI2L1BDJUU4JUJEJUFGJUU0JUJCJUI2L0dpZkNhbS56aXA=
Gif录屏
aHR0cDovL3Bhbi5xa29uZ3Rhby5jbi8lRTQlQjglQkIlRTclQkQlOTElRTclOUIlOTgvJUU4JUJEJUFGJUU0JUJCJUI2L1BDJUU4JUJEJUFGJUU0JUJCJUI2L0dpZiVFNSVCRCU5NSVFNSVCMSU4Ri5leGU=
这两个功能差不多
Gif处理工具
这是一个很常见的图库源码,里面的图片是360壁纸、必应壁纸等开源图片。
预览地址:http://code.qkongtao.cn/wallpaper/
源码地址:https://gitee.com/KT1205529635/wallpaper
效果如下:
解码上面的下载链接