requests.get()异常,Binance P2P页面爬取元素失败如何解决?
修复Binance P2P页面爬取无法获取目标元素的问题
问题根源
- Binance P2P的核心交易数据是通过JavaScript动态渲染加载的,
requests.get()只能抓取页面的静态HTML源码,无法获取JS执行后生成的动态内容,因此用BeautifulSoup找不到目标元素。 - 原代码存在两处语法错误:
from lxml import lxml写法错误,正确应为import lxmlBeautifulSoup(response.content, 'html')解析器参数无效,需改为'lxml'或'html.parser'
可行解决方案
方案一:用Selenium获取动态渲染页面
Selenium可模拟浏览器加载页面,等待JS渲染完成后再抓取源码:
# 安装依赖 !pip install bs4 selenium from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup # 配置无头浏览器 chrome_options = Options() chrome_options.add_argument('--headless=new') chrome_options.add_argument('--disable-gpu') # 初始化浏览器并访问目标页面 driver = webdriver.Chrome(options=chrome_options) url = 'https://p2p.binance.com/en/trade/all-payments/USDT?fiat=AUD' driver.get(url) # 等待页面加载完成(可根据网络情况调整等待时长) driver.implicitly_wait(10) # 获取渲染后的完整页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'lxml') # 查找目标元素 target_element = soup.find('div', attrs={'class': 'css-1m1f8hn'}) print(target_element) # 关闭浏览器 driver.quit()
方案二:调用Binance官方P2P API(推荐)
直接调用官方API是更高效稳定的方式,无需处理动态渲染逻辑:
import requests url = 'https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search' headers = { 'Content-Type': 'application/json', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } # 请求参数可按需调整(法币、加密货币、交易类型等) payload = { "page": 1, "rows": 10, "payTypes": [], "countries": [], "publisherType": None, "asset": "USDT", "fiat": "AUD", "tradeType": "BUY" # 可选值:BUY/SELL } response = requests.post(url, json=payload, headers=headers) data = response.json() # 输出交易数据示例 for item in data['data']: print(f"商家昵称: {item['advertiser']['nickName']}") print(f"交易价格: {item['adv']['price']}") print(f"支持支付方式: {[pay['identifier'] for pay in item['adv']['tradeMethods']]}") print("---")
方案三:修正原静态爬取代码(仅获取静态元素)
如果只是修正原代码的语法错误,可调整如下,但此方案无法获取动态交易数据:
!pip install bs4 lxml import requests from bs4 import BeautifulSoup url = 'https://p2p.binance.com/en/trade/all-payments/USDT?fiat=AUD' response = requests.get(url) # 使用正确的解析器 soup = BeautifulSoup(response.content, 'lxml') # 尝试查找静态元素 static_element = soup.find('div', attrs={'class': 'css-1m1f8hn'}) print(static_element)
内容的提问来源于stack exchange,提问作者user20166322
相关产品推荐
相关产品推荐

