Python爬取某猫投诉数据(含signature参数分析与算法还原)

news2024/12/23 14:43:04

文章目录

  • 1. 写在前面
  • 2. 接口分析
  • 3. 爬虫实现

【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章

作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!

1. 写在前面

  分析的主要是搜索接口的三个参数(ts、rs、signature)前面两个参数不需要过多的分析,一个是时间戳、一个是16位的随机字符(会参与签名运算)!我们主要看signature参数

在这里插入图片描述

在几个月前作者曾分析过它的签名算法,当时其实作者自己也有一些产品负面舆情信息的收集需求。时隔多月再次尝试运行之前程序得到了下面的异常信息:

{'result': {'status': {'code': 10005, 'msg': '操作失败'}, 'timestamp': 'Sat Sep 14 14:04:43 +0800 2024', 'data': []}}

推测大概率是算法变动导致生成的加密参数不对,改动应该不大,经过梳理发现以前的时候只有page页码去参与签名、现在新增了关键词,如下所示:

在这里插入图片描述

2. 接口分析

老规矩,直接登录自己的某博账号,去到投诉的入口进行搜索,查看接口的发包信息,如下所示:

在这里插入图片描述

直接看rs参数,我们可以根据上面的var g = u([l, p, b, h, c, d[“type” + e]].sort().join(“”));这一行代码去展开分析,其中参数p就是rs参数,我们可以往上翻找生成的位置,如下所示:

p = function (e, t, r) {
    var n = ""
        , i = t
        ,
        a = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
    e && (i = Math.round(Math.random() * (r - t)) + t);
    for (var o = 0; o < i; o++) {
        n += a[Math.round(Math.random() * (a.length - 1))]
    }
    return n
}(!1, 16)

p函数的主要功能生成一个长度可控的随机字母跟数字组合的字符串。 !1 表示 false,意味着不需要生成随机长度的字符串,而是固定生成长度为16的字符串

接下来,解决最重要的签名参数signatureu方法进行签名,l参数是时间戳,p的动态16位随机字符串算法我们也还原了,接下来继续看b参数,这个参数是一个固值,如下所示:
在这里插入图片描述

参数h则是关键词,签名的时候我们直接传进来即可!最后还有一个动态参数d[“type” + e]

这个参数是请求接口页码数值,更多的翻页采集则需要对应传入

核心的JS加密算法均在下图中,webpack的压缩,如果扣算法的话就需从这里开始入手。扣取对应的算法以及模块导出,如下所示:

在这里插入图片描述
如果说要去扣原生网站的Webpack的话,最终的代码量会很大,过程可能也会繁琐一些。其实最终的签名参数就是我们前面分析出来的那几个参数拼接做了一个SHA-256,如下所示:

在这里插入图片描述

在这里,我们可以简单写一个脚本对上面调试环境中已经拼接好的字符结果进行哈希运算来验证一下。代码如下所示:

import hashlib

# 需要进行SHA-256加密的字符串
input_string = "$d6eb7ff91ee257475%11017262212207888Vs6Syp78Pr6OBAk咸鱼之王"

# 创建SHA-256对象
sha256_obj = hashlib.sha256()

# 将字符串编码为字节流后进行加密
sha256_obj.update(input_string.encode('utf-8'))

# 获取SHA-256的16进制结果
sha256_hash = sha256_obj.hexdigest()

# 输出SHA-256结果
print(f"SHA-256加密结果: {sha256_hash}")

# OUT: 13c3a83745668b46af0a2ab7f2c4ba1450cb25f4d5bd329f389dcad3f79a031f

计算的结果跟发包参数一模一样!那么至此上面梳理出来的思路已经很清晰,接下来可以直接避免再去扣取又臭又长JS代码,直接可选择自己拿手的语言来实现签名算法

如果你是一位新手朋友,不会算法的还原也没有关系。作者帮你还原好了,完整的JS纯算代码还原如下所示:

const crypto = require('crypto');

function sha256Hash(input) {
    return crypto.createHash('sha256').update(input).digest('hex');
}

function get_signature(keyword, page) {
    // 获取当前时间戳
    const u = new Date().getTime();
    
    // 生成随机字符串
    function generateRandomString(e, t, r) {
        let n = "";
        let i = t;
        const a = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        if (e) {
            i = Math.round(Math.random() * (r - t)) + t;
        }
        for (let o = 0; o < i; o++) {
            n += a[Math.round(Math.random() * (a.length - 1))];
        }
        return n;
    }

    const l = generateRandomString(false, 16);
    
    // 将输入参数排序并连接成字符串
    const inputStr = [u, l, '$d6eb7ff91ee257475%', keyword, 10, page].sort().join("");
    
    // 使用 SHA-256 算法生成签名
    const signature = sha256Hash(inputStr);
    
    return {
        'ts': u,
        'rs': l,
        'signature': signature
    };
}

