使用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
相关产品推荐
相关产品推荐

