python简单实践作业答案_python入门实践四:爬取牛客网面试专项练习题及答案

说明:个人练手python用。

操作系统:window10 x64

IDE:Pycharm 2017.2.2

Python版本:3.6.2

目标

牛客网是一个IT笔试面试的平台,提供了很多题库,今天我们使用python爬取其中的Java专项练习库。

步骤

1、接口抓取:如果是爬取网页,前后端分离的项目可以抓取接口,如果没有分离,则需要爬取整个网页然后使用正则筛选。这里我们直接抓取客户端接口即可。

2、模拟网络请求,获取数据(这里是json)

3、json解析,题目格式调整、写入文件

一、接口抓取

工具:Fiddler

对象:牛客网Android客户端2.21.3.3091

通过Fiddler发现,获取专项练习题的接口为:

http://m.nowcoder.com/test/get-all-question?t=02436CC60E649584D5C4BBF57709E5CA&fm=android_app_2.21.3.3091&tid=10716711

这里:

t=02436CC60E649584D5C4BBF57709E5CA应该是用户身份标识

tid=10716711是本次练习的编号(Java专项练习一共900多道题,每次练习会随机组卷,组卷数量为5、10、20、30这些,这个tid就是组出的试卷的编号)

使用Fiddler模拟请求,就可以得到该tid对应10道题目的json数据了,由于每次请求tid没有变化,可以发现多次请求的json结果是一样的,类似下面的:

{

"data": {

"paper": {

......省略部分

"diffcult": 3,

"questionCount": 10,

......省略部分

},

"allQuestion": [

{

"score": 10,

"shielded": false,

"question": {

"content": "

\n 下列关于构造方法不正确的是:( \n )\n

\n

\n
\n

\n

\n
\n

",

"id": 69561,

"title": "下列关于构造方法不正确的是:( )",

"answer": [

{

"content": "类的构造方法和类同名",

"id": 111297,

"type": 0

},

......省略部分

],

......省略部分

},

"pos": 1

},

......省略部分

],

"userAnswers": [

{

"userAnswer": "111300",

"pos": 1

},

......省略部分

]

},

"code": 0,

"msg": "OK"

}

要想不一样,就需要不一样的tid了,发现生成tid的接口如下:

POST http://m.nowcoder.com/itest/request-make-paper HTTP/1.1

......省略部分request header

questionCount=10&tagIds=570&t=02436CC60E649584D5C4BBF57709E5CA&fm=android_app_2.21.3.3091&source=1

这是一个post请求,可以发现在request body中的questionCount就是表明了本次组卷试题的数量。

这样思路就清晰了:

根据request-make-paper接口获取tid,这里我们指定questionCount为30

根据get-all-question接口,传入tid参数,获取此次组卷的30道题的json数据

然后分析这30道题中的字段的含义,解析、存储即可

二、网络请求

定义一个方法,用于post请求,返回响应的内容,如下:

def post_json_data(url, request_body):

req = request.Request(url)

# 根据需要设置请求头,比如模拟浏览器请求设置UA、一些身份权限认证字段等都会放到header里

req.add_header('OS', 'Android')

req.add_header('VERSION', '82')

req.add_header('CHANNEL', '360')

req.add_header('User-Agent', 'nowcoder android 2.21.3.3091')

# post请求,添加request body即可

with request.urlopen(req, data=request_body.encode('utf-8')) as f:

if f.status == 200:

result_json = json.loads(f.read())

return result_json

再定义一个方法,用于get请求,返回响应的内容,如下:

def get_json_data(url):

req = request.Request(url)

req.add_header('OS', 'Android')

req.add_header('VERSION', '82')

req.add_header('CHANNEL', '360')

req.add_header('User-Agent', 'nowcoder android 2.21.3.3091')

with request.urlopen(req) as f:

if f.status == 200:

result_json = json.loads(f.read())

return result_json

如果把添加到request header中的这些key-value的参数组成dict,就可以通过外部传入,方法中遍历添加,上面两个方法就可以作为工具方法了。

接下来组装post请求的request body中的参数

data_make_paper = parse.urlencode([

('questionCount', '30'),

('tagIds', '570'),

('t', '02436CC60E649584D5C4BBF57709E5CA'),

('fm', 'android_app_2.21.3.3091'),

('source', '1')

])

就可以发送网络请求,获取响应数据了:

result = post_json_data('http://m.nowcoder.com/itest/request-make-paper', data_make_paper)

url_get_questions = "http://m.nowcoder.com/test/get-all-question" + \

"?t=02436CC60E649584D5C4BBF57709E5CA&fm=android_app_2.21.3.3091&tid=" + \

str(result['data'])

需要注意的是,需要引入request和parse模块:

from urllib import request,parse

三、json解析,题目格式调整、写入文件

先定义一个写入文件的方法,这里我们需要追加的形式写,也即后面写入的内容不能覆盖前面已经写入的:

def write_text(path, text, mode='a'):

with open(path, mode=mode, encoding="utf-8") as f:

