You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python爬取KuCoin上新公告页面返回空值的问题咨询

解决方案

根本原因

  • 目标页面数据为前端JavaScript动态渲染生成,普通requests请求仅能获取未渲染的初始HTML骨架,不存在目标内容
  • 页面元素类名包含随机生成的后缀,且站方配置了基础反爬策略,无请求头的裸请求、固定类名匹配都会失效

最优方案:调用公开数据接口

KuCoin的公告列表通过公开API返回JSON格式数据,无需解析HTML,稳定性远高于页面爬取,示例代码如下:

import requests
import re

# 配置请求头模拟浏览器
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Referer": "https://www.kucoin.com/news/categories/listing"
}

# 列表接口参数可调整page、pageSize控制分页和数量
api_url = "https://www.kucoin.com/_api/cms/articles?page=1&pageSize=20&category=listing&lang=zh_CN"
response = requests.get(api_url, headers=headers)
data = response.json()

result = []
# 正则规则
symbol_pattern = re.compile(r'\((.*?)\)')
trade_time_pattern = re.compile(r'Trade: (.*?)(?:<br>|/|\n|UTC)')

for item in data.get("items", []):
    title = item.get("title", "")
    content = item.get("summary", "") + item.get("content", "")
    # 提取括号内的币种符号
    symbol_match = symbol_pattern.search(title)
    # 提取交易时间
    time_match = trade_time_pattern.search(content)
    if symbol_match and time_match:
        result.append({
            "symbol": symbol_match.group(1).strip(),
            "trade_time": time_match.group(1).strip()
        })

print(result)

运行后直接输出你需要的[{'symbol': 'xxx', 'trade_time': 'xxx'}, ...]格式的结果。

备选方案:Selenium兼容方案

如果必须模拟浏览器访问原页面,需要添加显式等待避免未加载完成就提取元素,同时适配动态类名:

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
import re

driver = webdriver.Chrome()
driver.get("https://www.kucoin.com/news/categories/listing")
wait = WebDriverWait(driver, 10)

# 等待列表元素加载完成,用starts-with匹配动态类名前缀
items = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//div[starts-with(@class, "item___")]')))
symbol_pattern = re.compile(r'\((.*?)\)')
trade_time_pattern = re.compile(r'Trade: (.*?)(?:<br>|/|\n|UTC)')
result = []

for item in items:
    title = item.find_element(By.XPATH, './/*[starts-with(@class, "mainTitle___")]').text
    item.click()
    # 等待详情加载
    content = wait.until(EC.presence_of_element_located((By.XPATH, '//div[starts-with(@class, "content___")]'))).text
    symbol_match = symbol_pattern.search(title)
    time_match = trade_time_pattern.search(content)
    if symbol_match and time_match:
        result.append({
            "symbol": symbol_match.group(1).strip(),
            "trade_time": time_match.group(1).strip()
        })
    # 返回列表页
    driver.back()
    wait.until(EC.presence_of_all_elements_located((By.XPATH, '//div[starts-with(@class, "item___")]')))

print(result)
driver.quit()

注意事项

  • 控制请求频率,避免短时间大量请求触发IP限制
  • 接口参数中的lang可根据需要切换为en_US等其他语言,正则规则同步调整即可

内容的提问来源于stack exchange,提问作者Sanko Hunbucse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:42:00