Binance P2P页面解析器返回空列表,如何修复?
Binance P2P页面解析返回空列表的解决办法
你的问题出在Binance P2P的交易数据是通过JavaScript动态渲染的,用requests直接请求得到的只是初始静态HTML,里面根本没有带css-1m1f8hn类的div元素,自然返回空列表。下面给两种可行的解决思路:
方法一:用Selenium模拟浏览器加载动态内容
Selenium可以模拟真实浏览器打开页面,等待JavaScript渲染完成后再解析内容,步骤如下:
- 先安装Selenium和对应浏览器的驱动(比如ChromeDriver)
- 修改代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup as bs url = 'https://p2p.binance.com/ru/trade/all-payments/USDT?fiat=BYN' def parser(url): result_list = [] # 设置Chrome无头模式(可选,不打开浏览器窗口) options = webdriver.ChromeOptions() options.add_argument('--headless=new') options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36') driver = webdriver.Chrome(options=options) driver.get(url) try: # 等待目标元素加载完成,最多等10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'css-1m1f8hn')) ) # 获取渲染后的页面源码 page_source = driver.page_source page = bs(page_source, 'html.parser') for item in page.find_all('div', class_="css-1m1f8hn"): result_list.append(item.text) finally: driver.quit() return result_list print(parser(url))
方法二:直接调用Binance P2P官方API(更高效)
模拟浏览器效率较低,更优的方式是直接调用Binance的P2P数据接口,步骤如下:
- 通过浏览器开发者工具抓包,找到P2P数据的API接口(通常是POST请求)
- 构造请求参数,直接获取JSON格式的原始数据,示例代码:
import requests url = 'https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search' headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36', 'content-type': 'application/json' } # 请求参数,可根据需求调整(fiat是法币,asset是加密货币,tradeType是买/卖) payload = { "page": 1, "rows": 10, "payTypes": [], "countries": [], "publisherType": None, "asset": "USDT", "fiat": "BYN", "tradeType": "BUY" } def parser(): result_list = [] response = requests.post(url, headers=headers, json=payload) data = response.json() if data.get('code') == '000000': for adv in data['data']: # 提取你需要的信息,比如价格、商家名称等 price = adv['adv']['price'] merchant = adv['advertiser']['nickName'] result_list.append(f"商家:{merchant},价格:{price} BYN") return result_list print(parser())
注意:API接口和参数可能会随Binance更新变化,若失效可重新抓包获取最新接口。
内容的提问来源于stack exchange,提问作者nbrinsdkf
相关产品推荐
相关产品推荐

