使用Python BeautifulSoup无法爬取FAA网页全部Fix链接求助
问题原因
你爬取不到Fix链接的核心原因是:目标页面的Fix列表是JavaScript动态渲染的。requests.get()只能获取页面的静态HTML源码,而那些Fix的链接是页面加载完成后通过JS动态生成的,初始静态HTML里根本没有这些内容,所以BeautifulSoup自然找不到。
解决方案
有两种可行方案,按需选择:
方案1:用Selenium模拟浏览器(直观易实现)
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 from bs4 import BeautifulSoup # 初始化Chrome浏览器(需提前下载对应版本的chromedriver) driver = webdriver.Chrome() try: # 打开AZ州Fix搜索页面 driver.get("https://nfdc.faa.gov/nfdcApps/services/ajv5/fix_search.jsp?selectType=state&selectName=AZ&keyword=") # 等待字母'A'的链接加载完成并点击 wait = WebDriverWait(driver, 10) letter_a_link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, 'A'))) letter_a_link.click() # 等待Fix列表加载完成 wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'fixlist'))) # 获取渲染后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'html.parser') # 提取所有Fix的详情链接 fix_links = [] for link in soup.select('.fixlist a'): href = link.get('href') if href and 'fix_detail.jsp' in href: # 补全完整URL(处理相对路径) full_url = f"https://nfdc.faa.gov/nfdcApps/services/ajv5/{href}" if href.startswith('/') else href fix_links.append(full_url) print(f"共找到{len(fix_links)}个Fix链接") print(fix_links[:5]) # 打印前5个示例链接 finally: # 关闭浏览器 driver.quit()
方案2:直接调用AJAX接口(高效无浏览器依赖)
通过浏览器开发者工具的「网络」面板可以发现,点击字母'A'时,页面会发送请求到专门的接口获取Fix数据。直接请求该接口就能拿到包含Fix链接的HTML片段,无需模拟浏览器。
代码示例
import requests from bs4 import BeautifulSoup # 接口URL,替换letter参数可获取其他字母的Fix(A-Z) url = "https://nfdc.faa.gov/nfdcApps/services/ajv5/fixesByLetter.jsp?state=AZ&letter=A" response = requests.get(url) response.encoding = 'utf-8' soup = BeautifulSoup(response.text, 'html.parser') # 提取Fix详情链接 fix_links = [] for link in soup.select('a'): href = link.get('href') if href and 'fix_detail.jsp' in href: full_url = f"https://nfdc.faa.gov/nfdcApps/services/ajv5/{href}" fix_links.append(full_url) print(f"共找到{len(fix_links)}个Fix链接") print(fix_links[:5])
若要获取AZ州所有字母分类的Fix,只需循环遍历A-Z的字母,替换接口URL中的letter参数即可。
内容的提问来源于stack exchange,提问作者gwolffe
相关产品推荐
相关产品推荐

