Python爬虫,请求参数加密怎么办?

目录

背景介绍:

目标网址:

页面分析:

逆向解析加密参数思路

代码实现:

code_js.js

JS方式实现

python代码实现

总结:

背景介绍:

我们在请求接口的时候,发现请求参数数加密的,该如何处理呢?今天介绍两种方式完成请求参数解密,一种是通过调试js,逆向解析的方式,另一种是Python方式实现解析请求参数。

目标网址:

https://www.oklink.com/zh-cn/btc/tx-list?limit=20&pageNum=1

页面分析:

确定数据接口地址

确定请求头和请求参数有没有加密

确定返回的数据是不是加密

逆向解析加密参数思路

定位到加密参数所在哪个js文件

在来源面板中打开js

确定加密参数所在位置

打断点,刷新页面

确定getApiKey方法的位置

改写js

补全js代码,并改成成函数

运行js

代码实现:

code_js.js

function getApiKey() {
    var t = (new Date).getTime()
      , e = encryptApiKey();
    return t = encryptTime(t),
    comb(e, t)
}
// encryptApiKeya
function encryptApiKey() {
    var t = "a2c903cc-b31e-4547-9299-b6d07b7631ab"
      , e = t.split("")
      , r = e.splice(0, 8);
    return e.concat(r).join("")
}
// encryptApiKey
function encryptTime(t) {
    var e = (1 * t + 1111111111111).toString().split("")
      , r = parseInt(10 * Math.random(), 10)
      , n = parseInt(10 * Math.random(), 10)
      , o = parseInt(10 * Math.random(), 10);
    return e.concat([r, n, o]).join("")
}
// comb
function comb(t, e) {
    var r = "".concat(t, "|").concat(e);
    return btoa(r)
}

// 调用函数运行
// console.log(getApiKey())

JS方式实现

import requests
import json
import execjs
from jsonpath import jsonpath
import time


# 第一页 https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict?t=1657362656709&limit=20&offset=0
# 第二页 https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict?t=1657362632969&limit=20&offset=20
# 第三页 https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict?t=1657362567236&limit=20&offset=40
# 第四页 https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict?t=1657362796076&limit=20&offset=60

def parse(offset):
    ## 目标地址:'https://www.oklink.com/zh-cn/btc/tx-list?limit=20&pageNum=1'
    with open('./code_js.js', 'r', encoding='utf-8') as f:
        js_code = f.read()
    # compile 调用文件,call 调用getApiKey函数
    apiKey = execjs.compile(js_code).call('getApiKey')
    # print(apiKey)
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
        'x-apiKey': apiKey
    }
    # t 是当前时间的数据戳
    t = str(time.time() * 1000)[:-5]
    # print(t)
    data = {
        't': t,
        'limit': 20,
        'offset': offset
    }
    # 数据接口地址
    url = 'https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict'
    res = requests.get(url, headers=header, params=data).text
    # json字符串数据,转为python字典数据
    dict_data = json.loads(res)
    # print(json_data)
    # 数据提取
    # 交易哈希
    hash_list = jsonpath(dict_data, "$..hash")
    # 所在区块
    blockHeight_list = jsonpath(dict_data, "$..blockHeight")
    # 数量(BTC)
    inputsValue_list = jsonpath(dict_data, "$..inputsValue")
    # 手续费(BTC)
    fee_list = jsonpath(dict_data, "$..fee")
    print(hash_list, blockHeight_list, inputsValue_list, fee_list)


# 爬取3页
for i in range(1, 4):
    print(f'正在爬取第{i}页')
    offset = (i - 1) * 20
    parse(offset)

python代码实现

import base64
import random

import requests
import json
from jsonpath import jsonpath
import time

def getApiKey():
    # 13位的时间戳
    t = int(str(time.time() * 1000)[:-5])
    e = encryptApiKey()
    # print('t的值', e)
    t = encryptTime(t)
    # print('e的值', t)
    return comb(e, t)


def encryptApiKey():
    t = "a2c903cc-b31e-4547-9299-b6d07b7631ab"
    # e是t后28个字符组成的列表
    e = [j for j in t[8:]]
    # r是前8个字符组成的列表
    r = [j for j in t[:8]]
    # 返回值就是 e拼接r组成的字符串
    e.extend(r)
    return ''.join(e)


