网站内容更新的通知(有没有更新不就行了的实现思路(一)(组图) )
优采云 发布时间: 2022-04-10 19:07网站内容更新的通知(有没有更新不就行了的实现思路(一)(组图)
)
前言
最近一直在追小说,没事的时候会时不时去看看有没有更新,所以写了个脚本帮我看看有没有更新。
文本
实现想法
首先找到我们平时看小说的网站,爬取小说的目录页,查看章节是否更新,发邮件通知自己有更新,否则继续爬取查看。
执行
我用过网站这个,(盗版小说网站,有能力的请支持正版)。
1.先在搜索栏搜索你的小说,看看有没有你在追的小说
2. 仔细分析url,你会发现每本小说都有一个或多个id,格式如下。15_15698、12_12366 等
3.提取最新章节数,对比你看到的章节数。如果该数字大于该数字,则将其视为更新。
4.提取内容并发送邮件(百度发送方法有很多教程)
如果你也用这个网站看小说,可以直接修改我的源码使用。代码附在文章的末尾
代码运行
就算脚本帮你查小说有没有更新,那你也必须一直保持脚本运行,所以有云服务器肯定是最好的,毕竟你的电脑总是关机的。我将自己的代码挂在自己的服务器上。linux运行命令示例如下 nohup python3 -u listen.py -a 12_12585 -n 1000 --email= > novel.log &
命令解释
nohup 表示退出远程连接终端时程序不会被杀死(ps -aux 可以看到正在运行的程序,可以自己试试)
> novel.log & 在后台执行并将输出重定向到 Novel.log 文件
-a -n --email 这些是输入参数
python3 -u -listen.py 在python3环境下运行listen.py脚本,-u代表实时输出到文件,否则查看novel.log时可能是空文件
(本来想用django写一个网站,让一些没有服务器的读者也可以用小说通知这个脚本,但是开发中没有时间,所以如果没有服务器,挂在这台机器上或者换个方式。)
总结
之前用beautifulsoup库来解析获取数据,但是在找工作的时候发现很多人会问懂xpath,所以这次只用了xpath。
然后学会了用命令行输入nohup、ps等参数和命令。虽然我的博客很幼稚(绝不抄袭,坚决原创),但我可以边玩边学。不是为了它。
<p>import smtplib
from email.mime.text import MIMEText
# email 用于构建邮件内容
from email.header import Header
# 用于构建邮件头
from lxml import etree
import requests
import re
import time
import getopt
import sys
def send_mail(content):
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = 'XXXXXX'
password = 'XXXXXXX'
# 发信服务器
smtp_server = 'smtp.qq.com'
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
msg = MIMEText(content,'plain','utf-8')
# 邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('更新了')
# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL(host=smtp_server)
server.connect(smtp_server,465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())
# 关闭服务器
server.quit()
#爬取文章内容
def get_content(urls):
global new_art
new_art = new_art + int(len(urls))
all_content = ''
#因为是从最新的章节获取,所以倒序迭代
for detial in reversed(urls) :
#网络波动有时请求会失败,暂停一会在请求
while True:
url = host + detial
try:
res = requests.get(url=url,headers=headers)
except:
time.sleep(60)
else:
break
res.encoding = "utf-8"
html = etree.HTML(res.text)
title = html.xpath('//div[@class="bookname"]/h1/text()')
all_content = all_content + title[0] +'\n' + '网页链接:' + url + '\n'
content = html.xpath('//div[@id="content"]/text()')
#删除多余的无用字符
content = re.sub(r'[(\\u3000)\']','',str(content),count=0,flags=re.M|re.I)
all_content = all_content + content + '\n'
return all_content
#通过标题获取章节数
def get_new_art_num(text):
art_num = re.search('\d+',text[0])
return int(art_num.group(0))
#获取该网页最新的五章,检查是否更新
def get_url(a_id):
url = host + a_id + '/'
re = requests.get(url=url, headers=headers)
re.encoding = "utf-8"
tree = etree.HTML(re.text)
new_art_url = []
#获取最新的五章
#正常小说一天也不会更新超过五章,如果有自己修改
for i in range(1,6):
i = str(i)
art_title = tree.xpath('//div[@id="list"]//dd[' + i + ']/a/text()')
art_url = tree.xpath('//div[@id="list"]//dd[' + i + ']/a/@href')
if get_new_art_num(art_title)