python 爬取传智播客作业题目

今天发一下我之前写了一会的关于爬取传智播客习题的爬虫。目前来说,其实是因为最近期末,然后想要爬取一下题库里的题,然后做一个题库出来,之所以这样,是因为老师并没有公布答案! 不过没想到传智播客居然是用 JavaScript 渲染的页面,而非普通的 HTML,难度很大对于初学者。

目前找到了想要的内容但是并不知道该如何爬取。

python爬取传智播客内容

首先在这里右键查看一下源代码,之所以如此,是因为我本来以为可以直接通过这里获取链接跳转的内容,然后爬取出来,但是没想到并没有,并且其实传智里面的页面代码是通过 JS 渲染的,所以应该通过 header 请求来获取数据。然后使用 F12 查看 Network,在寻找请求获取内容的时候,发现请求名为 list?status=&name=&pageNumber=1&pageSize=10&courseId=5b1d1d6e854e408b89043bb29c604313&type=1&t=1608267215390 这个的请求,里面的 preview 中,有想要获取到的内容 然后发现这里面的内容是一个 id,然后发现下面的题目的链接就是这个页面加上 id 即可。 所以其实通过 header 请求头,然后提取出来的 JSON 文件,再进行解析即可。 之后再获取题目里的内容即可。 其实这个我想了好久,因为当时不知道获取到的内容是 JSON,以为是字符串,然后通过正则来获取数据的时候,发现只能获取第一个匹配的,然后后来问了大佬才知道这是 JSON 的数据。

其实他这个是通过 JSON 传递的数据,然后里面是字典的镶嵌。

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
32
import requests_html
import re
import json

url = "http://stu.ityxb.com/back/bxg/my/busywork/findStudentBusywork?busyworkId=166955876c3b4bcf8ef39976dfe60e76&t=1608445306731"
url2 = 'http://stu.ityxb.com/lookPaper/busywork/166955876c3b4bcf8ef39976dfe60e76'

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
'Cookie': ''
}

res = requests_html.HTMLSession()
r = res.get(url, headers=headers)

text = json.loads(r.text)
text_xz = text['resultObject']["danxuan"]['lists']
neirong = {}
changdu = len(text_xz)

for i in range(1, len(text_xz) + 1):
wenzi = text_xz.pop(0)
text_xx = wenzi["questionOptionList"]
text_tm = str(i) + '.' + wenzi["questionContentText"]
print(text_tm)
with open('jsdx.text', 'a', encoding='utf-8') as f:
f.write('\n' + text_tm)
for num in range(len(text_xx)):
xx_dan = text_xx.pop(0)
xx_nei = xx_dan['text']
with open('jsdx.text', 'a', encoding='utf-8') as f:
f.write('\n' + xx_nei)

这里就能提取单选的内容了,然后再就是获取全部的内容就行了,但是发现有的作业里面只有单选或者只有判断之类的,然后我们可以通过 try 来进行报错处理,这样即使没有这个选项,也能运行下去。

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
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
import requests_html
import re
import json

url = "http://stu.ityxb.com/back/bxg/my/busywork/findStudentBusywork?busyworkId=166955876c3b4bcf8ef39976dfe60e76&t=1608445306731"
url2 = 'http://stu.ityxb.com/back/bxg/my/busywork/findStudentBusywork?busyworkId=655d240321db424ea37f4b55c2f132d2&t=1608476055939'

headers = {
'User-Agent': '',
'Cookie': ''
}

res = requests_html.HTMLSession()
r = res.get(url2, headers=headers)

text = json.loads(r.text)
text_xz = text['resultObject']["danxuan"]['lists']
neirong = {}

for i in range(1, len(text_xz) + 1):
wenzi = text_xz.pop(0)
text_xx = wenzi["questionOptionList"]
text_tm = str(i) + '.' + wenzi["questionContentText"]
print(text_tm)
with open('jsdx.text', 'a', encoding='utf-8') as f:
f.write('\n' + text_tm)
for num in range(len(text_xx)):
xx_dan = text_xx.pop(0)
xx_nei = xx_dan['text']
with open('jsdx.text', 'a', encoding='utf-8') as f:
f.write('\n' + xx_nei)
with open('jsdx.text', 'a', encoding='utf-8') as f:
f.write('\n' + '答案:')
try:
text_xz = text['resultObject']["duoxuan"]['lists']
for i in range(1, len(text_xz) + 1):
wenzi = text_xz.pop(0)
text_xx = wenzi["questionOptionList"]
text_tm = str(i) + '.' + wenzi["questionContentText"]
print(text_tm)
with open('jsdx.text', 'a', encoding='utf-8') as f:
f.write('\n' + text_tm)
for num in range(len(text_xx

)):
xx_dan = text_xx.pop(0)
xx_nei = xx_dan['text']
with open('jsdx.text', 'a', encoding='utf-8') as f:
f.write('\n' + xx_nei)
with open('jsdx.text', 'a', encoding='utf-8') as f:
f.write('\n' + '答案:')
except:
pass

try:
text_pd = text['resultObject']["panduan"]['lists']
for i in range(1, len(text_pd) + 1):
wenzi = text_pd.pop(0)
text_tm = str(i) + '.' + wenzi["questionContentText"]
print(text_tm)
with open('jsdx.text', 'a', encoding='utf-8') as f:
f.write('\n' + text_tm + '\n' + '答案:')
except:
pass

try:
text_tk = text['resultObject']["tiankong"]['lists']
for i in range(1, len(text_tk) + 1):
wenzi = text_tk.pop(0)
text_tm = str(i) + '.' + wenzi["questionContentText"]
print(text_tm)
with open('jsdx.text', 'a', encoding='utf-8') as f:
f.write('\n' + text_tm + '\n' + '答案:')
except:
pass

try:
text_jd = text['resultObject']["jianda"]['lists']
for i in range(1, len(text_jd) + 1):
wenzi = text_jd.pop(0)
text_tm = str(i) + '.' + wenzi["questionContentText"]
print(text_tm)
with open('jsdx.text', 'a', encoding='utf-8') as f:
f.write('\n' + text_tm + '\n' + '答案:')
except:
pass

这就是 Python 爬取传智播客的作业题目的完整代码了,不过问题是需要复制链接,不过还算可以吧,以后如果改进的话会贴出来的。 不过其实很容易,就是解析前一页的数据,把里面包含链接的内容提取出来,然后再传入 for 循环即可,如果想要尝试的话可以自行测试,有不懂的随时问我。 如果有什么不会的可以在评论区留言,我会在看到的第一时间回复的。

作者

datehoer

发布于

2020-12-21

更新于

2023-10-19

许可协议

评论