Не могу спарсить пары с binance p2p
через request не получается. Пары подгружаются отдельно JSONом, елси попытаться спарсить JSON, то выдает это {"code":"000002","message":"illegal parameter","messageDetail":null,"data":null,"success":false}. Вопрос, как это парсить?
Ответы (2 шт):
Хы, а интересный вопрос ?
У бинахи есть своя апишка, но там не получить данные с P2P страницы.
Было бы интересно посмотреть что там у тебя не получается, но нет ни кода, ни тела которое передаёшь, ни заголовков. Печально.
Ладно, вот рабочий код, благо публичный REST у них не капризный:
import pandas as pd
import requests
from pprint import pprint
import json
def get_p2p_page(url, page, rows):
headers = {'content-type': 'application/json'}
json_data = {
"page":page,
"rows":rows,
"asset":"USDT",
"fiat":"RUB",
"tradeType":"BUY"
}
response = requests.post(url, headers=headers, json=json_data)
if response.status_code != 200:
response.raise_for_status()
return json.loads(response.text)
url = r'https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search'
pprint(get_p2p_page(url,1,1), depth=3)
Вывод:
{'code': '000000',
'data': [{'adv': {...}, 'advertiser': {...}}],
'message': None,
'messageDetail': None,
'success': True,
'total': 287}
У меня вот всё работает ?
Ну а дальше можно парсить это дело как душе угодно. Мне, например, в pandas нравится такие дела собирать, а парсить, в общем то, и не надо. Это же json, достаточно просто по ключам пройтись и выцепить нужную информацию.
rows = []
page = 0
while(True):
page += 1
r = get_p2p_page(url,page,20)
if r['data'] == []: break
for i in r['data']:
rows.append([
i['advertiser']['nickName'],
i['advertiser']['monthOrderCount'],
i['advertiser']['monthFinishRate'],
i['adv']['price'],
i['adv']['fiatUnit'],
i['adv']['commissionRate'],
i['adv']['tradableQuantity'],
i['adv']['asset'],
i['adv']['minSingleTransAmount'],
i['adv']['minSingleTransQuantity'],
i['adv']['dynamicMaxSingleTransAmount'],
i['adv']['dynamicMaxSingleTransQuantity'],
i['adv']['tradeMethods'][0]['tradeMethodName'],
i['advertiser']['userNo']
])
df = pd.DataFrame(rows)
columns = [
['Advertisers (completion rate)']*3 + ['Price']*3 + ['Available']*2 + ['Limit Amount & Quantity']*4 + ['']*2,
['Name', 'Orders', 'Completion', 'Price', 'Fiat', 'Comission', 'Available', 'Asset'
, 'minA', 'minQ','maxA','maxQ','Payment','advertiserNo'],
]
df.columns = pd.MultiIndex.from_tuples(list(zip(*columns)))
print(df)
Вывод:
Ну а дальше эту таблицу можно преобразовывать как угодно. Я специально дал чуть больше колонок чем есть на странице, на которую ссылается вопрос. Там значений на самом деле ещё больше ?
Можно например использовать advertiserNo для создания кликабельных ссылок:
print('https://p2p.binance.com/en/advertiserDetail?advertiserNo='+df.iloc[0,-1])
Вывод:
https://p2p.binance.com/en/advertiserDetail?advertiserNo=s56ddce3de70637778be61b56f011cd9c

