最近翻b站翻到一个有意思的视频,动态壁纸的原理的确挺简单的,用几行代码就可以实现,感兴趣的可以自行尝试。
当然,这篇文章不是介绍动态壁纸原理的,而是介绍如何使用动态壁纸。
目前动态壁纸比较火的有两个产品:
-
-
Wallpaper Engine
后者可以通过Steam购买和下载使用。
-
图片
-
在图片基础上加上动效,比如下雨、下雪、水波纹等
-
从电影、动画等处截取的视频
-
在静态图基础上,抠图后用类似Live2D的技术做出的动图,然后压制成视频格式
事实上创意工坊中大多数都是前两种,但显然效果并不好。第三种虽然乍一看很花里胡哨,但并不适合作为桌面壁纸长时间使用,会分散注意力,有种喧宾夺主的感觉。
最后一种是效果最好的,但抠图和制作动图是个体力活,非常麻烦,有的甚至还要考虑版权要先联系原画师,总之质量上乘的动图依然是个稀缺资源。
当然,还有一种特殊的WE创意工坊中勾上R18之后会找到的透视图,就不需要多介绍了,懂的都懂。
具体壁纸这里就不介绍了,在B站可以搜到一堆介绍视频,这里介绍我关注的WE创意工坊中几个不错的动图作者:
按ID查找就能找到,其中不乏一些量大管饱的优秀动图作者。
最后说说元气壁纸这个后起之秀,不同于买断的WE,元气壁纸采用免费+会员+壁纸收费的策略。和WE创意工坊都靠为爱发电不同,元气一开始就是冲着用收费吸引动图作者,再用优秀的动图吸引用户这个商业模式去的。当然不能说有问题,毕竟只要版权没有什么毛病,收费是合理的。但是,这个软件有流氓软件的嫌疑,虽然我没有安装,但是知乎上有一大堆“如何彻底删除元气壁纸”之类的问题。
但是,如果你关注B站一些动图作者和原画师,就能发现,很多都已经开始被元气壁纸拉拢,从发表各平台动态壁纸变成了元气壁纸独占。对于这种情况,我只能选择尝试合理(bai)获取(piao)。
一开始我是打算在虚拟机装一个元气壁纸,然后尝试下载视频文件到本地解析的,但似乎新版元气壁纸已经对视频文件进行了加密,这条路不通。
后来我在CSDN上看到了一个元气壁纸的爬虫代码,可以从元气壁纸的一个“半公开”的Web站点爬视频,当然内容可能没有正式壁纸分辨率那么高,但至少解决了有无问题。我爬了几条后发现完全不用那么麻烦,该站点还提供了检索功能,完全可以直接搜索想要的动态壁纸,然后通过浏览器抓包media文件来获取视频。如果你安装了IDM之类的嗅探工具其实更简单。
提供一个该站点的网址,请谨慎使用:
再提供一个该站点的爬虫程序:
import requests
from lxml import etree
import threading
from queue import Queue
import os
import time
pageUrlQueue = Queue()
downloadQueue = Queue()
def parsePageUrl(pages):
for page in range(1,pages+1):
url = "https://bizhi.ijinshan.com/dtag_109/index_"+str(page)+".shtml"
print(url)
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
}
res = requests.get(url=url,headers=headers)
res.encoding = res.apparent_encoding
html = etree.HTML(res.text)
time.sleep(1)
divs = html.xpath("//div[@class='wallpaper-wrapper']/div")
for div in divs:
try:
i = div.xpath("./a/@data-image-id")[0]
d = div.xpath("./a/@data-classify-id")[0]
u = "https://bizhi.ijinshan.com/d_" + d+"/"+i+".shtml"
pageUrlQueue.put(u)
print("url parse worker:{} is build.".format(u))
except:
pass
def getDownloadUrl():
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55" ,
}
while True:
if not pageUrlQueue.empty():
try:
url = pageUrlQueue.get()
res = requests.get(url= url,headers=headers)
res.encoding = "utf-8"
html = etree.HTML(res.text)
src = html.xpath("/html/body/div[1]/section[1]/div[2]/div[1]/video/@src")[0]
title = html.xpath("/html/body/div[1]/section[1]/div[1]/div/h1/text()")[0]
downloadQueue.put((title,src))
print("download worker {},{} is build".format(title, src))
except :
pass
def downloadDynamicWallPictrue():
while True:
if not downloadQueue.empty():
title ,src = downloadQueue.get()
file_name = "./动态壁纸/{}.mp4".format(title)
if os.path.exists(file_name):
print("file {} already download, skip.".format(file_name))
continue
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55" ,
}
time.sleep(1)
res = requests.get(url=src,headers=headers).content
if not os.path.exists("./动态壁纸"):
os.mkdir("./动态壁纸")
with open(file_name,mode="wb") as f:
f.write(res)
f.close()
print(title,"下载成功")
if downloadQueue.empty():
break
def newThread(func,count):
for _ in range(count):
threading.Thread(target=func,).start()
if __name__ == '__main__':
pages = input("请输入爬取页数: ")
pages = int(pages)
parsePageUrl(pages)
newThread(getDownloadUrl,5)
newThread(downloadDynamicWallPictrue,5)
我在原程序基础上改了改,但依然有点问题,程序无法正常退出,不过就像我前边说的,这个爬虫的必要性存疑,所以就没继续改了。
原始代码发表页面:
文章评论