中科大EPC课程爬取

中科大的日常交流英语和学术交流英语在完成20学时课堂学习的同时,还需要在英语语言实践中心(EPC)修满20学时的实践课,才能获得相应学分,而EPC的课程还是比较难选的,这里用Python爬取EPC课程来捡漏。具体实现流程是用Python每隔一分钟刷新一次EPC网站,如果有人退课,则用邮件通知自己。

EPC网站分析

进入EPC主页,发现网站的登录需要验证码,一开始的想法是用Cookies来模拟登录。具体做法如下:
登录EPC后,点击F12打开控制台,查看Network,勾选上Preserve log,然后点击“ Situational Dialogue”,在控制台中定位到正确的URL,同时复制请求头作为Python中的Headers,结果确实是可以在Python中爬取的,但这样有一个坏处,每次运行都需要先用浏览器登录EPC,然后复制新的Cookies。后来实验发现,在Python中登录EPC是不需要验证码的,所以这里采用另一种实现方法。

利用相同的方法,在Network中找到请求方法为“POST”的链接,即为登录链接,我这里使用requests.Session()来保留Cookies。

具体代码实现如下:

import requests,smtplib,email,time
from bs4 import BeautifulSoup as bs  #使用 BeautifulSoup库对页面进行解析
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.header import Header  MAX = 13 #作为周数的约束条件,最大值为21
INI = 125 #作为访问失败的无效值,随意定的
session = requests.Session()
#登录EPC
url_login ='http://epc.ustc.edu.cn/n_left.asp'
data={
'submit_type': 'user_login',
'name': 'xxxxxx',
'pass': 'xxxxxx',
'user_type': '2',
'Submit': 'LOG IN'
}
resp = session.post(url=url_login,data=data)#解析页面,返回列表:[week,星期,教师,学时,上课时间,教室]
def getInfo(url):resp = session.get(url)resp.encoding = resp.apparent_encoding#print(resp.text)soup = bs(resp.text,'html.parser' )tds = soup.select('td[align="center"]') return [int(tds[14].string[1:3]),tds[15].string,] + [string for string in tds[18].strings]#tds[0] #只显示可预约#tds[1] #预约单元#tds[2] #周数#tds[3] #星期几#tds[4] #教师#tds[5] #学时#tds[6] #上课时间#tds[7] #教室……#tds[14] #第多少周#tds[15].string #星期#tds[16].string #教师#[x for x in tds[18].strings] #时间
def getEPC():#返回数据:字典#key:name or INI#value:[week,星期,教师,学时,上课时间,教室] or [INI]try:url1 = 'http://epc.ustc.edu.cn/m_practice.asp?second_id=2001'  # Situational dialogueurl2 = 'http://epc.ustc.edu.cn/m_practice.asp?second_id=2002'  # Topical discussionurl3 = 'http://epc.ustc.edu.cn/m_practice.asp?second_id=2003'  # Debateurl4 = 'http://epc.ustc.edu.cn/m_practice.asp?second_id=2004'  # Dramaurl7 = 'http://epc.ustc.edu.cn/m_practice.asp?second_id=2007'  # Pronunciation Practiceinfo={}    info['Situational Dialogue']= getInfo(url1)info['Topical Discussion']= getInfo(url2)info['Drama']= getInfo(url4)info['Pronunciation Practice']= getInfo(url7)return infoexcept:return {INI:[INI]}
#邮箱发送
def SendMail(text):subject = 'EPC Crawling'sender = 'xxxxxx'receiver= ['xxxxxx',xxxxxx']msg = MIMEMultipart('mixed')msg['Subject'] = subjectmsg['From'] = sendermsg['To'] = ';'.join(receiver)text = MIMEText(text,'plain','utf-8')msg.attach(text)   smtp = smtplib.SMTP()smtp.connect('xxxxxx')username = 'xxxxxx'password = 'xxxxxx'smtp.login(username,password)smtp.sendmail(sender,receiver,msg.as_string())smtp.quit()
#主程序
if __name__=="__main__":while True:status = Trueinfo = getEPC()print(time.ctime(),':')for key,value in info.items():print('{}:{}'.format(key,value))print('\n')for key,value in info.items():if value[0] == INI: text = "EPC crawling stopped."print(text)#SendMail(text)status = Falsebreakif ((value[0] < MAX)): #这里或许可以另外建一个筛选规则text = 'There is a course of {} in week{},{},{},{}.'.format(key,value[0],value[1],value[2],value[3],end='\n\n')print(text)SendMail(text)if status==False:breaktime.sleep(60) #这里修改刷新频率

邮件内容如下:

因为我的邮箱是和微信绑定的,基本上是一爬取到课程,我就能收到,然后看情况能否选课。
因为中科大校园网并不稳定,这里另外建立一个脚本来调用上述代码:

import os
cmd = 'py epc.py'
while True:os.system(cmd) #可以增加一个每隔5s尝试一次

在使用Python之前,两个月才选了8节EPC,用了Python后,两周就修了12个EPC,科技改变生活。

结语

随着EPC课程的修满,这块代码也可以公开了。有两个可以遗憾的地方:一是筛选规则简单,导致一堆垃圾邮件。这里可以增加一个筛选规则,减少垃圾邮件,还可以定点查询某个时间段某个类型的课是否有空缺;二是不能自动选课,还需要自己在收到有课后登录网页选课,十分麻烦。留待他人优化吧。

中科大EPC课程爬取相关推荐

  1. 爬取网易云音乐个人动态中的视频(Ⅲ): 实现爬取过程

    回顾 有了 爬取网易云音乐个人动态中的视频(Ⅰ) 和 爬取网易云音乐个人动态中的视频(Ⅱ) 的铺垫, 编写爬虫的代码便显得没那么突出了. 实现 直接show代码! 给出加密的代码 encrypt_ap ...

  2. 面向CCF目录中的论文暴力爬取实现

    目录 面向CCF目录中期刊论文暴力爬取实现 第一章.数据对象说明 CCF:中国计算机学会 给出的推荐目录 DBLP数据库:没有任何==反爬机制==的计算机在线论文数据库 第二章.爬虫代码实现 第一步. ...

  3. bs4爬取的时候有两个标签相同_4.4 爬虫中的bs4数据爬取步骤

    >>.第三方包先安装 beatifulsoup抓取工具 位置:第三方开发包,如果使用,则需要单独下载的工具包 安装:后台命令:9版本以下----pip install bs4 或者 pip ...

  4. python爬取app中的音频_Python爬取抖音APP,只需要十行代码

    环境说明 环境: python 3.7.1 centos 7.4 pip 10.0.1 部署 [root@localhost ~]# python3.7 --version Python 3.7.1 ...

  5. python爬虫网页中的图片_Python爬取网页中的图片(搜狗图片)详解

    前言 最近几天,研究了一下一直很好奇的爬虫算法.这里写一下最近几天的点点心得.下面进入正文: 你可能需要的工作环境: 我们这里以sogou作为爬取的对象. 首先我们进入搜狗图片http://pic.s ...

  6. beautifulsoup爬取网页中的表格_PYTHON爬取数据储存到excel

    PYTHON爬取数据储存到excel 大家周末好呀,我是滑稽君.前两天上网课时朋友发来消息说需要爬取一些数据,然后储存到excel里.记得我公众号里发过关于爬虫的文章,所以找我帮个忙.于是滑稽君花时间 ...

  7. python爬取app中的音频_Python爬取喜马拉雅音频数据详解

    码农公社  210.net.cn  210是何含义?10月24日是程序员节,1024 =210.210既 210 之意. Python爬取喜马拉雅音频数据详解 一.项目目标 爬取喜马拉雅音频数据 受害 ...

  8. mysql好评中评统计_scrapy爬取京东笔记本及评论信息存入MySQL数据库

    爬取思路 1.分析页面,定义爬取字段 2.观察网页,分析接口url,通过xpath和json解析爬取内容字段 3.在pipelines.py写入存储方式 4.开始爬取 5.GitHub地址:https ...

  9. 猫眼电影票房爬取到MySQL中_爬虫之爬取猫眼电影专业版实时数据排行榜

    猫眼电影专业版实时数据排行榜是个持续更新的用ajax写成的网站,一般而言,爬取它比较麻烦,需要使用ajax/js进行爬取,python中的requests库可以获取网站的ajax,再通过json库解析 ...

  10. 猫眼电影票房爬取到MySQL中_猫眼电影爬取(一):requests+正则,并将数据存储到mysql数据库...

    前面讲了如何通过pymysql操作数据库,这次写一个爬虫来提取信息,并将数据存储到mysql数据库 1.爬取目标 爬取猫眼电影TOP100榜单 要提取的信息包括:电影排名.电影名称.上映时间.分数 2 ...

最新文章

  1. firewalld、netfilter、 netfilter5表5链、iptables介绍
  2. 计算机IO系列「零」计算机IO【硬件部分】
  3. Intellij IDEA + Maven + Cucumber 项目 (三):简单解释RunCukesTest.java
  4. html和css哪个优先,CSS3 | 样式和优先级
  5. 日志服务发布Windows Logtail,完整支持两大平台
  6. xtwpro2编程器_xtw100编程器驱动
  7. android获取mp3/mp4媒体信息
  8. haproxy实现mysql从库负载均衡
  9. java三元运算符_我把Java基础编程及思维导图整理的超级详细,小白都能看懂
  10. go语言[3]-数组
  11. 【矩阵论笔记】Schmidt正交化、标准正交基
  12. 2021年P气瓶充装模拟考试及P气瓶充装考试试题
  13. 用Python webdriver图书馆抢座自动预约的正确姿势
  14. 苹果 M1 革了 Intel x86 的命?
  15. java求数组的平均值_Java中数组求平均值,最大值,最小值。
  16. [SSM框架]—Spring入门
  17. 什么是前端渲染和后端渲染和SPA页面
  18. USB插座外壳接地的处理和emi,esd考虑
  19. note edge android 6.0 root,三星Note Edge N9150刷机包带ROOT权限固件ZCU1BOH2线刷Rom
  20. android+头像+程序,Android获取联系人头像的方法

热门文章

  1. PHP输出100以内的质数(包括普通写法和数组形式输出)
  2. 小白能读懂的 《手把手教你学DSP(TMS320X281X)》第四章(2) gel文件
  3. vue 针试打印机实现
  4. Cannot load php5apache2_4.dll into server解决办法;
  5. java企业员工考勤系统ssm框架
  6. zhihu spark集群,书籍,论文
  7. 未安装任何音频输出设备
  8. 工具篇:金蝶K3工具下载
  9. redis HSCAN命令及jedis的hscan方法
  10. java类 家族成员 姓氏_中国史上十大家族,占据中国九大姓,看看有没有你的姓氏...