生活随笔
收集整理的這篇文章主要介紹了
中科大EPC课程爬取
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
中科大EPC課程爬取
中科大的日常交流英語和學(xué)術(shù)交流英語在完成20學(xué)時(shí)課堂學(xué)習(xí)的同時(shí),還需要在英語語言實(shí)踐中心(EPC)修滿20學(xué)時(shí)的實(shí)踐課,才能獲得相應(yīng)學(xué)分,而EPC的課程還是比較難選的,這里用Python爬取EPC課程來撿漏。具體實(shí)現(xiàn)流程是用Python每隔一分鐘刷新一次EPC網(wǎng)站,如果有人退課,則用郵件通知自己。
EPC網(wǎng)站分析
進(jìn)入EPC主頁,發(fā)現(xiàn)網(wǎng)站的登錄需要驗(yàn)證碼,一開始的想法是用Cookies來模擬登錄。具體做法如下:
登錄EPC后,點(diǎn)擊F12打開控制臺,查看Network,勾選上Preserve log,然后點(diǎn)擊“ Situational Dialogue”,在控制臺中定位到正確的URL,同時(shí)復(fù)制請求頭作為Python中的Headers,結(jié)果確實(shí)是可以在Python中爬取的,但這樣有一個壞處,每次運(yùn)行都需要先用瀏覽器登錄EPC,然后復(fù)制新的Cookies。后來實(shí)驗(yàn)發(fā)現(xiàn),在Python中登錄EPC是不需要驗(yàn)證碼的,所以這里采用另一種實(shí)現(xiàn)方法。
利用相同的方法,在Network中找到請求方法為“POST”的鏈接,即為登錄鏈接,我這里使用requests.Session()來保留Cookies。
具體代碼實(shí)現(xiàn)如下:
import requests,smtplib,email,time
from bs4 import BeautifulSoup as bs #使用 BeautifulSoup庫對頁面進(jìn)行解析
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 #作為周數(shù)的約束條件,最大值為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,星期,教師,學(xué)時(shí),上課時(shí)間,教室]
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] #只顯示可預(yù)約#tds[1] #預(yù)約單元#tds[2] #周數(shù)#tds[3] #星期幾#tds[4] #教師#tds[5] #學(xué)時(shí)#tds[6] #上課時(shí)間#tds[7] #教室……#tds[14] #第多少周#tds[15].string #星期#tds[16].string #教師#[x for x in tds[18].strings] #時(shí)間
def getEPC():#返回?cái)?shù)據(jù):字典#key:name or INI#value:[week,星期,教師,學(xué)時(shí),上課時(shí)間,教室] 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]}
#郵箱發(fā)送
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)): #這里或許可以另外建一個篩選規(guī)則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) #這里修改刷新頻率
郵件內(nèi)容如下:
因?yàn)槲业泥]箱是和微信綁定的,基本上是一爬取到課程,我就能收到,然后看情況能否選課。
因?yàn)橹锌拼笮@網(wǎng)并不穩(wěn)定,這里另外建立一個腳本來調(diào)用上述代碼:
import os
cmd = 'py epc.py'
while True:os.system(cmd) #可以增加一個每隔5s嘗試一次
在使用Python之前,兩個月才選了8節(jié)EPC,用了Python后,兩周就修了12個EPC,科技改變生活。
結(jié)語
隨著EPC課程的修滿,這塊代碼也可以公開了。有兩個可以遺憾的地方:一是篩選規(guī)則簡單,導(dǎo)致一堆垃圾郵件。這里可以增加一個篩選規(guī)則,減少垃圾郵件,還可以定點(diǎn)查詢某個時(shí)間段某個類型的課是否有空缺;二是不能自動選課,還需要自己在收到有課后登錄網(wǎng)頁選課,十分麻煩。留待他人優(yōu)化吧。
總結(jié)
以上是生活随笔為你收集整理的中科大EPC课程爬取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。