【4.2】爬取 Python123 网站上的python二级考试选择题【和编程题】题库
本帖最后由 MyModHeaven 于 2022-4-2 10:27 编辑考计算机二级,我准备的 python 科目,在学校图书馆我找到了这本书:《高教版 Python 语言程序设计冲刺试卷(含线上题库)》(第 3 版),ISBN:978-7-04-053636-2。虽然这本书是2020年出版的,但python考试大纲变化不大,我又想白嫖,,,。激活码还没被用过,我给用了,得到了线上题库。其实线上题库就是书中的内容,只是在 python123 的网站上可以做而已。
今天我把里面的选择题题库爬下来了,来分享一下。选择题包括公共基础知识和python单选题,公共基础知识又包括计算机系统、数据结构与算法、程序设计基础、软件工程基础和数据库设计基础,python单选题库包括python语法基础、基本数据类型、程序的控制结构、函数和代码复用、组合数据类型、文件和数据格式化、python基础生态和python计算生态。
因为没账号在 python123 上看不到题库,所以我把程序源码和爬下来的题都发一下
```py
from selenium import webdriver
from selenium.webdriver.common.by import By
import xlsxwriter
browser = webdriver.Chrome()
browser.maximize_window()
browser.get('https://python123.io/index/login')
'''
# 扫码登陆
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser.find_element(By.XPATH, '//button[@class="button is-primary is-outlined is-fullwidth"]/i').click()
WebDriverWait(browser, 30).until(EC.text_to_be_present_in_element((By.CLASS_NAME, 'is-text-small'), '我的主页'))
'''
# cookie 登录
browser.delete_all_cookies()
browser.add_cookie({})
browser.get('https://python123.io/student/series/12/')
browser.implicitly_wait(5)
catalogs = browser.find_elements(By.XPATH, '//div[@class="catalog"]')
d = {}
for catalog in catalogs:
catalog_head = catalog.find_element(By.CLASS_NAME, 'heading').text
node_a = catalog.find_elements(By.XPATH, './div/a')
items = []
for a in node_a:
name = a.find_element(By.XPATH, './/div[@class="media-content"]/b').text
url = a.get_attribute('href')
items.append((name, url))
d = items
def c_pool(part):
# 爬取选择题题库
wb = xlsxwriter.Workbook('d:/{}.xlsx'.format(part))
global d
for item in d:
ws = wb.add_worksheet(item)
d = {'A1': '序号', 'B1': '题干', 'C1': '选项A', 'D1': '选项B', 'E1': '选项C', 'F1': '选项D', 'G1': '答案'}
for l in d:
ws.write(l, d)
n = 2
browser.get(item+'/choices')
browser.find_element(By.XPATH, '//div[@class="column is-3"]/div/div/div/div').click()
node_div = browser.find_elements(By.XPATH, '//div[@class="column is-9"]/div/div/div')
for div in node_div:
index = div.find_element(By.CLASS_NAME, 'problem-index').text
body = div.find_element(By.CLASS_NAME, 'mce-content-body').text
options = div.find_elements(By.XPATH, './/div[@class="options is-clickable"]/div/div')
options =
answer = div.find_element(By.XPATH, './div/div/span').text
content =
for i in range(7):
ws.write('ABCDEFG'+str(n), content)
n += 1
wb.close()
c_pool('公共基础知识题库')
c_pool('PYTHON 单选题库')
```
https://wwp.lanzouy.com/b01jb6omj
密码:fnok
虽然就这一点东西,但也花了一天的时间,从昨天晚上到今天下午。中间碰到两个实在解决不了的问题,也通过吾爱得到了答案,事后来看,真的不是什么问题。
- 用了两个第三方库:selenium 和 xlsxwriter,selenium 用来爬取网页的内容,xlsxwriter 用来把内容写入到excel文件里
- 一开始写的是扫码登陆,但是在调试过程中发现太麻烦,每次都要登录,所以尝试用cookie登录。这是第一次用,不知道怎么弄,光知道是个字典。就 F12 找cookie,虽然找到了,但是没用对,登录不上。后来就扫码登陆,然后得到cookie,再用cookie登录。将cookie写入本地txt文件后,发现有三个。百度之后,知道了cookie必须有的是 name 和 value, 即:cookie = {'name': '', 'value': ''},其他的可以没有。虽然不知道三个cookie有什么不同,但是一个一个试,试到第二个就成功登陆了
- selenium 的显式等待也是前天刚弄会的,发现以前一直报错只是因为少了一对括号而已,大意了
- 最大的收获是学了一个语法糖,翻笔记发现我以前记过,只是忘了,看来笔记还是要常看
> [【python】如何优雅的把这3个字符串和一个列表放在一个列表里?](https://www.52pojie.cn/thread-1610711-1-1.html)
- 网站上还有编程题和几套试卷,但是那些比选择题麻烦,不知道有没有时间爬
- 今天是第一次用 xlsxwriter ,都是临时百度学的,没弄excel单元格的格式,所以文件里列宽很小,看的时候自己调吧
[!(https://s1.ax1x.com/2022/03/25/qNg3DI.jpg)](https://imgtu.com/i/qNg3DI)
[!(https://s1.ax1x.com/2022/03/25/qNga8g.jpg)](https://imgtu.com/i/qNga8g)
[!(https://s1.ax1x.com/2022/03/25/qNgBKs.jpg)](https://imgtu.com/i/qNgBKs)
https://static.52pojie.cn/static/image/hrline/1.gif
4.2 更新
这次我把简单编程题爬下来了,由于编程题的题干比选择题复杂,我用 selenium 登录上后,直接截图保存。绝大部分的题目都完全在截图内,个别的截不全也不影响做题。后面的简单应用题和复杂应用题就不能截图了(因为截不全,并且影响做题)
```py
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
browser.maximize_window()
browser.get('https://python123.io/index/login')
# cookie 登录
browser.delete_all_cookies()
browser.add_cookie({})
browser.get('https://python123.io/student/series/12/modules/167/programmings')
browser.implicitly_wait(5)
i = 0
while i < 60:
titles = browser.find_elements(By.XPATH, '//div[@class="card-content programming-card"]')
node_b = titles.find_elements(By.XPATH, './/div[@class="media-content"]/b')
name = ''.join()
titles.click()
browser.implicitly_wait(1)
try:
browser.find_elements(By.XPATH, '//div[@class="card-content condense vertical-align has-border-bottom"]/div/a').click()
except IndexError:
browser.find_elements(By.XPATH, '//div[@class="card-content condense vertical-align has-border-bottom"]/div/a').click()
time.sleep(1)
browser.execute_script('window.scrollTo(0,120)')
browser.save_screenshot('D:\基本编程题\{}.png'.format(name))
browser.back()
i += 1
```
[!(https://s1.ax1x.com/2022/04/02/qIPJ61.jpg)](https://imgtu.com/i/qIPJ61)
https://wwp.lanzouy.com/iZqBT02gm1yb 为了爬虫,正在学基础的我一点也看不懂你的代码{:301_972:} beyond1994 发表于 2022-3-25 21:34
为了爬虫,正在学基础的我一点也看不懂你的代码
其实没想象中的那么难,因为我的体会是:学python,先学基础知识,但是学完基础什么也干不了,学完基础后学习使用各种库,才能做点有实际意义的事情;但是没学过的库,光看代码确实看不懂,只要学了,看两眼就知道是在干什么
都说python是胶水语言,在我看来,基础知识是python的胶水,将各个库衔接起来,实现某个目的。 我一般用csv写。excel还得安装第三方库。不过我们新手学习爬虫,多练习挺好的。 MyModHeaven 发表于 2022-3-25 21:44
其实没想象中的那么难,因为我的体会是:学python,先学基础知识,但是学完基础什么也干不了,学完基础后 ...
确实,感觉python最好的是'.'的使用,顺藤摸瓜慢慢就懂了 MyModHeaven 发表于 2022-3-25 21:44
其实没想象中的那么难,因为我的体会是:学python,先学基础知识,但是学完基础什么也干不了,学完基础后 ...
啊?你的意思是基础要看,第二部是学各种库嘛?你爬虫是学完基础再去找爬虫课程的嘛,还是说单独去找某个库的使用方法?。 哈哈哈 这个是好东西啊 不用买新版本的书了 感谢分享,正在找这种资源呢{:1_893:} 厉害厉害👍🏻👍🏻 人才啊!🤙🤙🤙
页:
[1]
2