文章目录
requests部分
明确需求
每次打开教务处网页实在是太麻烦了,要输入账号密码,然后登陆,最后再查询,上了大学以后就变得很懒了,所以我想写一段爬虫,可以很快地获取到我想要得到的内容。于是我有了如下需求:
- 输入“成绩查询”就可以得到相关数据,其余类似
- 爬虫自动化
- 以字典的形式返回数据
分析页面
目标网址
# 接下来的分析以“我的考试安排”为例,其余的处理很相似
url = "http://ehall.xjtu.edu.cn/jwapp/sys/studentWdksapApp/*default/index.do?amp_sec_version_=1&gid_=d1FSamp2Y2tzcmhLREI1UnBSZ2FUS0FiRHBTUS9SMkJJaFdZU2E5SnFCcnM4UWpRKzNHWExFSVZHRzJwL2wrbkxKdzN2eFJGRjhJWGF5dFkyMytUaVE9PQ&EMAP_LANG=zh&THEME=cherry#/wdksap"
页面分析
- 实现步骤:
- 首先我们点击右键,查看网页源代码,发现源代码内根本没有相关内容,这说明这个页面是由ajax渲染加载的,所以我们直接对这个页面的网址发送请求没有任何意义。
- 接下来我们需要寻找数据接口,打开“F12",寻找数据接口,通过preview发现了有一个网址有我想要的元素
url = "http://ehall.xjtu.edu.cn/jwapp/sys/studentWdksapApp/modules/wdksap/wdksap.do"
- 用requests请求访问,获取数据,处理数据
以上就是整个分析过程,我们终于获得了实际接口,并确定了爬取方式,接下来只需要很简单地写一段代码获取数据就行了。
爬取数据
我们需要用到requests中的post方法,所以切记:要带上data,否则请求会失败的。
import requests
import json
req = requests.session()
data = {
'XNXQDM': '2020-2021-2',
'*order': '-KSRQ,-KSSJMS'}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'}
rep=req.post('http://ehall.xjtu.edu.cn/jwapp/sys/studentWdksapApp/modules/wdksap/wdksap.do', data=data,
headers=headers)
content = rep.text
content = json.loads(content)
如果只是这么一段程序一定会报错的,报错如下:
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
这说明我们没有正确的获取到文本内容,返回去检查,如果我们打印出文本内容,会发现它和我们预期的完全不一样,内容有关于账号输入错误等等。根据这点提示我们可以想到:我们需要携带我们的登录信息,即加入cookie。
cookie如下:
Cookie: EMAP_LANG=zh; THEME=cherry; _WEU=0y8mOygQIDkyLBngGULcuv53LsbNzAi0XIqwXTOqJpfaCSB*JYPGxD5NINbhuNohVfospXNT76k5AcfBHIl2IxX3drQStkcyOgMrTP0VUr9JuPnMqSSp8j..; CASTGC=LQhyOrYKNl6UPpZ+qWQbBWVavdqe3K1VwXarvrBsEKvcRdFhFnqQaw==; MOD_AMP_AUTH=MOD_AMP_ec3f74e5-52af-4410-b6bf-89fd5971a00e; route=ab22dc972e174017d573ee90262bcc96; asessionid=c73fb5c1-4a72-40fe-a419-0fda107aa153; amp.locale=undefined; JSESSIONID=znWPu7n2I7JAjlgGNE779Tzbu03-HMqqURcM9Vb921mesC58rsHY!596962737
经过反复验证,我们发现网站实际上验证的是_WEU和MOD_AMP_AUTH两项,删除其余内容只保留这两个,并加入cookie中,即可获取数据。
import requests
import json
req = requests.session()
data = {
'XNXQDM': '2020-2021-2',
'*order': '-KSRQ,-KSSJMS'}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
'cookie':'_WEU=0y8mOygQIDkyLBngGULcuv53LsbNzAi0XIqwXTOqJpfaCSB*JYPGxD5NINbhuNohVfospXNT76k5AcfBHIl2IxX3drQStkcyOgMrTP0VUr9JuPnMqSSp8j..;MOD_AMP_AUTH=MOD_AMP_ec3f74e5-52af-4410-b6bf-89fd5971a00e'}
rep=req.post('http://ehall.xjtu.edu.cn/jwapp/sys/studentWdksapApp/modules/wdksap/wdksap.do', data=data,
headers=headers)
content = rep.text
# 下边的是简单的数据处理
content = json.loads(content)
dic = {
}
for i in range(len(content['datas']['wdksap']['rows'