Python 爬虫 | 猿人学第六题

今天讲猿人学第六题


地址:

match.yuanrenxue.com/ma


目录:

1、环境

2、分析请求

3、实现爬取



1、环境

Python3.7、pyexecjs、requests


2、分析网站

数据接口很容易找到的,这个刷题网站的数据接口都是一样的形式。

914b32de02a37915a86b93644b327839.jpeg
图2-1

4fc73ccba2c0d370bc53c3093dd31d04.jpeg
图2-2

这个数据接口有两个参数m、q,有加密参数就进js调试呗。

bf010b15eff50741b1f552f5b6ae2ae1.jpeg
图2-3

bdf39d2d488900dd8e605ddb978d4548.jpeg
图2-4
t = Date.parse(new Date());
var list = {
    "page": window.page,
    "m": r(t, window.o),
    "q": window.i += window.o + '-' + t + "|",
};

m是r函数传入t、window.o得到的,t是时间戳

打断点进r函数看看

4ad8c2cde7aca651622ff7f2d82c7abc.jpeg
图2-5

如图2-5看到一个类似密钥的字符串大概就是RSA加密了,看到这里其实就差不多了,直接把全部代码扣下来。


注意:这里拿到的是三等奖的数据,但是题目要求的是总金额,总金额其实就是三等奖乘24,这个可以在返回的代码中看到的(有任何不明白逻辑的就看源码,源码肯定可以找到)。

6cba01d6c1f72d38d93e99a6002a3821.jpeg
图2-6

af65edd565f8dd6ee3afd75efa86ca7a.jpeg
图2-7


3、代码实现

这里讲几个坑,你们调试的时候都会遇到,这里我就不一步步调试了直接拿出来讲,这代码中有部分是混淆过的。

62b5880c961204984ff2cc4084226a3d.jpeg
图3-1

代码开头的部分有一大堆的表情符如图3-1,刚看到的时候直呼牛逼啊这都行。​我不会,但是不会没关系可以百度啊,JavaScript表情符加密,得知是aaencode加密,再搜aaencode在线解码呗。

617e17da89baefa6e23ab90b4828087b.jpeg
图3-2

解密的结果是window.o = 1;

6cd02a7604fcd240a8cb4976cded4a63.jpeg
图3-3

window是全局变量,赋值global,同时把原来的window={}注释掉。

734acd7148d5a30ed1c9c7e57734b268.jpeg
图3-4

我封装好了一个函数,方便调用,运行看看结果

结果是:Message too long for RSA,返回了一个false

这就难办了,需要一步步调试和网页的进行比对,找出差异,这里我就直接点出来。

e963bb59241ffedee741ba8a55c3a7d6.jpeg
图3-5

这里有一大段的混淆,抠出来放在consloe中运行。

942a64afa10d1b2915442fc37903f181.jpeg
图3-6

替换一下就好了,如图3-7

73f0f28afa38555c49cb1b9f40d09dc5.jpeg
图3-7

全部代码

import time
import execjs
import requests

headers = {
        'Host': 'match.yuanrenxue.com',
        'Referer': 'http://match.yuanrenxue.com/match/6',
        'User-Agent': 'yuanrenxue.project',
    }
with open('第六题.js', 'r', encoding='utf-8') as f:
    jstext = f.read()
for page in range(1, 6):
    timestamp = int(time.time()) * 1000
    m = execjs.compile(jstext).call('get_m', timestamp)
    data = {
        'page': page,
        'm': m,
        'q': f'1-{timestamp}|'
    }
    url = f'http://match.yuanrenxue.com/api/match/6?page={page}&m={m}&q=1-{timestamp}|'
    response = requests.get(url, headers=headers, params=data)
    print(response.json()['data'])

运行结果:

3d7dfbad96bc3d2b5b3024c5ea0d7452.png

需要相关的js代码请私信我。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值