使用Python爬取易车网汽车信息(含x-sign参数逆向分析)

本文主要是介绍使用Python爬取易车网汽车信息(含x-sign参数逆向分析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 写在前面
  • 2. 接口分析
  • 3. 断点分析
  • 3. 算法还原

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

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

1. 写在前面

  最近有位读者找上了作者,需要采集易车网上面一些汽车相关的数据,用以毕业设计使用。据了解读者的情况会一点Python,也懂一点爬虫(但是到什么程度不详~~

在这里插入图片描述

按照描述的话,应该是说在获取详情页数据的时候,接口有参数加密?接下来将本次的分析分享出来供大家参考学习,难度算是入门级,适合各位学习爬虫技术的新手小伙伴们!最后完整的代码也提供给了读者

2. 接口分析

老规矩,这里的话更多车型需要登录才可显示更多数据,打开详情页面,监测一下请求发包,请求头内X-sign应该是加密生成的,如下所示:

在这里插入图片描述

X-User-Guid参数的话看着像是用户唯一标识的值,可固定!后面断点分析的时候发现这个参数在CK信息内获取就可以了,如下所示:

在这里插入图片描述

然后详情接口buy_car_calculator_info跟同系二手车推荐接口get_recommend_ucar_list只需提交两个参数,分别是cidparam,参数在响应接口内均可找到,如下所示:

?cid=508&param={"serialId":"7350"}
?cid=508&param={"cityId":"201","serialId":"7219","type":1,"count":8}

3. 断点分析

X-sign参数32位,这里大概率还是MD5加密,先全局搜索一下参数,可以直接在JS文件找到,下个断刷新一下,如下所示:

在这里插入图片描述

单步跟到s方法内,这个方法是加密核心位置,我们直接把代码拿下来分析一下,如下所示:

function s(e, t) {var n = "";if ("headers" == e.encryptType) {var i = e.data ? JSON.stringify(e.data) : "{}", o = r(e, t);n = "cid=" + t.cid + "&param=" + i + o + t.timestamp} else {var a = [];a.push("cid=" + t.cid),a.push("uid=" + t.uid),a.push("ver=" + t.ver),a.push("devid=" + (e.deviceId || "")),a.push("t=" + t.timestamp),a.push("key=" + t.paramsKey),n = a.join(";")}var s = yicheUtils.md5(n);return s}

相信到这里,有经验的小伙伴都知道如何还原了,MD5加密,然后n是加密的对象,其中o是一个固值,请求参数加上o跟时间戳加密生成最终签名,如下所示:

在这里插入图片描述

3. 算法还原

下面我们分别使用多种语言来还原一下上面sign加密算法,首先使用Python进行实现,如下所示:

import hashlib
import timetimestamp = str(int(time.time() * 1000))
param = '' # 请求参数
cid = ''
o = '19DDD1FBDFF065D3A4DA777D2D7A81EC'
n = f'cid={cid}&param={param}{o}{timestamp}'obj = hashlib.md5()
obj.update(n.encode('utf-8'))
sign = obj.hexdigest()print(sign)

NodeJS实现方式如下:

const crypto = require('crypto');const timestamp = new Date().getTime().toString();
const param = '';
const cid = '';
const o = '19DDD1FBDFF065D3A4DA777D2D7A81EC';
const n = `cid=${cid}&param=${param}${o}${timestamp}`;const hash = crypto.createHash('md5');
hash.update(n);
const sign = hash.digest('hex');console.log(sign);

Golang实现方式如下:

package mainimport ("crypto/md5""encoding/hex""fmt""strconv""time"
)func main() {timestamp := strconv.FormatInt(time.Now().UnixNano()/int64(time.Millisecond), 10)param := ""o := "19DDD1FBDFF065D3A4DA777D2D7A81EC"cid := ""n := "cid=" + cid + "&param=" + param + o + timestamphash := md5.New()hash.Write([]byte(n))sign := hex.EncodeToString(hash.Sum(nil))fmt.Println(sign)
}

最后作者也是编写了一个完整的爬虫Demo发送给了那位读者,测试结果如下所示:

在这里插入图片描述

这篇关于使用Python爬取易车网汽车信息(含x-sign参数逆向分析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922888

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定