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

如何用Python Beautiful Soup抓取FDA网站表格全部条目数据

问题原因

这个FDA警告信页面的表格使用了DataTables动态分页组件,页面初始加载时只会渲染前10条数据,后续切换页码、调整单页显示条数的操作都是通过JavaScript异步请求后端接口拉取数据,不会更新静态页面源码,因此直接用BeautifulSoup请求初始页面只能拿到10条数据。

解决方法

你可以选择以下两种方案实现全量数据抓取:

方案1:直接调用后端数据接口(效率更高,推荐)

  • 打开浏览器F12开发者工具,切换到「网络」面板,筛选「Fetch/XHR」请求
  • 点击表格的下一页或者调整「Show entries」选项,找到异步加载数据的请求,该请求返回格式为JSON,包含表格全量字段,请求参数一般包含start(分页起始位置)、length(单页返回条数)
  • 直接用requests库调用该接口即可,可把length参数设置为大于总条数的数值(比如3000),单次请求就能拿到全部2500条数据,不需要分页遍历
    示例代码:
import requests
import pandas as pd

# 替换为你抓到的真实接口地址和请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
params = {
    "start": 0,
    "length": 3000,
    # 补充接口需要的其他参数
}
url = "你抓到的真实API接口地址"
resp = requests.get(url, headers=headers, params=params)
data = resp.json()
# 解析JSON中的表格数据即可,表格内容一般在data字段下
rows = data["data"]
df = pd.DataFrame(rows)
df.to_csv("fda_warning_letters.csv", index=False)

方案2:用Selenium模拟浏览器操作(无需找接口,适合新手)

如果找不到对应接口,可以用Selenium模拟人工操作,调整单页显示条数为最大或者逐页翻页,等页面渲染完成后再提取源码给BeautifulSoup解析:
示例代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time
from bs4 import BeautifulSoup
import pandas as pd

driver = webdriver.Chrome()
driver.get("https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/compliance-actions-and-activities/warning-letters")
time.sleep(3)

# 找到Show entries下拉框,选择最大的显示条数,或者逐页翻页拿数据
select = Select(driver.find_element(By.NAME, "warning-letters_length"))
select.select_by_value("100") # 按页面实际可选值调整
time.sleep(2)

all_rows = []
while True:
    soup = BeautifulSoup(driver.page_source, "html.parser")
    table = soup.find("table", id="warning-letters")
    for row in table.find("tbody").find_all("tr"):
        cols = [col.get_text(strip=True) for col in row.find_all("td")]
        all_rows.append(cols)
    # 检测下一页按钮是否可点击,不可点击则结束爬取
    next_btn = driver.find_element(By.ID, "warning-letters_next")
    if "disabled" in next_btn.get_attribute("class"):
        break
    next_btn.click()
    time.sleep(2)

df = pd.DataFrame(all_rows)
df.to_csv("fda_warning_letters.csv", index=False)
driver.quit()
注意事项
  • 请求时务必添加User-Agent请求头,模拟真实浏览器行为,避免被FDA的反爬机制拦截
  • 控制请求频率,不要短时间内发送大量请求,避免IP被临时封禁

内容的提问来源于stack exchange,提问作者Kathiravan Natarajan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:12:03