Не могу спарсить пары с binance p2p

binance p2p

через request не получается. Пары подгружаются отдельно JSONом, елси попытаться спарсить JSON, то выдает это {"code":"000002","message":"illegal parameter","messageDetail":null,"data":null,"success":false}. Вопрос, как это парсить?


Ответы (2 шт):

Автор решения: neiron44554

Посмотри headers, ты забыл что-то передать

→ Ссылка
Автор решения: DiMithras

Хы, а интересный вопрос ?
У бинахи есть своя апишка, но там не получить данные с 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}

У меня вот всё работает ?
Ну а дальше можно парсить это дело как душе угодно. Мне, например, в нравится такие дела собирать, а парсить, в общем то, и не надо. Это же , достаточно просто по ключам пройтись и выцепить нужную информацию.

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
→ Ссылка