使用Python3与bs4抓取Dune.com表格返回None,如何解决?
解决Dune.com表格数据抓取返回None的问题
问题原因
Dune.com的表格内容是通过JavaScript动态渲染的,直接用requests获取的是页面初始的静态HTML,其中并不包含浏览器渲染后的<table>元素,所以BeautifulSoup找不到表格,返回None。
解决方案
方法1:使用浏览器自动化工具(如Selenium)模拟页面加载
通过模拟真实浏览器的行为,等待页面完全渲染后再抓取内容。
- 先安装依赖:
pip install 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 import bs4 # 初始化浏览器驱动 driver = webdriver.Chrome() driver.get('https://dune.com/queries/1144723/1954237') # 等待表格元素加载完成(最多等待10秒) wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.TAG_NAME, 'table'))) # 获取渲染后的页面源码并解析 soup = bs4.BeautifulSoup(driver.page_source, 'html5lib') table = soup.find('table') # 提取表格数据示例 if table: for row in table.find_all('tr'): cols = row.find_all(['td', 'th']) print([col.get_text(strip=True) for col in cols]) # 关闭浏览器 driver.quit()
方法2:直接调用Dune的API接口获取数据
浏览器渲染的表格数据通常来自后端API,可通过开发者工具找到对应的接口,直接请求获取结构化数据(效率更高)。
- 打开浏览器开发者工具(F12),切换到「Network」标签,刷新页面后筛选「XHR/Fetch」请求,找到返回表格数据的接口(通常包含
query、result等关键字) - 复制该接口的URL和必要请求头(如
User-Agent、Cookie,若需登录) - 示例代码:
import requests # 替换为实际找到的API接口URL api_url = "https://dune.com/api/v1/query/1144723/results" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", # 若需要登录,从浏览器复制Cookie添加到此处 } response = requests.get(api_url, headers=headers) data = response.json() # 解析JSON数据(结构需根据实际返回调整) if "result" in data and "rows" in data["result"]: for row in data["result"]["rows"]: print(row)
注意事项
- 若目标页面需要登录才能访问,两种方法都需处理登录逻辑:Selenium可模拟手动登录,API方法需携带登录后的Cookie
- 频繁请求可能触发反爬机制,建议添加请求间隔、使用合理的
User-Agent
内容的提问来源于stack exchange,提问作者spal
相关产品推荐
相关产品推荐

