Python针对Cloudflare的假5秒盾验证逆向

最近Friendtech挺火的,所以想写一个全自动的脚本,包含自动买卖+推特账号粉丝数量检测。按理说这种东西属于很简单的爬虫,啪啪啪requests发个get请求就数据到手。

如果这么简单,那就真的谢天谢地了

先说说遇到的坑。

1.返回数据中包含“Just a moment"内容的验证页面。
以前没见过这种,然后f12打开查看。怪了,最开始没有验证的时候,请求方式是get;一旦有了这个"Just a moment"的验证页面,再f12打开查看,页面的请求方式就变成了post,而且包含一堆数据。如下。
请求方式是:get

Python针对Cloudflare的假5秒盾验证逆向_第1张图片
post的找不到了,不放了。
这把我搞懵逼了,没见过这种啊。
最开始我想的是多弄一些cookie,referer,usr-agent这些,随机选取让脚本跑。**但是总是当时正常,隔天就失效。查看返回数据,内容包含"Just a moment"的网页验证。**有点头疼。

然后针对get和Post会切换的问题,所以我想要不暴力解决把。
先try get方法,等解析数据报错的时候except切换到Post方法,header,cookie,referer都全部切换。

try:
        re = requests.get(u, headers=h2)
        # print(re.status_code)
        sp = BeautifulSoup(re.text, 'html.parser')
        # print(sp)
        ds = sp.find_all('table', class_='table table-hover')[0].find('tbody').find_all('tr')[:5]
    except BaseException as e:
        print('使用了Post方法')
        re = requests.post(u, headers=h2)
        print(f'post方法的返回码{re.status_code}')
        sp = BeautifulSoup(re.text, 'html.parser')
        # print(sp)
        ds = sp.find_all('table', class_='table table-hover')[0].find('tbody').find_all('tr')[:5]
        # print(ds)
    a_l = []

然后实例化方法运行,ok,pycharm里测试运行正常,然后pyinstaller打包exe本机测试可以运行。
我满心欢喜的把exe包复制到win 2012服务器上运行,报错报错报错,草!
看来这种办法行不通。

那只能换方法了。谷歌大法开启,搜just a moment,5秒盾。然后看到一篇猛文。
(链接:https://m.163.com/dy/article/I0C2IR0A05561QYO.html?spss=adap_pc)
这跟我的问题不是一毛一样吗?也是假5秒盾。
ok,开搞。
装库,撸代码。

import time
from curl_cffi import requests
from bs4 import BeautifulSoup


def ooo():
    bs_u = 'https://basescan.org'
    url = 'https://basescan.org/address/0xcf205808ed36593aa40a44f10c7f7c2f67d4a4d4'
    re = requests.get(url=url, impersonate="chrome101", verify=False)
    sp = BeautifulSoup(re.text, 'html.parser')
    # print(re)
    ds = sp.find_all('table', class_='table table-hover')[0].find('tbody').find_all('tr')[:5]
    print(ds)
    a_l = []
    for t in ds:
        tp = t.find_all('td')[2].text
        vl = t.find_all('td')[9].text
        if tp == 'Buy Shares' and vl == '0 ETH':  # 最新注册用户
            buy = t.find_all('td')[6].text
            a_l.append(buy)
        elif tp == 'Sell Shares':  # 非新注册用户
            tx_u = bs_u + '/tx/' + t.find_all('td')[1].text
            re2 = requests.get(tx_u, impersonate="chrome101", verify=False)
            sp2 = BeautifulSoup(re2.text, 'html.parser')
            sp2_li = sp2.find_all('ul', id='wrapperContent')[0].find_all('li')[2]
            addr_sell = sp2_li.find('span', class_="hash-tag text-truncate tooltip-address").text  # 获取被卖的地址
            if '000003125 ETH' in str(sp2_li):
                a_l.append(addr_sell)
    print(a_l)
    return a_l


while 1:
    try:
        ooo()
    except BaseException as e:
        print(e)
    time.sleep(1200)

pycharm运行,正常,能获取到数据;pyinstaller打包,自己电脑上运行,正常获取到数据;复制到win 2012服务器上,正常获取到数据!!!!终于成功了!!!!哈哈哈哈哈哈哈哈哈

我尼玛,困扰我几天了。不知道后续有没有幺蛾子,目前看起来是能运行的。


curl_cffi这个库,能破解大部分这种requests.get后返回数据包括"Just a moment"的这种网页验证。
详细原理后续再慢慢研究,最近手头工作忙。

最后放上程序正常运行的美照。
Python针对Cloudflare的假5秒盾验证逆向_第2张图片


requests的速度难蚌,已经改用wss节点,也不用破解验证网页了,速度也提升了很多倍

你可能感兴趣的:(python,beautifulsoup)