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

使用requests+BeautifulSoup爬取表格失败,请求排查原因及方案

问题分析与解决

核心原因

你遇到的情况,主要是以下两种原因导致:

  • JavaScript动态加载内容:Flightradar24的航班表格并非直接嵌入初始HTML,而是页面加载完成后通过JS异步调用后端接口获取并渲染的。requests只能拿到服务器返回的静态初始HTML,此时表格还未生成;而你从浏览器复制的是已经渲染完成的完整页面代码,所以能定位到表格。
  • 反爬拦截:网站可能对非浏览器请求做了限制,即便你加了User-Agent,也可能缺少Cookie、Referer等必要请求头,或者需要先建立会话才能获取完整内容,导致requests返回的内容不含表格。

解决办法

方案1:直接调用后端API(推荐)

打开目标页面,按F12进入开发者工具的「Network」面板,筛选「XHR/Fetch」类型请求,刷新页面后找到加载航班数据的接口(通常返回JSON格式)。直接用requests请求该接口,无需解析HTML,效率更高。

示例代码(实际接口需以你抓包结果为准):

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
    # 需添加抓包获取的Cookie、Referer等其他必要请求头
}

# 替换为真实API地址
API_URL = "https://api.flightradar24.com/data/aircraft/n230wp/flights"
response = requests.get(API_URL, headers=headers)
data = response.json()

# 处理JSON数据
for item in data.get('flights', []):
    print(item['date'], item['flight'], item['from'], item['to'])

方案2:用Selenium模拟浏览器渲染

如果不想找API,用Selenium模拟浏览器加载页面,等待JS渲染完成后再提取表格:

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

URL = "https://www.flightradar24.com/data/aircraft/n230wp"

# 初始化Chrome浏览器(需提前安装对应版本的ChromeDriver)
driver = webdriver.Chrome()
driver.get(URL)

# 等待表格加载完成,最多等待10秒
try:
    table = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "tbl-datatable"))
    )
    
    # 提取表格数据
    rows = table.find_elements(By.TAG_NAME, "tr")
    for row in rows:
        columns = row.find_elements(By.TAG_NAME, ["td", "th"])
        row_data = [col.text.strip() for col in columns]
        print(row_data)
finally:
    driver.quit()

方案3:补充必要请求头

尝试添加抓包得到的Cookie和Referer头,看能否让requests返回完整内容:

import requests
from bs4 import BeautifulSoup

URL = "https://www.flightradar24.com/data/aircraft/n230wp"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
    "Accept-Language": "en-US,en;q=0.9,hr;q=0.8",
    "Referer": "https://www.flightradar24.com/",
    # 复制浏览器中的Cookie内容(注意Cookie会过期)
    "Cookie": "你的浏览器Cookie内容"
}

response = requests.get(URL, headers=headers)
soup = BeautifulSoup(response.text, "lxml")

table = soup.find('table', {'id': 'tbl-datatable'})
if table:
    for row in table.select('tbody tr'):
        columns = row.find_all(['td', 'th'])
        row_data = [col.get_text(strip=True) for col in columns]
        print(row_data)
else:
    print("Table not found.")

注意:Cookie会定期失效,这种方法稳定性不如前两种。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:26:00