如何爬取网页可折叠元素内的隐藏数据?以SEC EDGAR站点为例
你遇到的问题核心是页面内容为动态渲染生成:SEC EDGAR的浏览页面中「Selected Filings」板块的列表数据,是页面加载完成后由JavaScript异步请求后端接口、再渲染插入到DOM中的。你直接用requests请求拿到的是未执行JS的原始静态HTML,此时目标div中只有占位文本,没有实际的ul、li、a标签,因此无法解析到目标链接。
解决方案
方案1:调用官方结构化接口(更稳定高效,推荐)
EDGAR公开了所有公司的filings数据接口,无需爬取前端页面,直接请求接口即可拿到结构化的文件数据,请求规则为:将目标CIK补零到10位后,拼接为对应接口地址即可获取数据。
对应你的需求示例代码如下:
import requests headers = {'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'} # 目标CIK补零到10位为0001084869 cik = "0001084869" res = requests.get(f"https://data.sec.gov/submissions/CIK{cik}.json", headers=headers) data = res.json() # 筛选10-K和10-Q类型的 filings target_forms = ["10-K", "10-Q"] base_url = "https://www.sec.gov/Archives/edgar/data/" for idx, form_type in enumerate(data['filings']['recent']['form']): if form_type in target_forms: accession_num = data['filings']['recent']['accessionNumber'][idx].replace("-", "") file_name = data['filings']['recent']['primaryDocument'][idx] # 拼接得到完整的文件链接 full_url = f"{base_url}{cik.lstrip('0')}/{accession_num}/{file_name}" print(full_url)
方案2:使用模拟浏览器加载动态内容
如果你需要直接解析前端页面的DOM结构,可以使用Selenium、Playwright等工具模拟浏览器运行,等待页面JS执行完成、动态内容渲染后再解析DOM。
Selenium示例代码如下:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options import time chrome_options = Options() # 启用无头模式,不弹出浏览器窗口 chrome_options.add_argument("--headless=new") chrome_options.add_argument("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") driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.sec.gov/edgar/browse/?CIK=0001084869") # 等待2秒让动态内容加载完成,也可以用显式等待更精准 time.sleep(2) soup = BeautifulSoup(driver.page_source, 'html.parser') div_tag = soup.find('div', {"id" : "selected-filings-annualOrQuarterly"}) for a_tag in div_tag.find_all('a', href=True): print("https://www.sec.gov" + a_tag['href']) driver.quit()
内容的提问来源于stack exchange,提问作者Steel8
相关产品推荐
相关产品推荐

