Python爬虫入门教程 52
优采云 发布时间: 2020-08-10 17:48写在上面
关于获取文章自动发送到邮箱,这类需求似乎可以写好几个网站,弄完博客园,弄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>{title}--文章作者{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>
邮箱收到电邮
当收到短信的那一刻,你就可以感受到happy了~
部署到服务器
最后一个步骤,如果想要持续的获取,那么找一个服务器,然后布署就行啦,有兴趣的博友,继续研究下去吧~