使用Python爬取temu商品与评论信息
【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章
作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!
1. 写在前面
电商系列有多难,做过的小伙伴应该都非常的清楚!其中解决算法只是入场券,核心难点当然是风控系统!作者虽没有实际的业务场景,但是在研究分析与测试的过程中能够感受到强度!尤其是在对IP、账号、行为的硬控堪称为精准
分析目标:
aHR0cHM6Ly93d3cudGVtdS5jb20vYmdjX2NvbW1lbnRzLmh0bWw/Z29vZHNfaWQ9NjAxMDk5NTEyMzAyNTk5Jm1hbGxfaWQ9NTAyNjE0Njg3NiZfeF9zZXNzbl9pZD0zdGF0cTA5d202JnJlZmVyX3BhZ2VfbmFtZT1nb29kcyZyZWZlcl9wYWdlX2lkPTEwMDMyXzE3MTc4MjMxMDk4NzFfeGNwc254Zng2bSZyZWZlcl9wYWdlX3NuPTEwMDMy
2. 接口分析
首先在打开网站的第一步,需要准备一个优质的IP环境,已保障网络是可以正常访问的。不然的话就会出现下面这样的情况,如下所示:

直接看头部参数,还是这个Anti-Content,目前作者分析大部分还有有区别的,但是一个站点基本是通用的。区别就在于是否含轨迹参与了加密,如下所示:

这个验证码虽然说出的不是很频繁,但是在持续抓取的道路上一定是一道坎!如下所示:

这里的也是一个坑,由于作者前期是采用的登录方式去调试的。导致算法没有扣全(但是能用)就去尝试抓取测试,导致账号被风控后所有页面的内容被限制浏览!如下所示:

3. 数据爬取
temu的网站其实从分析到扣JS算法,跟作者之前分析过的达人端流程相差无几达人端是700多位含轨迹。接下来直接搜索关键词参数,断点跟进,如下所示:

这里有一个关键的环境点需要补,就是referer。完整的环境头可以直接拿去使用,如下所示:
(function(global, cookie, href, ua) {const random = (min, max) => Math.floor(Math.random() * (max - min + 1) + min);const eventMap = new Map();class DeviceMotionEvent {}class DeviceOrientationEvent {}const documentMock = {cookie: cookie,onmousewheel: "",get referrer() {return "";},addEventListener: (e, t) => eventMap.set(e, t),getElementById: () => {},get ontouchstart() {return null;},get documentElement() {return { scrollTop: 12 };}};const historyMock = {back: () => {},toString: () => "function back() { [native code] }"};const localStorageMock = {getItem: () => null,setItem: () => {}};const locationMock = {get href() {return href;},get port() {return "";}};const navigatorMock = {hasOwnProperty: () => false,get languages() {return ["zh-CN", "zh"];},get plugins() {return { length: 4 };},get userAgent() {return ua;}};const screenMock = {get availHeight() {return 1040;},get availWidth() {return 1920;}};global._event_map = eventMap;global.DeviceMotionEvent = DeviceMotionEvent;global.DeviceOrientationEvent = DeviceOrientationEvent;global.chrome = {};global.document = documentMock;global.history = historyMock;global.localStorage = localStorageMock;global.location = locationMock;global.navigator = navigatorMock;global.outerHeight = 1040;global.outerWidth = 1920;global.screen = screenMock;global.history.back.toString = historyMock.toString;global.document.getElementById.toString = () => "native code";})(typeof window !== "undefined" ? window : global, "{cookie}", "{href}", "{ua}");
这里JS内参数Cookie、UA、Referer采用的动态替换的方式调用传递,这样的方式更加的便捷,在Python程序中代码如何去实现?如下所示:
import execjs# 调用JS算法示例
def generate_anti_content(cookie_str, referer, user_agent):try:with open("anti_content_temu.js", "rb") as f:js_code = f.read()node = execjs.get()js_code = js_code.decode("gbk", 'ignore').replace("{cookie}", cookie_str).replace("{href}", referer).replace("{ua}", user_agent)if cookie_str not in js_code or user_agent not in js_code:raise Exception("未替换成功")ctx = node.compile(js_code)return ctx.call('get_anti_content')except Exception as e:logger.error(f"生成Anti-Content失败: {e}")raise
目前的话我们在抓取的时候是可以不需要去登录账号的,这就很友好了。我们在控制台将Cookie信息拿出来即可,因为Cookie信息也是需要参与加密的,如下所示:

算法如果有问题的话在请求的时候会得到下面的错误反馈,如下所示:
{'success': False, 'error_code': 40002, 'error_msg': 'System busy! '}
还有一种情况则是账号或者参数出现风控或异常,则会出现下面的错误反馈,如下所示:
{'error_code': 406008, 'error_msg': ''}
最后,测试一下扣出来的最终算法,可以看到加上轨迹验证与核心参数之后的长度在500+,基本上就是正确的了!商品评论详情抓取测试效果如下所示:

JS算法的话在每一次请求都调用生成最新的。切记生成一次多次去使用!最后,作者也是测试了一下商品的评价分类,如下所示:

