爬取课程信息

    前几天在帮妹子做作业,发现需要用到学校的课程信息,所以就把学校选课网站上的课程都爬了下来。这里分享一下爬取的过程。

    首先打开学校选课网站。如下图:

aa.png

在课程查询页面,按F12,进入浏览器的调试模式。在调试模式下刷新网页,并随便输入一个查询条件,点击查询,然后可以在在调试窗口选择network->XHR查看浏览器发送的表单请求。如下图:

demo.png

    从这个页面可以知道浏览器刚刚跟服务器发送请求的具体信息,包括请求路径,cookie,浏览器代理信息等。在底下还可看到Form Data,这是刚刚给服务器发送的表单。展开看到:

formdata.png

    可以看到里面是之前输入的查询条件。

    根据上面得到的信息,就可以获取课程查询的结果了。如下代码:

import requests

date_url='http://xk.autoisp.shu.edu.cn/StudentQuery/CtrlViewQueryCourse'
user_agent = r'Mozilla/5.0 (Windows NT 10.0; Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3724.8 Safari/537.36'
cookie = 'ASP.NET_SessionId=xplk4jipgqunafctdf1wjbp4'
header = {
    'Content-Type':'application/x-www-form-urlencoded',
    'User-Agent':user_agent,
    'Connection': 'keep-alive',
    'Cookie': cookie
}
params={'Credit':0,'Campus':0,'NotFull':False,'DataCount':0,'PageIndex':1,'PageSize':100,'FunctionString':'InitPage'}
r = requests.post(url=date_url,  headers=header,data=params)
print(r.text)

运行结果如下:

bb.png

    这是个原始网页,而我想把课程信息从网页中提取出来。观察网页结构,发现课程信息是存储在表格中的,如果是用正则表达式提取的话,会很简单。获取所有课程的方法很简单,每次设置表单不同的学分,设置每个网页显示课程数多一点,通过循环就可以获取到所有的课程了。所以最终的代码如下:

import requests
import re
import csv
import time
#打开文件,追加a
out = open('春季课程.csv','a', newline='')
#设定写入模式
csv_write = csv.writer(out,dialect='excel')
f = open('temp.txt','w')

date_url='http://xk.autoisp.shu.edu.cn/StudentQuery/CtrlViewQueryCourse'
user_agent = r'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
cookie = 'ASP.NET_SessionId=xplk4jipgqunafctdf1wjbp4'
header = {
    'Content-Type':'application/x-www-form-urlencoded',
    'User-Agent':user_agent,
    'Connection': 'keep-alive',
    'Cookie': cookie
}
p1=r'<tr (.*?)>(.*?)/tr>'
pattern1 = re.compile(p1,re.M|re.S)
p2=r'>(.*?)</td>'
pattern2= re.compile(p2,re.M|re.S)
d={}
for i in range(17):
    time.sleep(1)
    params={'Credit':i,'Campus':0,'NotFull':False,'DataCount':0,'PageIndex':1,'PageSize':1000,'FunctionString':'InitPage'}
    r = requests.post(url=date_url,  headers=header,data=params)
    html_doc=r.text
    matcher1 = re.findall(pattern1,html_doc)
    for m in matcher1:
        t=m[1]
        matcher2= re.findall(pattern2,t)
        resultList=[]
        for te in matcher2:
            resultList.append(te.strip())#去掉空格
        #结果写入CSV
        if(len(resultList)>=11):
            csv_write.writerow(resultList[:3])
            csv_write.writerow(resultList[3:])
        else:
            csv_write.writerow(resultList)
        print(resultList)

    最终获取到了所有的课程:

cc.png

dd.png

首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于