f.write(text)

f.write("
")

mode = 'a'就表示追加的形式写入。

接下来就是json解析、添加一下格式(如题目编号,选项编号,题与题之间的空行等)、然后写入文件了,直接看代码:

all_questions = get_json_data(url_get_questions)['data']['allQuestion']

# 题号信息,由于获取的题目没有编号

n = 1

# 提取出来方便修改,如果有明确的题目数量,可以嵌套一层循环来循环获取n套题。这里我们获取1套题作为演示

# 之所以写入到html文件,是因为读取的题目中含有html的格式信息

questions_name = "第1套.html"

questions_answer_name = "第1套答案.html"

for item_question in all_questions:

# 获取题干信息

question = item_question['question']

question_type = ['(单选题)', '(不定项选择题)']

# 写入题目信息

write_text("C://python_test/"+questions_name, str(n)+". "+question_type[question['type']-1]+question['content'], 'a')

answer = question['answer']

answer_option = ''

index = 0

for item_answer in answer:

# 获取选项信息

answer_content = item_answer['content']

answer_index_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

# 写入选项信息,加入ABCD等选项编号

write_text("C://python_test/"+questions_name, answer_index_list[index]+". "+answer_content, 'a')

# 获取type字段的值,为1表示该选项为正确答案

answer_type = item_answer['type']

if answer_type == 1:

# 获取正确答案

answer_option += answer_index_list[index]

index += 1

# 每题之间留空行

write_text("C://python_test/"+questions_name, '', 'a')

# 写入答案到另外一个文件中

write_text("C://python_test/"+questions_answer_name, str(n)+"."+'答案: ' + answer_option, 'a')

# 答案之间留空行

write_text("C://python_test/"+questions_answer_name, '', 'a')

# 编号自增

n += 1

注意引入json模块

import json

python中的json和dict直接对应,非常方便。

留个作业:

通过抓取答题接口,完成题目自动答题,保证每套题都得满分~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路由器距离向量算法计算举例_路由器基本原理是什么 路由器基本发展情况介绍【图文】...

PLC路由器原理和ARR路由器基本原理要实现网络中通信节点彼此之间的通信,首先必须给每个节点分配一个唯一的IP地址。路由器应该至少有两个网络端口,分别连接LAN或者WAN子网上,每个端口必须具有一个唯一的IP地址,并且要求与所连接IP…

Git 常用命令整理(持续更新)

#配置 git config --global user.name "Your Name" git config --global user.email "emailexample.com" #注意git config命令的--global参数,用了这个参数,表示这台机器上所有的Git仓库都会使用这个配置,当然也可以对某…

LintCode MySQL 1918. 第二高的球员的身高

文章目录1. 题目2. 解题1. 题目 编写一个 SQL 语句,获取球员 (players) 表中第二高的身高 (height) 表定义: players (球员表) https://www.lintcode.com/problem/1918 2. 解题 if(a,b,c), a true,执行 b, 否则 c -- Write your SQL Que…

matlab多种分配方案_基于MATLAB的水资源优化分配问题动态规划解法

基于MATLAB的水资源优化分配问题动态规划解法摘要:介绍了动态规划的基本原理,针对水资源分配问题进行了动态规划方法分析。针对具体问题采用逆序解法的表格法进行了计算,然后用matlab编制了相应的计算程序进行计算,避免了繁琐的人…

python中使用opencv_如何在Python中使用OpenCV Stitcher类?

你正确使用它,因为某些原因导致进程失败. 结果元组的第一个值是错误代码,0表示成功.这里你得到1,这意味着,根据stitching.hpp,这个过程需要更多的图像. enum Status { OK 0, ERR_NEED_MORE_IMGS 1, ERR_HOMOGRAPHY_EST_FAIL 2, ERR_CAMERA_PARAMS_ADJUST_FAIL 3 }; ERR_NEE…

《高可用MySQL》2 – 单机版MySQL主从配置

这里搭建的主从是最简单的单一主从复制(即一个Master和一个slave,没有任何的热机备份和多slave),该主从结构的基本拓扑图如下所示: 建立基本的主从复制可以总结为以下三个基本步骤: 配置master服务器配置sl…

LintCode MySQL 1936. 张三的故事 III

文章目录1. 题目2. 解题1. 题目 记者调查发现,张三所在学校还有一金牌教师,其所带的学生毕业后人均知名学府。 记者对该老师所教的学生的情况产生了好奇。 students 表中记录了学生的姓名以及班级 (class_id),classes 表中记录了班级的名称以…

语言4位bcd码怎么加加_S7300400如何使用SCL语言调用SFC1(READ_CLK)读取日期和时间?...

系统功能 SFC1 用于读取 CPU 的系统时钟。系统时钟存储在数据类型为DATE_AND_TIME的变量里。通过指针访问系统时钟的单个组成元素。数据类型DATE_AND_TIME所包含的关于年、月、日、时等信息是以 BCD 码的格式存储在 8 个字节里。该数据类型显示的范围是:DT#1990-1-1…

php数据库操作命令精华大全

1、表结构//列信息2、表数据//行信息3、表索引//把列中的行加到索引中(一般情况下一个表一定要把id这一列的所有数据都加到主键索引中) 2、[dos下]关闭mysql:net stop mysql开启mysql:net start mysql登陆mysql:mysql -uroot -p123 --teec:\mysql.log查看…

python装饰器与闭包_python 装饰器和闭包

装饰器 就是函数 功能是为其他函数添加附加功能 def timer(func): def inner(*args,**kwargs): print("执行装饰器") return func(*args,**kwargs) return inner 使用装饰器 timer def test(l): for i in range(l): print(i) test(100) 函数也可以成为对象 l test .…

LintCode MySQL 1932/1933. 挂科最多的同学 I / II

文章目录1. 题目2. 解题1. 题目 exams 表中存放着同学们的考试记录 请用 SQL 语句,找到挂科数最多的同学所对应的 student_id https://www.lintcode.com/problem/1932 2. 解题 -- Write your SQL Query here -- -- example: SELECT * FROM XX_TABLE WHERE XXX…

python 画三角函数_python,将三角函数绘制成二维数组

看起来a, b, c是常量&#xff0c;z是a和{}之间的np.linspace。在a 1 b 2 c 3 def triangle (z, a a, b b, c c): y np.zeros(z.shape) y[z < a] 0 y[z > c] 0 first_half np.logical_and(a < z, z < b) y[first_half] (z[first_half]-a) / (b-a) second…

python中遍历列表enumerate函数_python遍历序列enumerate函数浅析

enumerate函数用于遍历序列中的元素以及它们的下标。enumerate函数说明&#xff1a;函数原型&#xff1a;enumerate(sequence, [start0])功能&#xff1a;将可循环序列sequence以start开始分别列出序列数据和数据下标即对一个可遍历的数据对象(如列表、元组或字符串)&#xff0…

SuperSlide

SuperSlide 致力于解决网站大部分特效展示问题&#xff0c;使网站代码规范整洁&#xff0c;方便维护更新。网站上常用的“焦点图/幻灯片”“Tab标签切换”“图片滚动”“无缝滚动”等只需要一个SuperSlide即可解决&#xff01;从此无需网上苦苦寻觅特效&#xff0c;无需加载n个…

LeetCode 1758. 生成交替二进制字符串的最少操作数(DP)

文章目录1. 题目2. 解题1. 题目 给你一个仅由字符 ‘0’ 和 ‘1’ 组成的字符串 s 。 一步操作中&#xff0c;你可以将任一 ‘0’ 变成 ‘1’ &#xff0c;或者将 ‘1’ 变成 ‘0’ 。 交替字符串 定义为&#xff1a;如果字符串中不存在相邻两个字符相等的情况&#xff0c;那…

python内置的集成开发工具是什么_python内置的集成开发工具是什么_后端开发

go语言之goroute协程_后端开发 协程&#xff08;coroutine&#xff09;是Go语言中的轻量级线程实现&#xff0c;由Go运行时&#xff08;runtime&#xff09;管理。下面就来由go入门教程栏目介绍一下go语言中的goroute协程。python内置的集成开发工具是什么 Python自带的集成开发…

python槽格式里填啥_用于填充插槽的网络挂钩

有时将param设置为required是不够的&#xff0c;因为您不仅需要该param存在&#xff0c;而且需要以特定的格式显示&#xff0c;还有一种使用events的替代方法。在有多个步骤&#xff0c;但一旦你熟悉了&#xff0c;你会做得很快。在1)创建2个新的意图&#xff1a;Year - Confir…

SQL Server 2008R2数据库文件导入到SQL Server 2008数据库中

最近&#xff0c;电脑重装系统之后&#xff0c;安装了SQL Server 2008。附加数据库文件的时候&#xff0c;发现无法附加&#xff0c;提示版本不对。想起来&#xff0c;原来的数据库版本是SQL Server 2008R2。低版本的数据库管理工具无法兼容高版本的数据库文件&#xff0c;所以…

python语言的注释语句引导符_Python 为什么用 # 号作注释符?

关于编程语言中的注释&#xff0c;其重要性基本上已为大家所共识。 然而关于注释的规范&#xff0c;这个话题就像我们之前聊过的缩进、终止符和命名方式一样&#xff0c;众口难调。 注释符通常可分为两种&#xff0c;即行注释与块注释&#xff08;inline/block&#xff09;&…

python 白化_MeteoInfo和Python显著性检验

MeteoInfo显著性检验&#xff1a;MeteoInfo官网&#xff1a;http://www.meteothink.org源代码&#xff1a;https://github.com/meteoinfofn F:/RMeteoInfo/data/test.txtny 71nx 144m ny * nxn 62ss1 asciiread(fn, shape(71,144,n))ss1 ss1[::-1,::1,:]X ss1.reshape(…