3. 爬虫实现

最终我们使用Python编写完整的搜索抓取程序,代码如下所示:

# _*_ coding: utf-8 _*_

import time
import requests
import execjs
from loguru import logger

# sign.js就是上面还原的算法代码,自行保存即可
def load_js(file_path="sign.js"):
    with open(file_path, "r", encoding="utf-8") as js_file:
        js_code = js_file.read()
        return execjs.compile(js_code)

def generate_signature(keyword, page, js_context):
    return js_context.call('gen_sign', keyword, page)

def perform_search(keyword, page, js_context):
    cookies = {} # 自行获取
    
    headers = {
        "accept": "*/*",
        "accept-language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
        "cache-control": "no-cache",
        "pragma": "no-cache",
        "priority": "u=1, i",
        "referer": "https://cq.tousu.sina.com.cn/index/search/?keywords=%E5%92%B8%E9%B1%BC%E4%B9%8B%E7%8E%8B&t=1",
        "sec-ch-ua": "\"Chromium\";v=\"128\", \"Not;A=Brand\";v=\"24\", \"Google Chrome\";v=\"128\"",
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": "\"macOS\"",
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-origin",
        "user-agent": :"" # 自行获取,
        "x-requested-with": "XMLHttpRequest"
    }

    signature_data = generate_signature(keyword, page, js_context)
    logger.info(f'抓取第 {page} 页.')
    params = {
        'ts': signature_data['ts'],
        'rs': signature_data['rs'],
        'signature': signature_data['signature'],
        'keywords': keyword,
        'page_size': '10',
        'page': str(page),
    }

    response = requests.get('https://tousu.sina.com.cn/api/index/s', cookies=cookies, params=params, headers=headers)
    return response.json()

def process_search_results():
    js_context = load_js()
    for page in range(1, 20):
        results = perform_search('咸鱼之王', page, js_context)
        logger.info(f'搜索结果: {results}')

if __name__ == '__main__':
    process_search_results()

至此,运行正如我们开篇的截图一样!提前祝各位中秋佳节愉快

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

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

相关文章

电商数据采集分析全流程分享||电商数据API接口

电商数据监测&#xff0c;能为品牌发展提供参考依据&#xff0c;已经成为了业内共识。依托智能系统&#xff0c;将电商数据转换为有价值的营销情报&#xff0c;只需三步&#xff1a; 数据采集 可采集30多个电商平台数据&#xff0c;采集字段高达40多个&#xff0c;包含标题、价…

网络穿透:TCP 打洞、UDP 打洞与 UPnP

在现代网络中&#xff0c;很多设备都处于 NAT&#xff08;网络地址转换&#xff09;或防火墙后面&#xff0c;这使得直接访问这些设备变得困难。在这种情况下&#xff0c;网络穿透技术就显得非常重要。本文将介绍三种常用的网络穿透技术&#xff1a;TCP 打洞、UDP 打洞和 UPnP。…

数据库运维实操优质文章文档分享(含Oracle、MySQL等) | 2024年8月刊

本文为大家整理了墨天轮数据社区2024年8月发布的优质技术文章/文档&#xff0c;主题涵盖Oracle、MySQL、PostgreSQL等主流数据库系统以及国产数据库的技术实操&#xff0c;从基础的安装配置到复杂的故障排查&#xff0c;再到性能优化的实用技巧及常用脚本等&#xff0c;分享给大…

【Python电商项目汇报总结】**采集10万+淘宝商品详情数据注意事项总结汇报**

大家好&#xff0c;今天我想和大家聊聊我们在采集10万淘宝商品详情数据时需要注意的一些关键问题。这不仅仅是一个技术活&#xff0c;更是一场细心与合规的较量。下面&#xff0c;我就用咱们都听得懂的话&#xff0c;一一给大家说道说道。 **一、明确目标&#xff0c;有的放矢…

vue前端实现下载导入模板文件

1.需要导出的文件放置public文件夹中 2.在.vue页面中添加下载代码 <a href"./exportTemplate.xlsx" download"导入数据模板.xlsx" target"_blank" style"color: #2967e9;">导入数据模板.xlsx</a><!-- 如使用element框…

linux使用命令行编译qt.cpp

步骤&#xff1a; mkdir qttestcd qttestvim hello.cpp #include <QApplication> #include <QDialog> #include <QLabel> int main(int argc,char* argv[]) {QApplication a(argc,argv);QLabel label("aaa");label.resize(100,100);label.show()…

在conda虚拟环境中安装cv2(试错多次总结)

