爬虫实战3-js逆向入门:以黑猫投诉平台为例

目录

引言

逆向过程

步骤一:找到参数对应js代码位置

步骤二:分析参数值的生成逻辑

步骤三:确定函数u的具体内容

步骤四:使用python实现请求参数的生成

投诉信息爬取


引言

下面是一张主流网页加密方法的思维导图,本文将介绍的黑猫投诉平台网站使用的即是请求头加密。

从开发者工具中抓包的结果来看,该网页的json数据包的请求参数中rs和signature两个参数在下拉后得到的新数据包中是动态变化的,而ts参数过一段时间会发生变化(推测应该是和时间戳相关的参数)。接下来就通过js逆向获取这几个参数的生成方法,并实现爬取投诉信息。

逆向过程

步骤一:找到参数对应js代码位置

由于用rs搜索容易重复,这里搜索signature参数,其中只有一个js文件中包含该变量名。

在js代码中再次搜索该变量名,发现共找到14个,为了找到真正的signature参数位置,对可能是该参数的位置打上断点,挨个尝试后确定获得signature参数值的位置在下图所示位置,实际是变量g的值。同时也可以清楚的看到ts和rs的值分别等于l和p两个变量的值。

步骤二:分析参数值的生成逻辑

从代码中很清楚的看到g的值通过这段代码赋予:var g = u([l, p, b, h, c, d["type" + e]].sort().join("")),也就是将这几个变量l, p, b, h, c, d["type" + e]排序后组成一个新的字符串,并将该字符串传入函数u,得到返回值即为g的值。

再往上找寻找上面几个变量的值的生成方式,可以发现在下图所示代码中,这些变量被创建和赋值。首先l变量确实是当前时间戳得到的值(l的值也是ts参数的值,印证了一开始的猜想);b是一个常数,值为"$d6eb7ff91ee257475%";h的值是PAGE_CONFIG对象的keywords属性的值,实际上从右边作用域可以看到就是我们的搜索关键字,值为"外卖 食品安全";c的值为10,它其实就是请求参数中的page_size的值;e的值从右边作用域也可以看到值为1,刷新网页该值不变,因此d["type" + e]的值可以确定为1;

最后是p的值,也是请求参数rs的值,它是一个函数的返回值,不需要管这个函数是干什么的,用chatgpt把这段代码转为python代码即可,转换之前还需找到e和t的值是什么,也从右边发现两者值不变,分别是1和4,但e在代码中用于判断,因此转为python值其实是True,如下得到p值得生成方法,实质就是生成16位得随机字符串:

def generate_random_string(e=True, t=4, r=16):chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"length = t if not e else random.randint(t, r)return ''.join(random.choice(chars) for _ in range(length))

步骤三:确定函数u的具体内容

将断点打到u函数的位置,跳到函数定义的位置

通过反复地打断点跟进,最终确定其执行的实际上是如下两个函数,其实质是执行了一次SHA-256 哈希算法。

知道他执行的是SHA-256 哈希算法后直接使用python对应的hashlib库中的方法即可。

步骤四:使用python实现请求参数的生成

直接放出代码

def generate_random_string(e=True, t=4, r=16):chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"length = t if not e else random.randint(t, r)return ''.join(random.choice(chars) for _ in range(length))def get_sha256(value):"""sha256加密:param value: 加密字符串:return: 加密结果转换为16进制字符串,并大写"""hsobj = hashlib.sha256()hsobj.update(value.encode("utf-8"))return hsobj.hexdigest()
ts=str(int(time.time() * 1000))#ts,时间戳
l=ts
rs=generate_random_string(True, 4, 16)
p=rs#rs
b = '$d6eb7ff91ee257475%'
h='外卖 食品安全'#keywords
c='10'#page_size
d=str(i)#d["type" + e]=page
signature=''.join(sorted([l, p, b, h, c, d]))
signature=get_sha256(signature)
params = {'ts': ts,'rs': rs,'signature': signature,'keywords': h,'page_size': c,'page': d,}

到这里请求参数就构造完成了。

投诉信息爬取

下面是投诉信息的爬取,把cookies和headers复制下来,使用get方法获得每条投诉对应的具体信息页面的url,然后从该url中爬取需要的信息,我这里只需要投诉时间、结束时间和投诉编号,完整代码如下:

import requests
import random
import hashlib
import time
import json
from bs4 import BeautifulSoupcookies = {#自己复制
}headers = {#自己复制
}#[l, p, b, h, c, d["type" + e]].sort().join("")
def generate_random_string(e=True, t=4, r=16):chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"length = t if not e else random.randint(t, r)return ''.join(random.choice(chars) for _ in range(length))def get_sha256(value):"""sha256加密:param value: 加密字符串:return: 加密结果转换为16进制字符串,并大写"""hsobj = hashlib.sha256()hsobj.update(value.encode("utf-8"))return hsobj.hexdigest()requests.packages.urllib3.disable_warnings()
sessions=requests.session()
data=[]
number=0
for i in range(1,101):#1524print(i)url_list=[]if len(data)%50==0 and len(data)!=0:time.sleep(60)while True:ts=str(int(time.time() * 1000))#ts,时间戳l=tsrs=generate_random_string(True, 4, 16)p=rs#rsb = '$d6eb7ff91ee257475%'h='外卖 食品安全'#keywordsc='10'#page_sized=str(i)#d["type" + e]=pagesignature=''.join(sorted([l, p, b, h, c, d]))signature=get_sha256(signature)params = {'ts': ts,'rs': rs,'signature': signature,'keywords': h,'page_size': c,'page': d,}try:response = sessions.get('https://tousu.sina.com.cn/api/index/s',cookies=cookies,headers=headers,params=params,verify=False,allow_redirects=False)response=json.loads(response.text)['result']['data']['lists']#print(response)for n in range(len(response)):if response[n]['main']['evaluate_u']==None:number+=1continueelse:url=response[n]['main']['url']url_list.append(url)number+=1breakexcept Exception as e:print(e,response.text,i)time.sleep(300)continuefor url in url_list:while True:try:response = sessions.get('https:'+url,cookies=cookies,headers=headers,verify=False,allow_redirects=False)soup = BeautifulSoup(response.text, 'html.parser')u_date_elements = soup.find_all(class_='u-date')u_list=soup.find('ul', class_='ts-q-list')c_num=u_list.find_all('li')[0].textendtime=u_date_elements[2].textstarttime=u_date_elements[6].textdata.append([starttime,endtime,c_num])breakexcept Exception as e:print(e,response.text,i)time.sleep(60)continue
data=pd.DataFrame(data,columns=['starttime','endtime','c_num'])

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1-并发编程线程基础

什么是线程 在讨论什么是线程前有必要先说下什么是进程,因为线程是进程中的一个实体,线程本身是不会独立存在的。 进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径&#…

Javaweb之Mybatis的基础操作之新增和更新操作的详细解析

1.4 新增 功能:新增员工信息 1.4.1 基本新增 员工表结构: SQL语句: insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) values (songyuanqiao,宋远桥,1,1.jpg,2,2012-10-09,2,2022-10-…

js——json对象相互转化——js基础积累

js——json对象相互转化——js基础积累 需求场景解决步骤1:定义一个变量接收此字段,方便处理解决步骤2: { 外面的双引号要去掉解决步骤3:使用正则去除参数中的\\解决步骤4:如果此参数必须以{开头,以}结尾解…

【Python学习】Python学习2

目录 【Python学习】Python学习2 1.前言2.基本语法2.1标识符2.2保留字2.3行和缩进2.4多行语句2.5 Python 引号2.6 Python注释2.7 Python空行2.8 等待用户输入2.9 print 输出2.10 多个语句构成代码组2.11 命令行参数 参考 文章所属专区 Python学习 1.前言 主要是Python基本语…

如何使用CapSolver解决Web爬虫中遇到的CAPTCHA问题

Web爬取是一种强大的技术,用于从网站中提取数据,但经常会遇到一个常见障碍,即CAPTCHA。CAPTCHA是“Completely Automated Public Turing test to tell Computers and Humans Apart”的缩写,旨在防止自动机器人访问网站。然而&…

AI小冰入驻淘宝 将提供虚拟人陪伴服务

AI小冰正式入驻淘宝! 据悉,小冰在淘宝开出了“小冰旗舰店”、以及手淘小程序“X Eva 克隆人的平行世界”,为消费者提供基于KOL虚拟人带来的陪伴服务体验。用户搜索“小冰旗舰店”就可以直达店铺进行选购。 ​小冰旗舰店的首批商品包括冰花直充…

毛戈平公司上市终止:产品依赖代工,研发投入低,毛戈平夫妇套现

时隔一年,毛戈平化妆品股份有限公司(下称“毛戈平”或“毛戈平公司”)在A股的上市之旅再次宣告终止。 据贝多财经了解,毛戈平公司最早于2016年12月预披露招股书,准备在上海证券交易所上市,原计划募资5.12亿…

基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码

基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于闪电搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

“TypeError: Cannot read properties of null (reading ‘getContext‘)“

目录 一、报错截图 二、使用场景 三、代码截图 四、报错原因 五、解决办法 一、报错截图 二、使用场景 第一次在vue项目种使用canvas,跟着网上教程做,标签canvas写好了,dom元素获取了,简单“画”了一下,运行之后报…

线性代数 --- 为什么LU分解中的下三角矩阵L的主对角线上都是1?

为什么LU分解中的下三角矩阵L的主对角线上都是1? 一方面,对于LU分解而言,下三角阵L是对高斯消元过程的记录,是高斯消元的逆过程,是多个消元矩阵E的逆矩阵的乘积(形如下图中的下三角矩阵),即: 另一方面&…

2024最新阿里云服务器地域(城市)对照表

2024年阿里云服务器地域分布表,地域指数据中心所在的地理区域,通常按照数据中心所在的城市划分,例如华北2(北京)地域表示数据中心所在的城市是北京。阿里云地域分为四部分即中国、亚太其他国家、欧洲与美洲和中东&…

数字孪生与大数据和分析技术的结合

数字孪生与大数据和分析技术的结合可以为系统提供更深入的见解、支持实时决策,并优化模型的性能。以下是数字孪生在大数据和分析技术中的一些应用,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流…