利用python3网络爬虫爬取成绩

因为最近在学习python3网络爬虫,想自己写一些小程序来实战一下。爬的是URP教务网

一开始的思路是利用beautiful模块来进行爬取相关的html信息,直接来得到需要的信息。结果发现程序运行不通…

后来查了一下,发现用re模块好啊…配合python正则表达式那是相当简单…

下面开始分析,代码编写阶段。

分析

学习模拟登陆

这是第一步,有两种简单的方法,可直接参考的链接:参考链接在此

一种是查看抓的包中的:

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
f __name__ == '__main__':
# 登陆页面的URL,此处的URL为登陆页面的URL以及在登陆之后的header中的request均可
url = 'http://60.219.165.24/loginAction.do'
# 设置相关的代理以及在登陆之后的fordate信息
# 'Connection': 'keep-alive' :保证持续连接
header = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
'Connection': 'keep-alive'}
login_fordate = {'zjh':'20160xxxxx',
'mm':'x'}
# 利用session方法爬取请求
s = requests.session()
response = s.post(url, data=login_fordate, headers=header)
# 验证登陆状态
if response.status_code == 200:
print('模拟登陆成功!')

不懂可查看文档:
requests文档


第二种是查看包中的cookie信息:

对应的实现模拟代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
if __name__ == '__main__':
# 登陆页面url
url = 'hhttp://60.219.165.24/loginAction.do'
# 设置代理相关
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
'Cookie':'JSExxxxxx=hxxxx-9Ixxxxxxx_xxxxxxxx',
'Connection': 'keep-alive'
}
# 利用session爬取请求,之后可方便的get与post
s = requests.session()
response = s.post(url=url, headers=headers)
# 验证登陆状态
if response.status_code == 200:
print('模拟登陆成功!')

相关的信息我用x换掉了。不懂的朋友可以看文档,查资料咯。再次说明一下,URL部分**可以是登陆界面的,也可以是登陆之后的URL,经过测试两者均可。**

分析网页

到了分析阶段了。

打开我的Chrome浏览器,开始分析每个链接的html信息,看看有没有我想要的信息。

根据下面的操作得到了本学期的成绩查询的相关的超链接。

再结合下面两张图的分析易知:本学期成绩查询的超链接为:http://60.219.165.24//bxqcjcxAction.do

超链接部分。


主URL部分。

为了保证准确性,再向某成绩采取相应的操作(如下图所示),再往上看看,就发现它是本学期成绩查询的一部分。


接下来就是编写代码了,以上若是有不懂的地方,还需要利用搜索引擎多多查询哟。

测试代码部分

编写测试代码,爬取网页html信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
if __name__ == '__main__':
# 登陆页面url
url = 'http://60.219.165.24//bxqcjcxAction.do'
# 设置代理相关
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
'Cookie':'JSExxxxxx=hxxxx-9Ixxxxxxx_xxxxxxxx',
'Connection': 'keep-alive'
}
# 利用session爬取请求,之后可方便的get与post
s = requests.session()
response = s.post(url=url, headers=headers)
# 设置成网页对应的编码格式
response.encoding = 'GB2312'
# 查看相关的网页内容
print(response.text)

运行查看效果:

成功得到了想要的html信息,接下来利用正则表达式选想要的部分即可。在这里要说明一下,不可用ForDate的那个模拟登陆,经过测试发现返回的是错误信息…所以以后老老实实用cookie模拟更为靠谱一点…

完整代码部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import requests
import re
if __name__ == '__main__':
# 登陆页面url
url = 'http://60.219.165.24//bxqcjcxAction.do'
# 设置代理相关
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
'Cookie':'JSESSIONID=xxxxxxxxxxx_gUJ4aiw',
'Connection': 'keep-alive'
}
# 利用session爬取请求,之后可方便的get与post
s = requests.session()
response = s.post(url=url, headers=headers)
# 设置成网页对应的编码格式
response.encoding = 'GB2312'
# 设置成为符合需要的表达式以及模式为'任意匹配模式'
pattern = re.compile('<tr.*?class="even".*?</td>.*?</td>.*?<td align="center">(.*?)</td>.*?&npsb;.*?</td>.*?</td>.*?</td>.*?<td>align="center">(.*?)&npsb;</P></td>.*?&npsb;</P>', re.S)
# 成绩信息采集
grades = re.findall(pattern, response.text)
# 输出对应的课程信息
for each_grades in grades:
print('课程名称:' + each_grades[0] + '分数:' + each_grades[1])

关于正则表达式的解说可结合python正则表达式此篇文章学习。

简单解说一下,先贴出来html信息是怎么样的。

只截取了一部分,可自行了解。

解说:

  1. .? 是一个固定的搭配,.和代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。

  2. (.?)代表一个分组,在这个正则表达式中我们匹配了两个分组,在后面的遍历grades中,grade[0]就代表第一个(.?)所指代的内容,grade[1]就代表第二个(.*?)所指代的内容,以此类推。

  3. re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。

最后

  • 参考文章列表:
  1. 参考一

  2. 参考二

  3. 参考三

还有一些文档,均可在官网上看到,利用搜索引擎即可。

---------------本文终---------------

文章作者:刘俊

最后更新:2019年01月02日 - 14:01

许可协议: 转载请保留原文链接及作者。