使用Python抓取来获取博客文章,并定期将其发送到邮箱中
优采云 发布时间: 2020-08-08 21:42写在前面
关于获取文章并自动将其发送到邮箱,这种需求实际上可以编写多个网站,完成博客园,获取CSDN,获取黄金,获取其他内容,等等.
从博客园开始,了解基本要求,在python部分获得新文章,并每60分钟发送一次. 时间太短了,我想没有太多新博客了〜
这是抓取的页面
https://www.cnblogs.com/cate/python
您需要整理指定页面上的所有文章,记录文章的相关信息,并记录上一篇文章的时间. 将文章发送到指定的邮箱,更新上一篇文章的时间. 检查需要导入的模块列表.
import requests
import time
import re
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.header import Header
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
初始化基本数据
# 初始化数据
def __init__(self):
self.start_url = "https://www.cnblogs.com/cate/python"
self.headers = {
"user-agent": "Mozilla/..... Safari/537.36",
"referer": "https://www.cnblogs.com/cate/python/"
}
self.pattern = r'[\s\S.]*?(.*?)[\s\S.]*?[\s\S.]*?(.*?)([\s\S.]*?)'
self.last_blog_time = 0
self.need_send_articles = []
参数说明
分析博客页面的内容
涉及很多代码,我将在关键点上写上相应的注释
# 解析网页内容
def get_articles(self):
try:
# 正常的数据获取
res = requests.get(self.start_url,headers=self.headers,timeout=3)
except Exception as e:
print("error %s"% e)
time.sleep(3)
return self.get_articles() # 重新发起请求
html = res.text
# 这个地方的正则表达式是考验你正则功底的地方了
all = re.findall(self.pattern,html)
# 判断,如果没有新文章
last_time = self.change_time(all[0][3].strip().replace("发布于 ", ""))
if last_time self.last_blog_time):
self.need_send_articles.append({
"url":item[0],
"title":item[1],
"author":item[2],
"time":public_time
})
# 文章获取完毕,更新时间
self.last_blog_time = last_time
##### 测试输出
print(self.need_send_articles)
print("现在文章的最后时间为",self.last_blog_time)
##### 测试输出
将时间字符串转换为时间戳
使用时间戳直接比较大小,这非常方便
def change_time(self,need_change_time):
'''
# 时间的转换
:param need_change_time:
:return:返回时间戳
'''
time_array = time.strptime(need_change_time, "%Y-%m-%d %H:%M")
time_stamp = int(time.mktime(time_array))
return time_stamp
邮件发送链接
此博客是通过QQ邮箱发送的
为方便起见,我将列出QQ邮箱发送的一些参考文章
参考文章
# https://blog.csdn.net/qiye005/article/details/80789666
# https://blog.csdn.net/Momorrine/article/details/79881251
# https://www.cnblogs.com/lovealways/p/6701662.html
# https://www.cnblogs.com/yufeihlf/p/5726619.html
由于我使用的是QQ邮箱,因此在某些地方进行设置比较麻烦,发送短信的费用为2美分. 我建议您使用其他邮箱,设置相同~~
发送邮件send_email功能
阅读以上文章后,您可以撰写相应的电子邮件,非常简单
QQ邮箱是经过SSL认证的邮箱系统,因此要使用QQ邮箱发送邮件,您需要创建一个SMTP_SSL对象而不是SMTP对象
# 发送邮件
def send_email(self,articles):
smtp = smtplib.SMTP_SSL() # 这个地方注意
smtp.connect("smtp.qq.com",465)
smtp.login("860866679@qq.com", "授权码")
sender = '860866679@qq.com'
receivers = ['找个自己的其他邮箱@163.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
# 完善发件人收件人,主题信息
message = MIMEMultipart()
message['From'] = formataddr(["博客采集器", sender])
message['To'] = formataddr(["hi,baby", ''.join(receivers)])
subject = '你有新采集到的文章清单'
message['Subject'] = Header(subject, 'utf-8')
# 正文部分
html = ""
for item in articles:
html+=("<p><a href='{url}'>{title}</a>--文章作者{author}--发布时间{time}".format(title=item["title"],url=item["url"],author=item["author"],time=item["time"]))
textmessage = MIMEText('
新采集到的文章清单' +html,
'html', 'utf-8')
message.attach(textmessage)
# 发送邮件操作
smtp.sendmail(sender, receivers, message.as_string())
smtp.quit()</p>
邮箱收到的邮件
收到电子邮件后,您会感到高兴〜
部署到服务器
最后一步,如果要连续获取它,请找到服务器,然后进行部署. 感兴趣的博客作者,请继续学习〜