定时爬取学校官网讲座公告并邮件发给自己
文章目录
- 前言
- 流程
- 各部分说明
- 获取网页-Request库
- 从HTML中提取数据-BeautifulSoup库
- BeautifulSoup-转换成`BeautifulSoup` 的对象
- find()-查找
- attrs-属性
- 发送邮件
- 开通SMTP功能
- 小练习
- 代码
- 打包
- PyInstaller用法
- 语法:
- 其他用法
- 在python代码中运行Pyinstaller
- 最终运行
- 定时运行
- 成果
前言
作为上电的一份子,学校的讲座必不可缺,但麻烦的是讲座公告在学校官网发布。想知道最近有无讲座还得打开浏览器-书签-上电官网-放大-点进去,然后注意下讲座的时间是否过期。网页对手机还没做适配。太麻烦了!
我就想能否自动爬取该页面,一有更新就把消息发送给我?
在学习了python爬虫和邮件发送功能后我感觉我能做了,于是就开始捣鼓起来。
流程
各部分说明
获取网页-Request库
帮助文档:https://docs.python-requests.org/zh_CN/latest/
本人学习记录:https://www.wolai.com/fBGguVWnNNhfQE7s5nP8is
pip install requests
安装第三方库
>>> import requests
>>> r = requests.get("https://www.bilibili.com/")
>>> r.status_code # 如果不是200,表示访问服务器有异常
200
>>> r.encoding = r.apparent_encoding # 指定编码为从内容中分析出的编码
>>> print(r.text)
# 输出的前100字符
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><title>哔哩哔哩 (゜-゜)つロ 干杯~-bilibili</titl
从HTML中提取数据-BeautifulSoup库
帮助文档:https://beautifulsoup.readthedocs.io/zh_CN/latest/
本人学习记录:https://www.wolai.com/iAFWbu3KacKLMybjpcgBz9
pip install beautifulsoup4
安装第三方库
BeautifulSoup-转换成BeautifulSoup
的对象
格式: bs4.BeautifulSoup(<要解析的文本>, <解析器>)
文本例如:'<title>The Dormouse's story</title>'
解析器推荐使用lxml
,因为效率更高,可能需要pip下载
ps: 在该转换过程中,都采用utf-8编码
# 复用上面的内容
from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text, 'lxml')
print(soup.prettify())
# 将结构化输出内容
--------------
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"/><title>哔哩哔哩 (゜-゜)つロ 干杯~-bilibili</title><meta content="bilibili是国内知名的视频弹幕网站,这里有及时的动漫新番,活跃的ACG氛围,有创意的Up主。大家可以在这里找到许多欢乐。" name="description"/>
...
find()-查找
find_all()
方法将返回文档中符合条件的所有标签,返回列表类型
find()
方法将返回找到标签的第一个
# 复用上面的内容
>>> soup.find('title') # 寻找title标签
<title>哔哩哔哩 (゜-゜)つロ 干杯~-bilibili</title>
>>> soup.find_all('a', class_='name') # 寻找所有class属性为name的a标签,由于html中class与python中class冲突,所以用class_
[<a class="name" href="//www.bilibili.com/v/douga/mad/">MAD·AMV</a>, <a class="name" href="//www.bilibili.com/v/douga/mmd/">MMD·3D</a>, ...]
attrs-属性
可以获取标签特定属性的内容,直接使用返回字典类型
# 复用上面的内容
>>> tag = soup.find('a', class_='name')
>>> tag.attrs
{'href': '//www.bilibili.com/v/douga/mad/', 'class': ['name']}
>>> tag.attrs['href']
'//www.bilibili.com/v/douga/mad/'
发送邮件
两个模块:
smtplib -用来发送邮件
email -用来写邮件
开通SMTP功能
建议不用163邮箱,本人使用时发现无法开通该项功能。
以QQ邮箱为例:
打开邮箱设置-账户
下拉至SMTP服务,开启(本人为已开启状态),会得到一个授权码,先记下来
小练习
import smtplib
from email.mime.text import MIMEText
from email.header import Header# 写邮件
msg = MIMEText("Hello,world!来自自己的第一封信。", "plain") # plain表示纯文字,若是html页面则改为html
msg["Subject"] = Header("来自Python的信~") # 主题
msg["To"] = Header("自己") # 接收者的称呼
msg["From"] = Header("我") # 发送者的称呼# Send
try:smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465) # 不同邮箱地址和端口不一样,详情见下smtp_obj.login("**********@qq.com", "************") # QQ邮箱账号与密码smtp_obj.sendmail("**********@qq.com", "*********@*****.com", msg.as_string()) # 发送者的邮箱和接受者的邮箱print("mail has been send successfully.")
except smtplib.SMTPException as e:print(e)
smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465)
该句用来指定邮箱服务器地址和端口,在邮箱网站上能查到
以QQ邮箱为例:
代码
注: 关键信息需要自己填写
import requests
from bs4 import BeautifulSoup
import time
import os
import smtplib
from email.mime.text import MIMEText
from email.header import Header# 记录日志
def log(text):with open('log.txt', 'a', encoding='utf-8') as f:f.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '\t' + text + '\n')# 获取网页
def get_html_text(get_url):try:r = requests.get(get_url, timeout=30)r.raise_for_status() # 如果status_code不是200,则会引发HTTPError异常r.encoding = r.apparent_encodingreturn r.textexcept:return "get_html_text产生异常"# 解析网页
def html_parse(html):try:title_list = []url_list = []soup = BeautifulSoup(html, 'lxml')page = soup.find('ul', class_='wp_article_list')lecture_soup = page.find_all('a')for line in lecture_soup:title = line.attrs['title']url = line.attrs['href']title_list.append(title)url_list.append(url)return title_list, url_listexcept:return "html_parser产生异常"# 读取讲座标记点
def read_lecture_data(filename):try:with open(filename, 'r', encoding='utf-8') as f:return f.read()except:return -1# 保存讲座标记点
def save_lecture_data(filename, content):with open(filename, 'w', encoding='utf-8') as f:f.write(content)pass# 数据处理
def parse_web_data(url, filename):html = get_html_text(url)title_list, url_list = html_parse(html)first_lecture_title = read_lecture_data(filename)# 存储讲座标记点的文件未创建if first_lecture_title == -1:save_lecture_data(filename, title_list[0])log('创建文件完成,下次正式运行~')os._exit(0)# 讲座未更新elif first_lecture_title == title_list[0]:log('检查完成')os._exit(0)# 有更新else:save_lecture_data(filename, title_list[0])index = title_list.index(first_lecture_title)new_lecture = []pre_url = '/'.join(url.split('/')[:3])for i in range(index):new_lecture.append([title_list[i], pre_url + url_list[i]])return new_lecture# 发送邮件
def send_email(content):smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465)smtp_obj.login("发送方邮箱账号", "SMTP授权码") # <-这里自己填写for j in range(len(content)):# 记录日志log(content[j][0])html = get_html_text(content[j][1])soup = BeautifulSoup(html, 'lxml')emailbody = str(soup.find('div', class_='article-box')) + '\n' + '原文链接:' + content[j][1]msg = MIMEText(emailbody, "html") # 这里发送的是html页面,所以后一项写为htmlmsg["From"] = Header("上电讲座爬虫") # 发送人称呼msg["To"] = Header("自己") # 接收人称呼msg["Subject"] = Header(content[j][0], 'utf-8') # 标题为讲座标题smtp_obj.sendmail("发送方邮箱账号", "接收方邮箱地址", msg.as_string()) # <-这里自己填写 print(f"{content[j][0]} 发送成功")if __name__ == '__main__':target_url = 'https://news.shiep.edu.cn/lecture/list.htm'lecture_filename = 'first_lecture_title.txt'lecture = parse_web_data(target_url, lecture_filename)send_email(lecture)
打包
我使用了PyInstaller来打包该python文件。Pyinstaller会收集代码所依赖的库形成单个文件夹或一个exe文件。
它是一个第三方库,可通过pip安装
pip install pyinstaller
具体可参考帮助文档:https://pyinstaller.readthedocs.io/
PyInstaller用法
语法:
pyinstaller [options] script
最简单的即是打开cmd,进入文件所在路径,输入
pyinstaller 文件名.py
以本文件为例,结果是
在dist目录下有可执行文件,运行结果如图
其他用法
用法 | 说明 |
---|---|
–distpath DIR | 指定exe文件存放位置(默认:./dist) |
–workpath WORKPATH | 指定临时文件存放位置(默认:./build) |
-a, --ascii | 不支持unicode(默认:可用则支持) |
–clean | 清理 PyInstaller 缓存并删除临时文件。 |
-D, --onedir | 生成包含可执行文件的文件夹(默认) |
-F, --onefile | 生成单可执行文件 |
-c, --console, --nowindowed | 打开控制台窗口(默认) |
-w, --windowed, --noconsole | 不打开控制台窗口 |
-i, --icon <FILE.ico or “NONE”> | 指定可执行文件的图标,或显示默认图标 |
在python代码中运行Pyinstaller
可键入如下代码
import PyInstaller.__main__PyInstaller.__main__.run(['my_script.py','--onefile','--windowed'
])
它等同于
pyinstaller my_script.py --onefile --windowed
最终运行
pyinstaller -F -w -i favicon.ico 上电讲座报告2.py
尝试使用--clean
发现无效果
尝试不带-w
,使用中会出现命令行窗口
定时运行
利用任务计划程序
创建基本程序
填写名称和描述(描述选填)
按需定时
这里注意:第一栏填写程序路径,第三栏填写程序所在目录路径
举例:
第一栏:C:\Debug\Pyinstaller\dist\上电讲座报告2.exe
第三栏:C:\Debug\Pyinstaller\dist\
如果不填第三栏,任务计划程序的历史记录中会显示启动了,但程序实际没运行。
如果第三栏填成了程序路径,历史记录中会显示任务启动失败。
成果
展示下从程序运行以来的记录:
定时爬取学校官网讲座公告并邮件发给自己相关推荐
- 爬取学校官网信息公告并存入数据库
前段时间做了爬取学校信息并展示的小软件,爬取内容包括学校官网.教学管理系统.招生就业信息等,其中用到了QueryList库.翻页爬虫,定时爬虫,插入数据库等 不熟系QueryList的可以看一下我的这 ...
- Python 数据采集-爬取学校官网新闻标题与链接(基础)
Python 爬虫爬取学校官网新闻标题与链接 一.前言 二.扩展库简要介绍 01 urllib 库 (1)urllib.request.urlopen() 02 BeautifulSoup 库 (1) ...
- Python 数据采集-爬取学校官网新闻标题与链接(进阶)
Python 爬虫爬取学校官网新闻标题与链接(进阶) 前言 一.拼接路径 二.存储 三.读取翻页数据 四.完整代码展示 五.小结 前言 ⭐ 本文基于学校的课程内容进行总结,所爬取的数据均为学习使用,请 ...
- python --爬虫爬取学校官网新闻并下载到本地
IDE:jupyter Notebook python version:python 3.6 目标数据:学校官网新闻(一页) 网址:* 使用到的库:requests urllib re Beautif ...
- 【爬虫基础】爬取学校官网分页招聘信息
**爬取某学校就业网站招聘信息** 用到的包 from urllib.request import urlopen import requests import json 一.获取不同页面的url 在 ...
- python小小爬虫(一)—— 爬取学校官网通知(仅作为练习使用)
无聊拿来玩儿,仅作为练习用. 文章目录 分析 代码 效果 分析 找到文本的所处的div即可,注意应该是文本(一般是<span>text</span>这种形式)的上一级div,即 ...
- Scrapy+crontab 定时爬取小说更新推送到手机邮件
Scrapy+crontab 定时爬取小说更新推送到手机邮件 本人酷爱追火星引力的<逆天邪神>小说,但经常是俩三天才一更,每天打开浏览器查看是否更新贼痛苦.现在利用所学的知识来解决问题.文 ...
- 【爬虫】用Python爬取去哪儿网热门旅游信息(并打包成旅游信息查询小工具)
以下内容为本人原创,欢迎大家观看学习,禁止用于商业用途,谢谢合作! ·作者:@Yhen ·原文网站:CSDN ·原文链接:https://blog.csdn.net/Yhen1/article/det ...
- Scrapy实战篇(一)之爬取链家网成交房源数据(上)
今天,我们就以链家网南京地区为例,来学习爬取链家网的成交房源数据. 这里推荐使用火狐浏览器,并且安装firebug和firepath两款插件,你会发现,这两款插件会给我们后续的数据提取带来很大的方便. ...
最新文章
- pd16.5生成mysql列说明_PowerDesigner16逆向工程生成PDM列注释(My Sql5.0模版)
- CrowdHuman 测试
- 2010信息科工作总结
- Exchange 常见问题之二----3
- 使用DataTable作为存储过程的参数
- notes邮件正文显示不全_python实现一次性批量发邮件
- java异常顺序_网易新闻
- pandas series取值_【小学生级】pandas入门到精通备查表——AI未来系列3
- mybatis 取查询值_Oracle结合Mybatis实现取表TOP 10条数据
- 蓝桥杯 ADV-224 算法提高 9-1九宫格
- Linux 命令(28)—— tee 命令
- 猜数游戏--MOOC中习题
- Linux下配置安装NFS
- 差异基因p为0_【i春秋杯网络安全联赛WriteUp】为逆行者加油
- 小程序 省市区地址选择器
- VoIP技术(2)--语音编码算法-1
- yaml参数文件的使用
- android 模拟器传文件夹里,夜神安卓模拟器和电脑互传文件的操作流程
- Unity3D人物模型精选——迷你卡通风格篇
- html5 arc 椭圆,html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
热门文章
- 几个函数的功能 #记住我 #nops #strcpy #strstr #substr
- 如何发起一份电子合同?
- 可以修改APP数据库(图标、名称、背景等)的简单方法
- 文字排版--字体/--字号、颜色
- xpath java html_Java 使用HtmlCleaner、Saxon和XPath(XPathEvaluator)进行html查找解析的方法...
- 程序员的上帝视角(2)——我所体悟的思维方式
- 财务分析之产品营业利润分析
- 如何制作网页链接自动录入工具
- 《明解C语言》笔记及课后习题答案 【第十一章】
- Spring Boot前后端分离之后端开发