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