首先保证你创建好了虚拟环境&#xff0c;并在anaconda命令窗口激活虚拟环境 依次输入下列命令&#xff1a; pip install opencv-python3.4.1.15 pip install opencv-contrib-python3.4.1.15 pip install dlib19.6.1 然后测试cv2是否可以使用&#xff0c;输入python 运行pyth…

二叉搜索树的判断+平衡二叉树的判断

一、认识二叉树 二叉树 二叉树 二叉树 二叉搜索树 满二叉树 平衡二…

SpringBoot万级并发-jemeter-Address already in use: connect

一、场景 用Jmeter压力单测接口的时候&#xff0c;发现报 Response code:Non HTTP response code: java.net.BindException Response message:Non HTTP response message: Address already in use: connect 然后我这边是wondows的电脑操作压测的&#xff0c;操作系统win10&…

Rust Windows下编译 静态链接VCRuntime140.dll

Rust 编译出来的exe默认动态链接VC运行库&#xff0c;分发电脑上需要安装有Microsoft Visual C Redistributable for Visual Studio 2015运行库。 编译时能静态链接进去&#xff0c;就省去客户端未安装运行库的问题。方法如下: 只需在当前根目录下新建.cargo\config.toml&#…

论文中译英的最佳解决方案?ChatGPT自我反思翻译法了解一下!

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 之前娜姐写过&#xff0c;中译英的论文&#xff0c;一开始在结构上就有很强的中文味。后期如果润色来改善&#xff0c;其实是需要在句子结构上大改动的。 一般来说&#xff0…

【Canvas与表盘】蓝边黑底简约表盘

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>蓝边黑底简约表盘</title><style type"text/css"…

【ArcGISProSDK】初识

ArcGIS Pro SDK 提供四种主要的可扩展性模式&#xff1a;加载项、托管配置、插件数据源和 CoreHost 应用程序。 各模块文件对比 API 核心 核心程序集位于 {ArcGIS Pro 安装文件夹}\bin 中。 程序集描述ArcGIS.Core.dll 提供 CIM、地理数据库、几何图形和公共设施网络 API。 …

Django REST framework 实现缓存机制以优化性能

Django REST framework 实现缓存机制以优化性能 页面首页中&#xff0c;导航菜单或轮播广告在项目中每一个页面都会被用户频繁访问到&#xff0c;所以我们可以实现缓存&#xff0c;减少MySQL数据库的查询压力&#xff0c;使用内存缓存可以加快数据查询速度。 cache_page 装饰…

你的大模型应用表现真的好吗?借助 Dify + Langfuse 一探究竟

背景介绍 众所周知&#xff0c;大模型应用的输出存在着一些不确定性&#xff0c;往往需要迭代多轮才能得到较为稳定的输出结果&#xff0c;因此开发者往往需要关注大模型应用的实际表现&#xff0c;并进行有针对性的优化。 然而常规 Web 服务的监控机制往往无法满足大模型应用…

java计算机毕设课设—户籍管理系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式在最下方 java计算机毕设课设—户籍管理系统(附源码、文章、相关截图、部署视频) 户籍管理系统旨在管理户籍信息和身份证服务&#xff0c;系统分为前台信息展示与后台数据处理两大模块&#xff0c;结合功能性需求与非功能性需求以确保…

基于.NET的土特产销售系统—计算机毕业设计源码27155

摘要 随着Internet技术的发展&#xff0c;土特产销售系统应运而生&#xff0c;土特产销售系统为广大提供了一个更为便利的商品查询、购买、管理平台。为了充分满足用户在线购买土特产的需求&#xff0c;特开发了本土特产销售系统。 本土特产销售系统的开发采用的是C#语言&#…

Python 数学建模——傅里叶变换时间序列分析

文章目录 前言原理Python 库函数实现单周期函数多周期函数真实数据挑战 前言 在数学建模过程中&#xff0c;得到一个序列 x 1 , ⋯ , x n x_1,\cdots,x_n x1​,⋯,xn​&#xff0c;我们首先要进行数据分析&#xff0c;其中就包括分析数据的周期性。这里的周期性不是数学上严格…

升级VMware

1、vm17pro安装包 VMware Workstation 17 Pro软件下载&#xff1a; 官网下载&#xff1a;Download VMware Workstation Pro 2、点击下一步更改地址 3、注册码 VMware Workstation 17 Pro注册码&#xff1a; 4A4RR-813DK-M81A9-4U35H-06KND 4、打开虚拟机 注&#xff1a; 升…

Oracle 11gR2打PSU补丁详细教程

1 说明 Oracle的PSU&#xff08;Patch Set Update&#xff09;补丁是Oracle公司为了其数据库产品定期发布的更新包&#xff0c;通常每季度发布一次。PSU包含了该季度内收集的一系列安全更新&#xff08;CPU&#xff1a;Critical Patch Update&#xff09;以及一些重要的错误修…