最近Friendtech挺火的,所以想写一个全自动的脚本,包含自动买卖+推特账号粉丝数量检测。按理说这种东西属于很简单的爬虫,啪啪啪requests发个get请求就数据到手。
如果这么简单,那就真的谢天谢地了
先说说遇到的坑。
1.返回数据中包含“Just a moment"内容的验证页面。
以前没见过这种,然后f12打开查看。怪了,最开始没有验证的时候,请求方式是get;一旦有了这个"Just a moment"的验证页面,再f12打开查看,页面的请求方式就变成了post,而且包含一堆数据。如下。
请求方式是:get
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"的这种网页验证。
详细原理后续再慢慢研究,最近手头工作忙。
requests的速度难蚌,已经改用wss节点,也不用破解验证网页了,速度也提升了很多倍