前几天利用RSSHub的konachan.net路由做了一个每日更新博客首页图的脚本,几天过去之后我发现日志文件居然是这样的:
除了第一天的调试之外,完全没有获得到数据!!!
手动访问了几次rss连接,发现确实不能连接。看来这个RSS也不能用,干脆直接爬K站算了。
HTML分析
首先明确要爬取的url为http://konachan.net/post/popular_recent , 如果爬的是.com就要小心站点爆破。在浏览器中打开上面的连接,查看源。
先搜一下".jpg",结果有89个,但是这一页只有12张图片是我们要的,显然写正则表达式过于愚蠢。
使用BeautifulSoup解析之前要先分析代码。我们右击第一张图片检查,可以获得图片连接:
此页一共12张图片,我们发现<li>标签恰好也是12个,与图片一一对应。<div>标签包含了这张缩略图的信息,而<a>标签对应图片下的分辨率,超链接直接就是大图链接!!!
代码修改
获取链接
只需修改getpicurl()函数即可。
def getpicurl():
urllist = []
r = requests.get(url)
soup = BeautifulSoup(r.content,'lxml')
li = soup.body.find(id="content").div.div.ul.find_all("li")
for i in range(len(li)):
temp = li[i].find(class_="directlink largeimg")
if temp == None:
temp = li[i].find(class_="directlink smallimg")
urllist.append(temp['href'])
return urllist
这里有个坑,class_可能是"directlink smallimg"。
更新图片库
这里其实不需要修改,旧版本虽然会导致越更新总数越少,但每月手动添加几张也不是不能接受。
不过修改之后就可以保证图片库总数不变,不会因为新获得图片已经存在导致多删。
def updatepic(urllist):
oldfiles = os.listdir(gallerypath)
for i in urllist:
r = requests.get(i)
with open(gallerypath+r.headers['ETag'][1:-1]+".jpg", "wb") as code:
code.write(r.content)
newfiles = os.listdir(gallerypath)
l = len(newfiles)-len(oldfiles)
delpics(l,oldfiles)
f = open(logpath, 'a', encoding='utf-8')
f.write(time.asctime(time.localtime())+" "+str(l)+"张图片已更新\n")
def delpics(n:int,files):
d = random.sample(files,n)
for i in d:
os.remove(gallerypath+i)
修改完成后,添加服务即可。检查日志果然更新了12张图片。