Python爬虫 | 猿人学第二题

今天讲猿人学第二题


网站地址:

match.yuanrenxue.com/ma


目录:

1、环境

2、分析网站

3、实现爬取



1、环境

Python3.7、pyexecjs、requests、Charles抓包工具


2、分析网站

题目就告诉我们是cookie反爬了,当然我们也是可以分析出来的,请求的时候请求头先不带cookie,验证一下很快就可以知道是cookie反爬了

9a24285502b893a5fa4c4344d3992d2d.jpeg

先分析网络请求找到数据接口

294d06bc2780c06b42592fd2dce2249a.jpeg

既然是cookie反爬,我先介绍一下cookie反爬的几种方式,第一种是服务器返回的cookie,第二种是本地生成的cookie,首先就需要判断是那种情况,一个个请求分析,第一个2请求Chrome展示不了内容(这就很烦,猿人学关于cookie反爬的,Chrome就展示不了返回的数据),用Charles抓包

3f872db8c44b9f9182141c5bb0efc3f4.jpeg

e00ac9c924bd0c21763ece18908877c3.jpeg

在Charles中可以看到第一个2中返回了一段混淆过的代码

fc7285533503d990a43bbae66f8ef895.jpeg

返回的js代码估计就是生成cookie的代码,不然也不会被混淆吧,猿人学自带了反混淆的工具

863a6af7104b25902035799ef5353836.jpeg

7811d7114a71cac0da480023db57eea7.jpeg

3cd5661ccf46ea0c27f224601ad0f0fc.jpeg

将混淆过的代码放入进行还原得到我们更容易分析的代码。

复制到编译器中,一下就在最后看到了cookie的赋值

eda83d68c2257d2d566d159be2bb3841.jpeg

还看到了location["reload"]();这就是为什么后面又请求了一次2这个地址,直接封装返回cookie就好了,代码太长就展示关键代码

function W(Y, Z) {
    document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y;
    return "m" + "=" + V(Y) + "|" + Y;
    // location["reload"]();
}

function X(Y, Z) {
    return Date["parse"](new Date());
}


function get_cookie(){
    return W(X());
}


3、代码实现

其实找到了cookie的生成逻辑,代码基本就可以套用第一题的,改几个参数就好了

import execjs
import requests


headers = {
  'Proxy-Connection': 'keep-alive',
  'Pragma': 'no-cache',
  'Cache-Control': 'no-cache',
  'Accept': 'application/json, text/javascript, */*; q=0.01',
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',
  'X-Requested-With': 'XMLHttpRequest',
  'Referer': 'http://match.yuanrenxue.com/match/2',
  'Accept-Language': 'zh-CN,zh;q=0.9',
  'Cookie': ''
}
with open('第二题.js', 'r', encoding='gbk') as f:
    jstext = f.read()
for page in range(1, 4):
    data = {
        'page': page
    }
    cookie = execjs.compile(jstext).call('get_cookie')
    headers['Cookie'] = cookie
    url = f'http://match.yuanrenxue.com/api/match/2?page={page}'
    response = requests.get(url, headers=headers, data=data)
    print(response.json())

运行结果:

5349b7bb0607b09f565640366d90c700.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值