前提摘要
Mashiro的Sukura主题第一个特性就是:
内带了一个返回随机图片的 API,把想要展示的图放到 /cover/gallery 中即可。
也就是目前博客首页那个每次刷新或者点左右箭头就会轮换的背景图,而且经常因为我的小水管带宽加载不出来www。
因此要更换封面图非常容易,把图片放到文件夹就行了。
图片哪来呢
群内色图君
校群里的@Marder经常发各种合集,所以最开始的几十张图片就是我在合集里随便复制的,主题全是明日方舟。
但是这样并不智能,下载+上传还要走我两遍流量消耗。
pixiv爬虫
因为之前就写过pixiv的爬虫,所以这次第一想法就是爬pixiv的日榜。
但是因为服务器在境内,爬pixiv真的不方便,还不安全。
萌导航爬虫
萌导航主页也有一个pixiv日榜,爬这个倒是很容易。
首先分析图片地址,可以发现缩略图和原图的地址并不一样,缩略图的地址是https://www.moe123.net/api/imageproxy//c/240x480/img-master/img/*******.jpg
,而原图地址是https://www.moe123.net/api/imageproxy///img-master/img/******.jpg
,*号省略的字符和pixiv一样,由图片上传时间和id组成。
之后打开F12观察,发现一个请求url为https://www.moe123.net/api/pixiv
,尝试访问了一下,返回的正是日榜的json数据,其中的url是缩略图地址,理论上自己修改一下就能获得原图地址。
然而这个时候我发现了几个恶性问题:
1.访问极不稳定,经常下载不动原图。这可能和网站的反爬有关,但在我进一步研究之前我发现了下面的问题;
2.日榜上经常有漫画页上榜,这些图片并不适合做背景,我也懒得去搞个机器学习区分;
3.万一日榜有R-18怕是要被整站爆破。
最总我放弃了从pixiv获取图片。
Konachan
这个时候我恰好想到了之前看过的一个项目叫RSSHub,其路由中恰好有个图片分类,我也就恰好在里面选了Konachan。
选Konachan主要是因为其余路由节点要么是R-18,要么不适合做背景;Konachan提供了一个全年龄的路由。
代码编写
万事俱备之后开始码代码了。
解析RSS的库是feedparser,pip install feedparser
,此外解析到文章内容时网上并没有进一步教程,所以我用了BeautifulSoup解析(不要和我说正则,我要是会正则还用feedparser干嘛,哭哭)。
# -*- coding: utf-8 -*-
from PIL import Image
import requests
import os
import shutil
from bs4 import BeautifulSoup
import feedparser
import random
import time
gallerypath = "C:/xampp/htdocs/blog/wp-content/themes/Sakura/cover/gallery/"
logpath = "C:/Program Files/konachancover/log.txt"
rss = "https://rsshub.app/konachan.net/post/popular_recent/1d"
# 设置图片储存路径、日志储存路径、RSS订阅url
def updatepic(urllist):
delpics(len(urllist))# 从原有图片库随机删掉对应数量的图片
for i in urllist:
r = requests.get(i)
with open(gallerypath+r.headers['ETag'][1:-1]+".jpg", "wb") as code:
code.write(r.content)
# 下载列表中url对应的图片。因为图片原名过长,用ETag替带文件名。
f = open(logpath, 'a', encoding='utf-8')
f.write(time.asctime(time.localtime())+" "+str(len(urllist))+"张图片已更新\n")
# 记录日志
def delpics(n:int):
files = os.listdir(gallerypath)
d = random.sample(files,n) # random.sample(list,n) 可以从list中随机选出不重复的n个元素
for i in d:
os.remove(gallerypath+i)
def getpicurl():
urllist = []
d=feedparser.parse(rss) # feedparser解析RSS
for i in d.entries: # entries是文章组成的列表,d.entries[index].summary是文章内容,下面用BeautifulSoup解析
soup = BeautifulSoup(i.summary,'lxml')
urllist.append(soup.body.img['src'])
return urllist # 获取到的url压入列表,返回。
if __name__ == '__main__':
while True:
try:
updatepic(getpicurl())
except:
pass
time.sleep(60*60*24) # 每日一次
附RSSHub的Github地址:https://github.com/DIYgod/RSSHub
2019年10月5日更新
有关延时的部分变更,请参阅 https://wildwizard.cn/2019/10/05/using_scheduled_tasks/
封装运行
采用NSSM封装为系统服务,官网为https://nssm.cc/ ,下载后对应系统版本找到64位/32位的nssm.exe,在目录控制台输入nssm install 服务名
即可弹出窗口安装服务。直接双击nssm.exe会显示帮助。
万事大吉