AlexV's Blog

Welcome to my home.

Python爬虫之教务处新通知

2016-11-6 代码更新

main.py

hrefs.py

GetContent.py

SendCloud.py

 


上一篇写了教务系统的登录,不算真正意义上的爬虫。

这一篇大部分都是爬虫,加上用SendCloud发送邮件的部分内容。

前期准备:

  • 了解教务新通知链接模式
  • 了解教务通知页面的结构

逻辑实现:

  • 使用过Python抓取内容并格式化
  • 通过SendCloud进行通知发送

 

首先,我们来了解一下学校教务处的通知页面。http://jwc.jmu.edu.cn/class_show.asp?fid=1

《Python爬虫之教务处新通知》

随便打开一条,观察地址。

《Python爬虫之教务处新通知》

可以看到很明显的一个部分:bh=xxxx,很好理解,bh就是编号的意思,代表这条通知的编号是5225。

那么我们就可以知道通知的模式是“(url)/doc_show.asp?bh=xxxx此处用url代替前面部分的链接。

接着点开一个相邻的通知,继续观察链接。

《Python爬虫之教务处新通知》

现在可以暂时推断出,教务通知的编号是递增的,为我们后期获取新通知打下了基础。

下一步,观察整个页面。

此处不提供图…页面内标题被<b>包裹,内容被<p>包裹,附件链接被<a>包裹。标题为b[0],内容为p[0~],附件链接为a[0~]

一个基本的思路已经出来了,使用Python访问通知页面→抓取第一个<b>标签内容作为标题→抓取所有<p>的内容作为通知内容。

那么开始代码实现,再次使用BeautifulSoup

这样我们就直接获得了我们想要的内容。但是随着使用,发现了更多的问题。

  1. 通知推送的编号出现乱序或跳号
  2. (*)通知一次新增两条
  3. 通知内容为空,只有一个附件
  4. 通知直接链接到一个文件,无法作为页面读取
  5. 通知只含内容,不含附件链接

第一个问题,我的解决方法是,先获取一次首页所有通知的编号,存在一个文件中,然后通过每次对比是否一致来找出是否有新通知。

号码不递增分两种情况,比上一条通知大或比下一条通知小,如果小于则先获取新的一条,再回过头继续等待递增的下一条通知。

实现代码如下:

第二个问题,因为设定了每分钟获取,现在暂时还未碰到这种情况,所以暂时不重新改代码。

第三个问题,可以在一开始将content设为“无”,有内容时在开头添加一个换行符,即可解决这个问题。代码如下:

第四个问题,通过读取目标页面类型,判断是否为html页面,可以避免无用的抓取,代码如下:

第五个问题,通过判断是否有<a>来处理,方法与第三个类似,并且得到的链接需要进行格式化,代码如下:

最后,进入发送进程。

至此,整个获取通知到发送的过程已完成。效果图如图所示:

《Python爬虫之教务处新通知》

附上目录结构和所有代码:

《Python爬虫之教务处新通知》

get_page.py

send_email.py

 

点赞