币圈搬砖套利-2-Python+JS 抓取不同交易所币价



因为国内币圈的人还是用微信相对较多,所以开发了公众号,结合服务器搭建了机器人,可以在回复关键词后实查询交易所的币价,从而实现搬砖套利。机器人处理币圈信息以外,常见的外卖公众号也是使用同样的机器人。
上章节介绍了微信公众号的基本实现,本章节将介绍如何抓取BTC在多个交易所的币币价
①微信公众号机器人实现
②实时币价抓取
③机器人组合优化
1.搬砖套利简介
核心就一句话:
同一个币种,从低价交易所买入,然后提币,到高价的交易所卖出,获取中间差价
以VSYS为例

可以在hotbit买入,此时价格仅0.1601,然后在火币卖出,价格为0.1745,其中差价约为8.75%
去除手续费和提币手续费,大概可以获得8%的收益
2.市场币价获取
a.API方法
在这里使用coinmarketcap的API,他的地位等同于非小号,可以查询虚拟币在各个交易所的币价
注册后获得API如下所示

这里api的限制比较多,所以就还是用爬虫直接抓数据了
以https://coinmarketcap.com/zh/currencies/bitcoin/markets/为例

检查之后网页结构很干净,所以这里就直接抓了

因为国情,需要使用到代理,由于版本问题,最好安装
pip install urllib3==1.25.11
经过初步调试可以返回element元素
import time
import json
import re
import sys
import lxml.html as HTML
import requests
from lxml import etree
import json
aim_url_list = ['https://coinmarketcap.com/zh/currencies/bitcoin/markets/']
proxies = {'https': 'https://127.0.0.1:10809',
'http': 'http://127.0.0.1:10809'}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
write_dir = {}
for j in range(len(aim_url_list)):
r = requests.get(aim_url_list[j],proxies = proxies,headers =headers)
html = etree.HTML(r.text, etree.HTMLParser())
print(html)

但是经过进一步研究,他的价格数据来自于js函数,所以需要从js函数中解析,因此还需要做抓包
b.json分析
经过抓包分析,实际地址如下所示,可以顺便把header也保存下

上地址直接打开结果如图

币价等信息都保存在上面,返回结果是一个json文件
经过请求,可以获得如下结果
raw_str = '{"data":{"id":1,"name":"Bitcoin","symbol":"BTC","numMarketPairs":8449,"marketPairs":[{"exchangeId":270,"exchangeName":"Binance","exchangeSlug":"binance","exchangeNotice":"Binance Futu....}'
设置每30分钟抓一次,然后先将整个网页整理后以json的形式保存到SQL数据库
3.数据加工
a.字典处理
通过爬虫获取的只是最基本的数据,需要经过进一步加工处理,保证前端只做展示
继续以2中的获得的数据为例
经过请求,可以获得如下结果
raw_str = '{"data":{"id":1,"name":"Bitcoin","symbol":"BTC","numMarketPairs":8449,"marketPairs":[{"exchangeId":270,"exchangeName":"Binance","exchangeSlug":"binance","exchangeNotice":"Binance Futu....}'
经过解析拆解,最终获得如下结果(部分):
done_dir = {'data': {'id': 1, 'name': 'Bitcoin', 'symbol': 'BTC', 'numMarketPairs': 8449, 'marketPairs': [{'exchangeId': 270, 'exchangeName': 'Binance', 'exchangeSlug': 'binance'}]}}
进一步解析,字典一共有下述这么多有效的key
dict_keys(['exchangeId', 'exchangeName', 'exchangeSlug', 'exchangeNotice', 'outlierDetected', 'priceExcluded', 'volumeExcluded', 'marketId', 'marketPair', 'category', 'marketUrl', 'marketScore', 'marketReputation', 'baseSymbol', 'baseCurrencyId', 'quoteSymbol', 'quoteCurrencyId', 'price', 'volumeUsd', 'effectiveLiquidity', 'lastUpdated', 'quote', 'volumeBase', 'volumeQuote', 'feeType', 'depthUsdNegativeTwo', 'depthUsdPositiveTwo'])
经过筛选,决定选择下列数字作为有效信息
'exchangeId': 89, 'exchangeName': 'Coinbase Exchange', 'marketId': 9933, 'marketPair': 'BTC/USDT','price': 54715.52447343999, 'volumeUsd': 4412248118.2648945, 'effectiveLiquidity': 907.251503551,'lastUpdated': '2021-10-07T06:46:54.000Z', 'depthUsdNegativeTwo': 20826511.01330233, 'depthUsdPositiveTwo': 17073253.37476107
b. pandas处理
将数据处理为pandas,经过pandas整理,最终格式如下所示

将上述行展开如下图所示

可以看到已经实现了不同交易所的币价
然后对币价排序,输出前三行和倒数三行
币价前三的如下所示,最高的可达55602.75元

币价倒数三名如下所示,最低的可达53801.86

其中有近2000点差价,而且都有相当的交易量保证可以顺畅成交,具有很大的套利空间
c. 整合输出
# 构建PD结构
coin_pd = pd.DataFrame()
for key in useful_keys:
coin_pd[key] = [single_pairs[key] for single_pairs in coin_dir_data_pairs]
pd.set_option('display.max_columns', None)
coin_pd = coin_pd.sort_values(by = 'price', ascending=False)
# 获取最大值
max_price = max(list(coin_pd['price']))
arbitrage_list = [(max_price-p)/p*100 for p in list(coin_pd['price'])]
coin_pd['arbitrage'] = arbitrage_list
经过以上整合,可以输出如下结果:


下一章节将将程序部署到服务器,实现微信公众号回复不同交易所的币价
联系方式见链接