爬虫-面试鸭刷题神器

失业在家,刷题发现了一个好的网站,喜滋滋的血,需要登陆有点烦。F12也按不出来,怀疑浏览器坏了...后来发现是网站做了防盗。见猎心喜,开整

https://www.mianshiya.com/

先说结果:先是被封了IP、后被封了账号,哈哈

分析网站,随便点,发现网站接口不多,更加方便了爬取

重点说明:爬取网站,学习学些就行了,悠着点,别把别人服务器搞挂了

第一步、爬取分类

 分析请求,发现请求链接为:

//1、获取题库分类banks

//https://api.mianshiya.com/api/question_bank/list/page/vo

传参为

Postdata = "{\"current\":1,\"pageSize\":1000}";

测试。通过

 

将结果遍历,获得bank_id

第二步、爬取分类的题目列表

 

 根据分类页面,获取库的请求链接

https://api.mianshiya.com/api/question_bank/list_question

POST传参

{"current":1,"pageSize":200,"tagList":[],"questionBankId":"1787463103423897602"}

 

 第三步、爬取题目的答案

打开单个问题页面,如下:

 

 

分析请求,这里作者做了反爬虫处理,

 

 

循环的debugger,不用理他,禁用断点调试就行了

查看具体请求

zhel

 

 发现请求中POST传参,传递了一个加密的信息。

找找具体请求是如何发起的,搜索/api/question/safe/get/vo

 

 总共执行了2段js,有加密,看看能不能根据结果分析过程

 打上断点,ctrl+f5,再次请求页面

 发现请求过程如上,分析总结结论

第一段方法:

n:'questionId=1780933294448209922'

r:时间戳

a:随机数,格式 'f2a3ea50-556a-45f1-9557-0f011c699c3b'

c:逗号链接字符串,结果格式'/api/question/safe/get/vo,1728907968543,f2a3ea50-556a-45f1-9557-0f011c699c3b,questionId=1780933294448209922,2c338dcb94da22361b0a34c84b07e796'

s:对c求hash,算法得到signature

 

 

返回结果:'{"questionId":"1780933294448209922","timestamp":"1728907968543","nonce":"f2a3ea50-556a-45f1-9557-0f011c699c3b","signature":"72223f43e4458d3c1e122e92bc684e63f01318b3e69546c813949a07aad407b0"}'

 

 接下来看第二段请求:

a = function(e) {
                            var t;
                            let n = c.from(e, "utf-8");
                            return t = o().publicEncrypt({
                                key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAngu3uzdfQqfhGXStO36/JUKn6ddMEMRvuj+/fzfuUsefZeePoTcrtpPGW/n7BPBb9PozgFqx6g19u14jWUCKzzvuAYhu5D3nX09a/MKEB+nX37xTNYHNOV4Q3r08HmSbrQoB2Kx6qhl8DNpFYGIUBYoNIA+1sV2/RsEvo1Ccnhu/7AEFIIfmcAcXrQX6e0L0eIk25t6jjgOG3lqYD3oWokjahdSyeWY6EyivRFrddkYQP0ISmvovpx4NRqIApXLgDlV2n4M5ulZshh6xqJUObT+zguk3IqjTbJnFSBZmdkMSpe0LBoGn/AOCWckKYRy268npTVmHGOo6rhAzV6DVRwIDAQAB\n-----END PUBLIC KEY-----",
                                padding: o().constants.RSA_PKCS1_PADDING
                            }, n).toString("base64"),
                            c.from(t, "utf-8").toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_")
                        }(JSON.stringify(t))

定义一个方法n,将前面的结果,转json字符串,立即执行该方法.

方法内部:

1、json字符串RSA加密,转base64字符串

2、再次base64加密,去掉特定字符

.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_")

至此,得到了post请求的body
爬虫研究完毕。


爬虫总结:
1、循环debugger

 


2、构造出来的json,加密之后,就已经满足保密需求了,顶多再做一次base64,再做2此base64,是否多余?

反爬虫思考:
1、太通用的算法,不太适合web端的加密,容易被破解
2、结果内容一次返回,很容易被利用
posted @ 2025-03-14 14:22  -0.5拍  阅读(157)  评论(0)    收藏  举报