Python爬⾍——查询英语四、六级成绩
今天出六级成绩,很多⼈在成绩出来之后的⼀段时间都查询不到⾃⼰的成绩。晚上有空就写了⼀个爬⾍。
进⼊之后发现不能右键查看源代码,不过也没有关系,直接打开开发者⼯具
输⼊前两个信息后点击验证码输⼊框,发现出现两个新的GET请求
显然这是获取验证码的相关请求。点击第⼀个请求,可以发现验证码图⽚链接就在其中
后期可以使⽤正则表达式直接提取。再看请求信息。
可见此GET请求的url的参数包含3个参数:
1.考试类别。这⾥是查询英语四六级成绩,所以可以设置为固定的’CET’
2.准考证号
3.⼀个⼩数
第三个参数初步猜测是⼀个随机数,但是不确定。可以看见该⽹页的JavaScript源码
可以找到⽹站构造请求的⽅法。其中的()说明之前的猜测是正确的。
然后在请求返回的内容中提取图⽚地址:img_url=e('"(.*?)"').findall()[0]
获取验证码图⽚并保存到本地的代码如下(因为有验证码的相关操作,所以涉及到Cookies,为了⽅便使⽤会话Session):
本来想使⽤tesrocr来进⾏图⽚识别,结果发现如果不对图⽚进⾏较多的预处理,不能直接识别出图⽚中的验证码,于是直接简单粗暴的
让⽤户输⼊:)
#得到相关考⽣信息
defget_info():
id_num=input("输⼊准考证号:")
name=input("输⼊姓名:")
returnid_num,name
#获取图⽚
defget_img(Session,id_numm):
try:
headers={
'Connection':'keep-alive',
'Host':'',
'Referer':'/cet',
'Ur-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3486.0Safari/537.36',
}
s=headers
get_url='/?'
params={
'c':'CET',
'ik':id_numm,
't':()
}
respon=(get_url,params=params)
img_url=e('"(.*?)"').findall()[0]
img=(img_url,timeout=None)
withopen('D:/','wb')asf:
(t)
exceptExceptiona:
print("Imgae_Error:",)
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
29
到这⾥,可以开始构造查询成绩的请求了。再分析请求信息:在输⼊正确信息后观察
找到查询成绩的POST请求,查看其信息:
发现传递的数据中有两项:
1.包含三个参数:考试代码,准考证考,考⽣姓名
2.验证码
再看访问⽹页时产⽣的请求,发现中有相关信息:
defget_score(Session,id_num,name,level):
('D:/').show()
capcha=input('请打开图⽚输⼊验证码:')
1
2
3
可见tab对应的value就是考试代码。⽽上⽹查询可知准考证考中的第九位是判断考试类别的。⾄此,POST请求分析结束,开始写代码:
再观察query这个POST请求的Respon部分(图⽚上⾯有),可以发现信息存储的规律,同样使⽤正则表达式提取并显⽰出来:
⾄此,主要函数就构造完成。写主函数:
defget_info():
id_num=input("输⼊准考证号:")
name=input("输⼊姓名:")
level=id_num[9]
returnid_num,name,level
defget_score(Session,id_num,name,level):
('D:/').show()
capcha=input('请打开图⽚输⼊验证码:')
headers={
'Connection':'keep-alive',
'Host':'',
'Origin':'',
'Referer':'/cet',
'Ur-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3486.0Safari/537.36',
}
query_url="/cet/query"
test={
'1':'CET4_181_DANGCI',
'2':'CET6_181_DANGCI',
}
data={
'data':(level)+','+id_num+','+name,
'v':capcha
}
data=urlencode(data)
respon=(query_url,data=data,headers=headers)
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
29
30
id_num=e("z:'(.*?)'").findall()[0]
name=e("n:'(.*?)'").findall()[0]
school=e("x:'(.*?)'").findall()[0]
score=e("s:(.*?),").findall()[0]
listening=e("l:(.*?),").findall()[0]
reading=e("r:(.*?),").findall()[0]
writing=e("w:(.*?),").findall()[0]
rank=e("kys:'(.*?)'").findall()[0]
iflevel=='1':
print("n====================nn四级笔试成绩:")
eliflevel=='2':
print("n====================nn六级笔试成绩:")
print("准考证号:"+str(id_num))
print("姓名:"+str(name))
print("学校:"+str(school))
print("总分:"+str(score))
print("听⼒:"+str(listening))
print("阅读:"+str(reading))
print("写作与翻译:"+str(writing))
iflevel=='1':
print("n====================nn四级⼝试成绩:")
eliflevel=='2':
print("n====================nn六级⼝试成绩:")
print("等级:"+str(rank))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
四六级成绩查询的爬⾍就写好了:
完整代码如下:
defmain():
id_num,name,level=get_info()
s=n()
get_img(s,id_num)
get_score(s,id_num,name,level)
#后期打包成.exe时有⽤,如果不打包,可以删掉
#end=input("输⼊任意键退出...")
1
2
3
4
5
6
7
importrequests
importre
importrandom
fromPILimportImage
mporturlencode
defget_info():
id_num=input("输⼊准考证号:")
name=input("输⼊姓名:")
level=id_num[9]
returnid_num,name,level
defget_img(Session,id_numm):
try:
headers={
'Connection':'keep-alive',
'Host':'',
'Referer':'/cet',
'Ur-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3486.0Safari/537.36',
}
s=headers
get_url='/?'
params={
'c':'CET',
'ik':id_numm,
't':()
}
respon=(get_url,params=params)
img_url=e('"(.*?)"').findall()[0]
img=(img_url,timeout=None)
withopen('D:/','wb')asf:
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
29
30
31
withopen('D:/','wb')asf:
(t)
('D:/').show()
exceptExceptiona:
print("Imgae_Error:",)
defget_score(Session,id_num,name,level):
capcha=input('请打开图⽚输⼊验证码:')
headers={
'Connection':'keep-alive',
'Host':'',
'Origin':'',
'Referer':'/cet',
'Ur-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3486.0Safari/537.36',
}
query_url="/cet/query"
test={
'1':'CET4_181_DANGCI',
'2':'CET6_181_DANGCI',
}
data={
'data':(level)+','+id_num+','+name,
'v':capcha
}
data=urlencode(data)
respon=(query_url,data=data,headers=headers)
if'error':
e=e("'error':'(.*?)'|error:'(.*?)'").findall()[0]
ifeisnotNone:
#print(e)
if'验证码错误'ine[1]:
print("验证码输⼊错误!")
get_img(Session,id_num)
get_score(Session,id_num,name)
el:
print(e[0])
el:
id_num=e("z:'(.*?)'").findall()[0]
name=e("n:'(.*?)'").findall()[0]
school=e("x:'(.*?)'").findall()[0]
score=e("s:(.*?),").findall()[0]
listening=e("l:(.*?),").findall()[0]
reading=e("r:(.*?),").findall()[0]
writing=e("w:(.*?),").findall()[0]
rank=e("kys:'(.*?)'").findall()[0]
iflevel=='1':
print("n====================nn四级笔试成绩:")
eliflevel=='2':
print("n====================nn六级笔试成绩:")
print("准考证号:"+str(id_num))
print("姓名:"+str(name))
print("学校:"+str(school))
print("总分:"+str(score))
print("听⼒:"+str(listening))
print("阅读:"+str(reading))
print("写作与翻译:"+str(writing))
iflevel=='1':
print("n====================nn四级⼝试成绩:")
eliflevel=='2':
print("n====================nn六级⼝试成绩:")
print("等级:"+str(rank))
defmain():
id_num,name,level=get_info()
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
id_num,name,level=get_info()
s=n()
get_img(s,id_num)
get_score(s,id_num,name,level)
end=input("输⼊任意键退出...")
if__name__=='__main__':
main()
96
97
98
99
100
101
102
103
104
105
106
107
本文发布于:2022-11-24 06:40:30,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/10103.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |