【Python 采集沃尔玛公开数据】沃尔玛的人机验证,然后无脑过验证,轻松拿数据,手把手教会你
文章日期:2024.12.19
使用工具:Python
本章知识:分析沃尔玛人机验证,过人机验证,成功测试拿取公开数据
文章难度:低等(没难度)
文章全程已做去敏处理!!! 【需要做的可联系我】
AES解密处理(直接解密即可)(crypto-js.js 标准算法):在线AES加解密工具
仅供学习!仅供学习!仅供学习!
首先要注意,本文仅作为分析学习测试,无其他意图,觉得文章不错就随便表示一下吧,我将会持续更新更好的内容供大家学习参考
告知:requests 模块即可搞定。不需要自动化模拟。
不知道大家有没有发现,在测试沃尔玛的时候,刚开始还能请求,当正式开始干的时候,程序他就不行了,因为出现了验证页面
然后你觉得是ip被干掉了,就去买了ip池,用上以后就会发现,还是不行。
这个时候,懂的都会先去看看是不是 cookie 缺少认证信息,或 headers 缺少认证信息,在或者就是检查伪装头,然后检查网络,最后程序还是不行。
在这个检查处理的过程中,程序可能会又跑起来,但过一会就又挂了。今天就给大家看一下我是怎么搞定的
首先,要注意下
数据量大的朋友,还是需要依赖ip池的,经过我的测试,海外池是最佳选择,国内池备选(会卡一点,甚至可能跑不起来,慎选)
数据量小,不需要多线程高并发的,就可以不用考虑池子,一条一条数据慢慢跑就行,不影响,只是会慢
1、打开某某网站(使用文章开头的AES在线工具解密):
WKeDxkxE9eZH5iHrE5KQBFkJHXzvXD1BLa3G7XkjiBY=
2、我们随便打开一个商品,打开商品后如果他自动跳转到其他人机验证页面了,就需要你们提前先复制一个商品链接,然后按照我的步骤来走,如果没有人机验证,就直接按照我的步骤来,先打开F12 控制台,点击应用,然后找到cookie,全部清除,无论cookie里有什么,一并全部清除干净
3、由于我界面跳转了,我就直接粘贴一个商品链接,粘贴后不要打开,先把控制台的日志清除了,然后再打开链接
4、可以看到控制台已经抓到包了,我们把找到这个文件,打开去看看服务器返回了什么 cookie 信息,细心的人总能发现不一样的东西,有没有人发现我的人机验证自动消失了,由此可以看出他并不是针对你的ip进行的风控,很大概率是cookie里的令牌
5、我对他服务器返回的内容加上他自己的cookies进行了测试,最终发现【_pxvid】是临时令牌,意思就是这给令牌是由服务器进行返回,可以临时访问数据,如果没有令牌就不能访问数据,如果访问过多令牌就会被封锁,需要等待人机验证才可以解开封锁,最重要的是,此令牌从服务器返回过来并不能直接使用,需要等待10秒,10后才可以使用此令牌.
6、【原理讲解步骤】为了测试,你们可以打开浏览器,先把自己搞风控,然后在清除所有的cookie信息,然后地址栏里输入商品的链接进行打开,如果没有出现人机验证,那你就重新再来一次直到出现人机验证为之,如果打开商品链接后有人机验证,那你可以在去清除一下cookie,但注意,这次不要清除全部的cookie,要保留两个参数,【_pxhd】【_pxvid】这两个参数不要清除,然后默默等待10秒,然后再次输入商品链接回车,你会发现人机验证没有了。
原理就很简单,就是让服务器返回一个令牌,但由于令牌是刚返回的,这个时候令牌还没用生效,选哟等待10秒,如果没用生效前你直接用令牌请求,那就会报错,然后网站就会给你人机验证,验证成功后就会给你一个生效的令牌。如果按照我的方法,只需要获取令牌后,等待10秒令牌生效,就可以直接获取资源了,就不用担心人机验证的问题
7、【获取临时令牌_pxvid】接下来就是怎么去获取这个令牌,其实很简单,就是直接去请求然后获取标头即可,我想有人肯定也尝试过,但还是会出现问题,这我就要给你看看原理图了,仔细看注释!!
获取 【_pxvid】的方法和技巧,方法如下,主要看图!!
【header】要随机一些内容,尽可能的混淆服务器对header的分析,服务器会分析header并生成指纹进行限制或风控,所以我设置了随机
【请求方法head】采用head请求,专门获取响应头信息,不获取正文信息,可以有效节省大量流量支出
【关闭证书验证】关闭可以有效提高请求速度,服务器返回的任何错误状态码都和我们要做的事情无关,所以可以关闭,以达到速度的提升
8、有了临时令牌,接下来我们要去测试获取公开数据了,如果数据量大的朋友,请自行添加ip池。
9、如果你觉得还是很麻烦,跑的很慢,我可以给你讲一下思路,如果你是多线程,比如有100个线程,你可以在程序刚启动的时候,先启动线程生成100个临时令牌,然会用列表存储着100个临时令牌,这是程序开始计时10秒,然会继续获取100个令牌存储为副本令牌,当这次的令牌都请求完成后,差不多也都10秒了,这时就可以用第一次的令牌分配给100个线程,去采集,预估每个令牌可以采集2-4次,然后使用副本令牌,在使用副本令牌的时候,就离开在请求100个令牌作为备用,以此来做到程序不停,速度很快。
给大家看看一下我的成功,由于动图太大,只能给大家看图片
这是刚开始启动的时候,程序会先更具线程数量生成令牌,我开了100个线程,使用了海外池子
我设置了11秒,是为了防止报错,然后副令牌这时还没有生成,因为我设置了时间,50秒后生成新的令牌暂存到副令牌列表,然后再过40秒后,将副令牌替换到主令牌使用,然后再过50秒才会生成新的令牌,都是为了防止令牌提前过期或其他问题
这是请求完成后的数据会被暂时存储到列队里,等待统一保存至数据库
这就已经保存到数据库里了
看成品吧
今天就到这里,动一下你的小手,你对我的认可是我最大的动力。
【获取_pxvid令牌.py】
"""
File Name: 获取_pxvid令牌
Author: 小木_.
Date Created: 2023-07-14
Last Modified: 2024-12-19
Version: 1.0
"""
import random
import requests
import hashlib
import time
# base64 解密
def base64_decode(str):
return base64.b64decode(str).decode('utf-8')
# 这个是链接被base64加密了,此步骤只用于去敏,无其他作用
hosturl = base64_decode('aHR0cHM6Ly93d3cud2FsbWFydC5jb20v')
def md5_encrypt(string):
'''
'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
'blake2b', 'blake2s',
'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512',
'shake_128', 'shake_256'
'''
md5 = hashlib.md5()
md5.update(string.encode('utf-8'))
return md5.hexdigest()
# headers 过服务器分析验证 主要用于混淆服务器对你header分析做出的指纹验证
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9",
f"F{md5_encrypt(str(time.time()))[:5]}": f"{md5_encrypt(str(random.randint(1, 10000)))}",
"Sec-Ch-Ua": f"\"Not A(Brand\";v=\"{random.randint(70, 99)}\", \"Brave\";v=\"{random.randint(70, 120)}\", \"Chromium\";v=\"{random.randint(70, 120)}\"",
"User-Agent": f"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/{random.randint(512, 538)}.{random.randint(9, 37)} (KHTML, like Gecko) Chrome/{random.randint(100, 121)}.0.0.0 Safari/{random.randint(512, 538)}.{random.randint(9, 37)}"
}
# url 混淆服务器的路径 要么重定向,要么就强行给资源,总之我请求发出去了,没有404就表示没问题,爱给不给,随心所欲
url = f"{hosturl}ip/{random.randint(1, 10000)}{str(time.time())}{str(random.randint(1, 10000))}{str(time.time())}{str(random.randint(1, 10000))}"
# 使用 head 请求,不请求正文资源,只请求响应头,【正文没有用,都是一些我们不需要的东西,而且还浪费流量】
# verify 关闭证书验证,可以更快的获取到响应头,虽然会返回404或其他状态码,但丝毫不影响我们参数获取
response = requests.head(url, headers=headers, verify=False)
# 从 cookie 里获取 _pxhd 数据信息,然会提取出 _pxvid 参数
_pxvid = response.cookies.get('_pxhd').split(':')[-1]
print(f'获取到令牌 {_pxvid}')
【完整代码.py】
"""
File Name: 获取_pxvid令牌 并请求公开数据
Author: 小木_.
Date Created: 2023-07-14
Last Modified: 2024-12-19
Version: 1.0
"""
import random
import requests
import hashlib
import time
import re
import base64
'''
如果出现请求错误,请更换请求的商品链接即可
如果更换后依然报错,有可能是网站进行了更新。
'''
# base64 解密
def base64_decode(str):
return base64.b64decode(str).decode('utf-8')
# 这个是链接被base64加密了,此步骤只用于去敏,无其他作用
hosturl = base64_decode('aHR0cHM6Ly93d3cud2FsbWFydC5jb20v')
class main:
def md5_encrypt(self,string):
'''
'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
'blake2b', 'blake2s',
'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512',
'shake_128', 'shake_256'
'''
md5 = hashlib.md5()
md5.update(string.encode('utf-8'))
return md5.hexdigest()
def Headers(self):
# headers 过服务器分析验证 主要用于混淆服务器对你header分析做出的指纹验证
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9",
f"F{self.md5_encrypt(str(time.time()))[:5]}": f"{self.md5_encrypt(str(random.randint(1, 10000)))}",
"Sec-Ch-Ua": f"\"Not A(Brand\";v=\"{random.randint(70, 99)}\", \"Brave\";v=\"{random.randint(70, 120)}\", \"Chromium\";v=\"{random.randint(70, 120)}\"",
"User-Agent": f"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/{random.randint(512, 538)}.{random.randint(9, 37)} (KHTML, like Gecko) Chrome/{random.randint(100, 121)}.0.0.0 Safari/{random.randint(512, 538)}.{random.randint(9, 37)}"
}
print(f'随机生成了 header {headers}')
return headers
def _pxvid_get(self):
'''获取临时令牌'''
# url 混淆服务器的路径 要么重定向,要么就强行给资源,总之我请求发出去了,没有404就表示没问题,爱给不给,随心所欲
url = f"{hosturl}ip/{random.randint(1, 10000)}{str(time.time())}{str(random.randint(1, 10000))}{str(time.time())}{str(random.randint(1, 10000))}"
# 使用 head 请求,不请求正文资源,只请求响应头,【正文没有用,都是一些我们不需要的东西,而且还浪费流量】
# verify 关闭证书验证,可以更快的获取到响应头,虽然会返回404或其他状态码,但丝毫不影响我们参数获取
response = requests.head(url, headers=self.Headers(), verify=False)
# 从 cookie 里获取 _pxhd 数据信息,然会提取出 _pxvid 参数
_pxvid = response.cookies.get('_pxhd').split(':')[-1]
print(f'获取到令牌 {_pxvid}')
return _pxvid
def requests_data(self):
'''请求公开数据'''
Cookie = {
"_pxvid": self._pxvid_get(),
}
print('等待10秒后')
time.sleep(10)
print('开始请求')
response = requests.get(f'{hosturl}ip/5339222894', headers=self.Headers(), cookies=Cookie)
# 临时存储数据测试
data_dict_Template = {}
# 数据大致处理
data = response.text.replace('\n', '').replace('\t', '').replace('\f', '').replace('\r', '')
# 随便提取几个数据
data_dict_Template['price'] = (re.findall('"priceCurrency":"USD","price":(.*?),', data) + [''])[0]
data_dict_Template['title'] = (re.findall('elementtiming="ip-main-title">(.*?)<', data) + [''])[0]
print('打印提取结果',data_dict_Template)
main().requests_data()
作者:小木_.