def encryptTime(t):
    # e 为 (1 * t + 1111111111111)的结果转为字符串的每个字符组成的列表
    e = [j for j in str(1 * t + 1111111111111)]
    #  r、n、o 为 随机数字(0-9)
    r = str(random.randint(0, 9))
    n = str(random.randint(0, 9))
    o = str(random.randint(0, 9))
    # 返回的结果是 e,r, n, o 拼接后的字符串
    e.extend(list(r + o + n))
    return ''.join(e)


def comb(t, e):
    # r 是t 和"|" 和e 拼接之后的字符串
    r = t + '|' + e
    # 返回的是base64编码的字符串
    return base64.b64encode(r.encode()).decode()


def parse(offse):
    apikey = getApiKey()
    print(apikey)
    # print(apiKey)
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
        'x-apiKey': apikey
    }
    # t 是当前时间的数据戳
    t = str(time.time() * 1000)[:-5]
    # print(t)
    data = {
        't': t,
        'limit': 20,
        'offset': offse
    }
    # 数据接口地址
    url = 'https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict'
    res = requests.get(url, headers=header, params=data).text
    # json字符串数据,转为python字典数据
    dict_data = json.loads(res)
    # print(json_data)
    # 数据提取
    # 交易哈希
    hash_list = jsonpath(dict_data, "$..hash")
    # 所在区块
    blockHeight_list = jsonpath(dict_data, "$..blockHeight")
    # 数量(BTC)
    inputsValue_list = jsonpath(dict_data, "$..inputsValue")
    # 手续费(BTC)
    fee_list = jsonpath(dict_data, "$..fee")
    print(hash_list, blockHeight_list, inputsValue_list, fee_list)


# 爬取3页
for i in range(1, 3):
    print(f'正在爬取第{i}页')
    offset = (i - 1) * 20
    parse(offset)

总结:

通过这个案例,我们可以知道怎样确定数据接口地址,怎样确定加密参数所在哪个js文件以及了解js调试过程。通过调试js逆向解析的方式和Python方式均可实现请求参数解析。python实现的原理就是将js的写函数用python的方式来写。

只告诉大家学什么但是不给予方向的行为无异于耍流氓,这里也是分享我多年收藏的技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你,干货内容包括:
在这里插入图片描述

上面的所有资料我全部打包好了并且上传至CSDN官方,需要的点击👇获取!

👉 [Python零基础2023入门资料包] 👈

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在进行Python爬虫时遇到加密参数的URL,我们需要获取加密参数的值并解析。首先,我们可以分析URL的结构和加密参数的位置。通常,加密参数会以特定的格式出现在URL中,可能是作为查询参数,也可能是作为路径的一部分。例如,URL可以是类似于 `www.example.com/api/query?param1=value1&param2=value2` 的形式。 我们可以使用Python的网络请求库(如`requests`)向URL发送请求获取网页内容。在发送请求时,我们可以将加密参数的值替换为我们需要的数值。如果加密参数是作为查询参数出现的,我们可以将查询参数加入请求的URL中,如 `http://www.example.com/api/query?param1=value1`。如果加密参数是作为路径的一部分,我们可以将路径中的特定部分替换为我们需要的数值,如 `http://www.example.com/api/query/value1`。 如果加密参数的取值来自于某种加密算法(如MD5、SHA1等),我们需要先了解加密算法的原理,然后根据加密算法的特性进行参数生成。 当我们成功获取到带有正确加密参数的URL后,可以继续使用爬虫框架(如`BeautifulSoup`)或者正则表达式等技术对网页内容进行解析,提取我们所需的信息。 值得注意的是,爬虫过程中需要尊重网站的爬虫规则,遵守相关法律法规。在处理加密参数时,我们应该在合法范围内进行处理,如果网站有明确的反爬虫机制,我们需要避免触发这些机制。此外,我们也要注意避免对服务器造成过大的负担,合理设置爬取频率和请求并发数,以确保爬虫行为的合理性和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值