小白学习,大佬绕行
目录
背景、设计
最近准备考个软考证,官网上看我所在地区一直没有开始报名,就想写个python脚本定时去获取信息,如果发现我所在地区的报名信息就自己给自己发封邮件。
代码其实很简单,主要分两个部分,一:匹配网页上的信息,二:发送邮件。匹配网页信息主要使用正则表达式需要用到re包,发送邮件主要用到smtplib和一些辅助包。
思路
打开网站
通过开发者模式或鼠标右键打开查看网页源代码,来匹配你想要信息所在的html语句以及该html使用的编码格式。
url = "https://bm.ruankao.org.cn/sign/welcome" #原始url
page = urllib.request.urlopen(url).read().decode('utf-8') #读取,此处需要导入urllib.request
pattern = r'<div class="layui-col-md5 col1">(.*?)</div>' #正则表达式匹配所需数据
content = re.findall(pattern, page, re.S) #获取所需数据
此处简要介绍正则表达式,.*?
表示任意字符,(.*?)
表示提取符合模式的字符。当要提取的字符前后出现太长其他无专一特性的字符时便可用.*?来代替。
至此,获取网页信息已经完成,下面是发送邮件模块。
邮件发送
完整的邮件系统分为发件服务器和收件服务器,发件服务器为SMTP,例如QQ邮箱发件服务器为smtp.qq.com,收件服务器为IMAP。发邮件只需要通过你邮箱的发件服务器,故你需要知道你使用邮箱的发件服务器地址以及其端口,一般smtp端口为465,imtp端口为993。通过一般性邮件发送,需要开启你的SMTP、IMAP\POP3服务,并获取授权码(不需要你的账号密码)。
smtp = smtplib.SMTP_SSL(mail_server) #mail_server为发件服务器如smtp.qq.com
smtp.connect(mail_server,465) #连接上发件服务器
smtp.login(mail_sender,mail_code) #登录,邮箱账号+授权码
smtp.sendmail(mail_sender,mail_receiver,msg.as_string()) #发送邮件信息
授权码以qq邮箱为例,进入POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务设置,选择开启IMAP/SMTP服务,便可以得到你邮箱账户的授权码。
完整代码
# -*- coding: UTF-8 -*-
import re
import urllib.request
import smtplib
from bs4 import BeautifulSoup
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
def get_data():
url = "https://bm.ruankao.org.cn/sign/welcome"
#终端执行pip3 install BeautifulSoup4 BeautifulSoup4为解析网页包
page = urllib.request.urlopen(url).read().decode('utf-8')
#soup = BeautifulSoup(page, 'html.parser') #
#print(soup) #输出信息即为网页源代码,我用来测试用
pattern = r'<div class="layui-col-md5 col1">(.*?)</div>'
content = re.findall(pattern, page, re.S)
#print(len(content))
for province in content:
if province == '某省名': #匹配到便发送短信
send_msg()
break
# print(province)
def send_msg():
mail_server = 'smtp.qq.com' #邮箱服务器,若服务默认端口不是465需要单独配置
mail_sender = '1212121211212@qq.com' #发件人邮箱
mail_code = 'XXXXXXXXXXXXX' #授权码
mail_receiver = ['1221212212212@qq.com','131313131313@qq.com'] #收件人邮箱
mail_title = '2022上半年XX省软考报名通知' #邮件名
mail_content = '''
<meta http-equiv="Content-Type"content="text/html;charset=utf-8">
<p>您好!软考XX地区已开始报名,请登录:</p>
<p><a href='https://bm.ruankao.org.cn/sign/welcome'>https://bm.ruankao.org.cn/sign/welcome</a></p>
'''
#邮件内容
msg = MIMEText(mail_content,'html')
msg["Subject"] = Header(mail_title,'utf-8')
msg["From"] = mail_sender
msg["To"] = ','.join(mail_receiver)
#msg.attach(MIMEText(mail_content,'html'))
try:
smtp = smtplib.SMTP_SSL(mail_server) #python3.7修改了此处
smtp.connect(mail_server,465) #python3.7修改了此处
#smtp = smtplib.SMTP_SSL()
#smtp.connect(mail_server,465)
smtp.set_debuglevel(1) #允许调试,0为不允许
smtp.ehlo(mail_server) #对服务器say hello
smtp.login(mail_sender,mail_code)
smtp.sendmail(mail_sender,mail_receiver,msg.as_string())
smtp.quit()
print("发送成功!")
except smtplib.SMTPException:
print("发送失败!")
if __name__ == "__main__":
get_data()
至于脚本执行,我是在Linux上写了个定时任务来执行这个python文件。