文章目录

  • 前言
  • 流程
  • 各部分说明
    • 获取网页-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\
  • 如果不填第三栏,任务计划程序的历史记录中会显示启动了,但程序实际没运行。

  • 如果第三栏填成了程序路径,历史记录中会显示任务启动失败。

成果

展示下从程序运行以来的记录:

定时爬取学校官网讲座公告并邮件发给自己相关推荐

  1. 爬取学校官网信息公告并存入数据库

    前段时间做了爬取学校信息并展示的小软件,爬取内容包括学校官网.教学管理系统.招生就业信息等,其中用到了QueryList库.翻页爬虫,定时爬虫,插入数据库等 不熟系QueryList的可以看一下我的这 ...

  2. Python 数据采集-爬取学校官网新闻标题与链接(基础)

    Python 爬虫爬取学校官网新闻标题与链接 一.前言 二.扩展库简要介绍 01 urllib 库 (1)urllib.request.urlopen() 02 BeautifulSoup 库 (1) ...

  3. Python 数据采集-爬取学校官网新闻标题与链接(进阶)

    Python 爬虫爬取学校官网新闻标题与链接(进阶) 前言 一.拼接路径 二.存储 三.读取翻页数据 四.完整代码展示 五.小结 前言 ⭐ 本文基于学校的课程内容进行总结,所爬取的数据均为学习使用,请 ...

  4. python --爬虫爬取学校官网新闻并下载到本地

    IDE:jupyter Notebook python version:python 3.6 目标数据:学校官网新闻(一页) 网址:* 使用到的库:requests urllib re Beautif ...

  5. 【爬虫基础】爬取学校官网分页招聘信息

    **爬取某学校就业网站招聘信息** 用到的包 from urllib.request import urlopen import requests import json 一.获取不同页面的url 在 ...

  6. python小小爬虫(一)—— 爬取学校官网通知(仅作为练习使用)

    无聊拿来玩儿,仅作为练习用. 文章目录 分析 代码 效果 分析 找到文本的所处的div即可,注意应该是文本(一般是<span>text</span>这种形式)的上一级div,即 ...

  7. Scrapy+crontab 定时爬取小说更新推送到手机邮件

    Scrapy+crontab 定时爬取小说更新推送到手机邮件 本人酷爱追火星引力的<逆天邪神>小说,但经常是俩三天才一更,每天打开浏览器查看是否更新贼痛苦.现在利用所学的知识来解决问题.文 ...

  8. 【爬虫】用Python爬取去哪儿网热门旅游信息(并打包成旅游信息查询小工具)

    以下内容为本人原创,欢迎大家观看学习,禁止用于商业用途,谢谢合作! ·作者:@Yhen ·原文网站:CSDN ·原文链接:https://blog.csdn.net/Yhen1/article/det ...

  9. Scrapy实战篇(一)之爬取链家网成交房源数据(上)

    今天,我们就以链家网南京地区为例,来学习爬取链家网的成交房源数据. 这里推荐使用火狐浏览器,并且安装firebug和firepath两款插件,你会发现,这两款插件会给我们后续的数据提取带来很大的方便. ...

最新文章

  1. pd16.5生成mysql列说明_PowerDesigner16逆向工程生成PDM列注释(My Sql5.0模版)
  2. CrowdHuman 测试
  3. 2010信息科工作总结
  4. Exchange 常见问题之二----3
  5. 使用DataTable作为存储过程的参数
  6. notes邮件正文显示不全_python实现一次性批量发邮件
  7. java异常顺序_网易新闻
  8. pandas series取值_【小学生级】pandas入门到精通备查表——AI未来系列3
  9. mybatis 取查询值_Oracle结合Mybatis实现取表TOP 10条数据
  10. 蓝桥杯 ADV-224 算法提高 9-1九宫格
  11. Linux 命令(28)—— tee 命令
  12. 猜数游戏--MOOC中习题
  13. Linux下配置安装NFS
  14. 差异基因p为0_【i春秋杯网络安全联赛WriteUp】为逆行者加油
  15. 小程序 省市区地址选择器
  16. VoIP技术(2)--语音编码算法-1
  17. yaml参数文件的使用
  18. android 模拟器传文件夹里,夜神安卓模拟器和电脑互传文件的操作流程
  19. Unity3D人物模型精选——迷你卡通风格篇
  20. html5 arc 椭圆,html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形

热门文章

  1. 几个函数的功能 #记住我 #nops #strcpy #strstr #substr
  2. 如何发起一份电子合同?
  3. 可以修改APP数据库(图标、名称、背景等)的简单方法
  4. 文字排版--字体/--字号、颜色
  5. xpath java html_Java 使用HtmlCleaner、Saxon和XPath(XPathEvaluator)进行html查找解析的方法...
  6. 程序员的上帝视角(2)——我所体悟的思维方式
  7. 财务分析之产品营业利润分析
  8. 如何制作网页链接自动录入工具
  9. 《明解C语言》笔记及课后习题答案 【第十一章】
  10. Spring Boot前后端分离之后端开发