经过了十多分钟控制策略的测试,发现还是非常稳定的。未出现验证,因为咱们使用的Cookie本身就是非登录的,主要就是测试验证码弹出的风控或者强制要求登录等问题!作者也是顺带着验证了一下商品信息与搜索均是没有问题的,证明所有的接口Anti-Content的算法是通用的~~
相关文章:
使用Python爬取temu商品与评论信息
【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作! 【&…...
mybatis学习--自定义映射resultMap
1.1、resultMap处理字段和属性的映射关系 如果字段名和实体类中的属性名不一致的情况下,可以通过resultMap设置自定义映射。 常规写法 /***根据id查询员工信息* param empId* return*/ Emp getEmpByEmpId(Param("empId") Integer empId);<select id…...
Elasticsearch之写入原理以及调优
1、ES 的写入过程 1.1 ES支持四种对文档的数据写操作 create:如果在PUT数据的时候当前数据已经存在,则数据会被覆盖,如果在PUT的时候加上操作类型create,此时如果数据已存在则会返回失败,因为已经强制指定了操作类型…...
python中装饰器的用法
最近发现装饰器是一个非常有意思的东西,很高级! 允许你在不修改函数或类的源代码的情况下,为它们添加额外的功能或修改它们的行为。装饰器本质上是一个接受函数作为参数的可调用对象(通常是函数或类),并返…...
php实现一个简单的MySQL分页
一、案例演示: 二、php 代码 <?php $servername "localhost"; // MySQL服务器名称或IP地址 $username "root"; // MySQL用户名 $password "123456"; // MySQL密码 $dbname "test"; // 要连接…...
算法训练营day23补签
题目1:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) class Solution { public:int reslut INT_MAX;TreeNode* pre NULL;void trackingback(TreeNode* node) {if(node NULL) return;trackingback(node->left);if(pre ! NULL) {reslut…...
国密SM2JS加密后端解密
1.前端加密 前端加密开源库 sm-crypto 1.1 传统web,下载 sm-crypto 进行打包为 dist/sm2.js 相关打包命令 npm install --save sm-crypto npm install npm run prepublish在web页面引用打包后的文件 <script type"text/javascript" src"<%path %>…...
Cheat Engine.exe修改植物大战僵尸阳光与冷却
Cheat Engine.exe修改植物大战僵尸阳光与冷却 打开Cheat Engine.exe和植物大战僵尸,点CE中文件下面红框位置,选择植物大战僵尸,点击打开 修改冷却: 等冷却完毕,首次扫描0安放植物,再次扫描变动值等冷却完…...
python内置模块之queue(队列)用法
queue是python3的内置模块,创建堆栈队列,用来处理多线程通信,队列对象构造方法如下: queue.Queue(maxsize0) 是先进先出(First In First Out: FIFO)队列。 入参 maxsize 是一个整数,用于设置…...
Spring Security——结合JWT实现令牌的验证与授权
目录 JWT(JSON Web Token) 项目总结 新建一个SpringBoot项目 pom.xml PayloadDto JwtUtil工具类 MyAuthenticationSuccessHandler(验证成功处理器) JwtAuthenticationFilter(自定义token过滤器) W…...
Vector的底层结构剖析
vector的介绍: 1.Vector实现了List接口的集合。 2.Vector的底层也是一个数组,protected Object[] elementData; 3.Vector 是线程同步的,即线程安全,Vector类的操作方法带有Synchronized. 4.在开发中,需要线程同步时࿰…...
实现抖音视频滑动功能vue3+swiper
首先,你需要安装和引入Swiper库。可以使用npm或者yarn进行安装。 pnpm install swiper然后在Vue组件中引入Swiper库和样式。 // 导入Swiper组件和SwiperSlide组件,用于创建轮播图 import {Swiper, SwiperSlide } from swiper/vue; // 导入Swiper的CSS样式,确保轮播图的正确…...
Linux文件系统【真的很详细】
目录 一.认识磁盘 1.1磁盘的物理结构 1.2磁盘的存储结构 1.3磁盘的逻辑存储结构 二.理解文件系统 2.1如何管理磁盘 2.2如何在磁盘中找到文件 2.3关于文件名 哈喽,大家好。今天我们学习文件系统,我们之前在Linux基础IO中研究的是进程和被打开文件…...
JAVA学习笔记DAY5——Spring_Ioc
文章目录 Bean配置注解方式配置注解配置文件调用组件 注解方法作用域 DI注入注解引用类型自动装配文件结构自动装配实现 基本数据类型DI装配 Bean配置 注解方式配置 类上添加Ioc注解配置文件中告诉SpringIoc容器要检查哪些包 注解仅是一个标记 注解 不同注解仅是为了方便开…...
WPF中的隧道路由和冒泡路由事件
文章目录 简介:一、事件最基本的用法二、理解路由事件 简介: WPF中使用路由事件升级了传统应用开发中的事件,在WPF中使用路由事件能更好的处理事件相关的逻辑,我们从这篇开始整理事件的用法和什么是直接路由,什么是冒…...
ISO七层模型 tcp/ip
OSI七层模型(重点例子) OSI(Open Systems Interconnection)模型,也称为开放系统互连模型,是一个理论模型,由国际标准化组织(ISO)制定,用于描述和理解不同网络…...
MySQL的三种重要的日志
日志 Mysql有三大日志系统 Undo Log(回滚日志):记录修改前的数据,用于事务回滚和 MVCC(多版本并发控制)。 Redo Log(重做日志):记录数据变更,用于崩溃恢复&…...
神经网络学习2
张量(Tensor)是深度学习和科学计算中的基本数据结构,用于表示多维数组。张量可以看作是一个更广义的概念,涵盖了标量、向量、矩阵以及更高维度的数据结构。具体来说,张量的维度可以是以下几种形式: 标量&am…...
Spring Boot整合Redis通过Zset数据类型+定时任务实现延迟队列
😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…...
Android入门第69天-AndroidStudio中的Gradle使用国内镜像最强教程
背景 AndroidStudio默认连接的是dl.google的gadle仓库。 每次重新build时: 下载速度慢;等待了半天总时build faild;build到一半connection timeout;即使使用了魔法也难以一次build好;这严重影响了我们的学习、开发效率。 当前网络上的使用国内镜像的教程不全 网上的教程…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
