平时爬网页的数据比较多,最近尝试抓包安卓app的数据,发现Fiddler配合模拟器还是挺好用的。
一开始我用的夜神模拟器,发现用Fiddler只能抓包首页的数据,点行情和龙虎榜都没有新的包进来。查了下说是现在开盘啦app会侦测模拟器,然后拒绝数据请求。
最后换了雷电模拟器4,虽然网上很多说雷电4要配xpose框架才行,不过亲测试了下,没有xpose也可以完美抓包。记录一下这次抓包的步骤,以便后续使用。
1.在官网下载安装雷电4模拟器,注意版本
2.启动雷电模拟器,开启root权限
3.通过git bash命令窗口操作:
# 将fiddler生成的证书,转换为.pem文件
openssl x509 -inform DER -in FiddlerRoot.cer -out fiddler.pem
# 解析出证书的hash值(因为安卓证书文件名是根据hash值存的)
openssl x509 -inform PEM -subject_hash_old -in fiddler.pem | head -1
# 将该hash值作为新的文件名以".0"结尾
cat fiddler.pem > 269953fb.0
# 将.0文件,通过雷电4自带的文件管理器,放到下面目录,权限修改为-rw-r-r,并重启雷电4
/system/etc/security/cacerts
4. 重启雷电模拟器,在设置-安全-信任的凭据-系统中找到DO-NOT-TRUST-FiddlerRoot,说明证书安装成功
5. 设置代理,在雷电模拟器4中wifi设置代理配置是无效的。我们用adb方式设置。
在雷电模拟器安装目录下有adb.exe可执行文件。我们通过cmd操作:
# 进入雷电4的安装目录
adb.exe devices
# 执行以下命令,给雷电模拟器4设置全局代理
adb.exe shell settings put global http_proxy 本机ip:fiddler端口
6. 设置后重启雷电模拟器4,就可以用Fiddler来抓包啦。
现在尝试抓包开盘啦app的行情数据。点开行情-个股-随意一只股票-然后点上面的行情数据,就可以在Fiddler上面看到抓到的接口。
然后就可以用Python来模拟请求了,写了个粗糙的代码,印证抓包成功。
那如何用这个接口来抓包所有行情数据勒?看了下post请求的参数,改一下StockID就可以了,再写个粗糙的代码(就随机取10个share),最后dic转换一下cols,方便查看。
import requests
import time
import re
import pandas as pd
import numpy as np
from rediscluster import StrictRedisCluster
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
# 用了公司的redis节点,这里隐匿一下
startup_nodes = [
{"host":"xxx","port":7001},
{"host":"xxx","port":7003},
{"host":"xxx","port":7002}
]
rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
new_codes = rc.hkeys("handicap:cache:HANDICAP_DATA:STOCK")
headers = {
'users-Agent': 'Dalvik/2.1.0 (Linux; U; Android 7.1.2; SM-N9760 Build/N2G48C)',
}
df=pd.DataFrame()
for i in new_codes[:10]:
try:
url = 'https://apphq.longhuvip.com/w1/api/index.php'
datas = {
'a':'GetStockPanKou_Narrow',
'apiv':'w31',
'c':'StockL2Data',
'VerSion':'5.7.0.12',
'State':'1',
'PhoneOSNew':'1',
'DeviceID':'ffffffff-e9db-b10c-0000-000000b287e5',
'StockID':str(i),
}
r = requests.post(url, headers=headers, data=datas)
data = r.json()
hq_data = data['real']
tmp_df = pd.DataFrame([hq_data])
tmp_df['day']=data['day']
tmp_df['code']=data['code']
tmp_df['name']=data['name']
tmp_df['preclose_px']=data['preclose_px']
df = pd.concat([df, tmp_df], axis=0)
time.sleep(0.5)
except Exception as e:
print(e)
continue
print(df)
dic={'actualcirculation_value':'实际流通值','amount_in':'内盘','amount_out':'外盘',
'amplitude':'振幅','avg_px':'均价','circulation_amount':'流通股','circulation_value':'流通值',
'down_px':'跌停','up_px':'涨停','dyn_pb_rate':'市净率','high_px':'高','low_px':'低','last_px':'past_px',
'market_value':'总市值','open_px':'开','pe_rate':'市盈率','phcj_turnover':'盘后额','phcj_volume':'盘后量',
'PledgeRatio':'质押比','px_change':'px_change', 'entrust_rate':'委比','px_change_rate':'px_change_rate', 'time':'time',
'total_amount':'总手','total_shares':'总股本','total_turnover':'金额','turnover_ratio':'换手',
'vol_ratio':'量比','day':'day','code':'code','name':'name','preclose_px':'昨收'}
order=['day','code','name','preclose_px', 'time','up_px', 'down_px',
'high_px', 'low_px', 'open_px', 'last_px', 'avg_px', 'amount_in', 'amount_out',
'px_change', 'px_change_rate', 'turnover_ratio', 'total_amount', 'total_turnover', 'vol_ratio',
'amplitude', 'entrust_rate', 'pe_rate', 'dyn_pb_rate',
'circulation_amount', 'circulation_value', 'total_shares', 'market_value',
'actualcirculation_value', 'PledgeRatio']
df=df[order]
new_cols=[]
for i in list(df.columns):
new_cols.append(dic[i])
df.columns=new_cols
print(df)
上一条:使用 Minitab Connect 保持决策流畅性
下一条:使用这个插件,fiddler抓包直接生成httprunner脚本