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

使用BeautifulSoup爬取Airdna.co遇返回None及body为空问题求助

解决AirDNA网站爬取返回空Body的问题

嘿,我来帮你搞定这个AirDNA爬取的问题!你遇到的空Body和找不到目标元素的情况,核心原因很明确:

为什么你的代码会失败?

AirDNA是一个单页应用(SPA),这类网站的页面框架是静态的,但实际显示的市场数据并不是一开始就写在HTML里的——浏览器加载完空框架后,会通过JavaScript异步调用后端API获取数据,再把数据渲染到页面上。

你用requests.get()只能拿到这个空的静态框架HTML,自然找不到那些overall-box__value类的元素,所以dl_data才会是空的,最后输出也都是问题。

下面给你两种可行的解决方法,按需选择:

方法1:用Selenium模拟浏览器渲染(快速验证)

Selenium可以模拟真实浏览器加载页面,等JavaScript执行完、数据渲染完成后,再抓取完整的页面内容。

代码示例

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 配置Chrome无头模式(不弹出浏览器窗口)
chrome_options = Options()
chrome_options.add_argument("--headless=new")
chrome_options.add_argument("--disable-gpu")
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)
url = 'https://www.airdna.co/market-data/app/fr/new-aquitaine/bordeaux/overview'
driver.get(url)

# 显式等待目标元素出现(比固定sleep更可靠)
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "overall-box__value"))
    )
except:
    print("页面加载超时,未找到目标元素")
    driver.quit()
    exit()

# 获取渲染后的完整页面源码
page_source = driver.page_source
driver.quit()

# 解析页面并提取数据
soup = BeautifulSoup(page_source, "html.parser")
dl_data = soup.find_all("div", class_="overall-box__value")

if dl_data:
    # 按你的逻辑分组提取数据
    for data in list(zip(dl_data[0::2], dl_data[1::2], dl_data[2::2])):
        ADRate, ORate, Revenue = data
        ad_rate = ADRate.get_text(strip=True)
        o_rate = ORate.get_text(strip=True)
        revenue = Revenue.get_text(strip=True)
        print(f"{ad_rate}, {o_rate}, {revenue}")
else:
    print("未找到目标数据元素")

注意事项

  • 先安装依赖:pip install selenium
  • 需要下载对应浏览器版本的驱动(比如ChromeDriver),并确保驱动和浏览器版本匹配

方法2:直接调用AirDNA的API(高效稳定)

单页应用的渲染数据都来自后端API,直接抓API请求获取JSON数据,比模拟浏览器效率高得多,也更适合批量爬取。

操作步骤

  1. 打开Chrome开发者工具(F12),切换到「Network」标签
  2. 刷新目标页面,筛选「XHR/Fetch」类型的请求,找到返回市场数据的API(通常URL里会包含market-data或目标城市名bordeaux)
  3. 复制该API的请求URL和请求头(尤其是Cookie、Authorization这类认证信息——AirDNA需要登录才能访问数据,你得先登录网站再复制这些信息)

代码示例(需替换为实际API信息)

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",
    "Cookie": "这里替换成你登录后的Cookie值",
    "Authorization": "Bearer 这里替换成你的认证Token"
}

# 替换为你抓包找到的实际API地址
api_url = "https://api.airdna.co/market-data/fr/new-aquitaine/bordeaux/overview"
response = requests.get(api_url, headers=headers)

# 解析JSON数据
if response.status_code == 200:
    data = response.json()
    # 以下字段需根据实际返回的JSON结构调整
    ad_rate = data['data']['overview']['adr']
    o_rate = data['data']['overview']['occupancy']
    revenue = data['data']['overview']['revenue']
    print(f"{ad_rate}, {o_rate}, {revenue}")
else:
    print(f"API请求失败,状态码:{response.status_code}")

注意事项

  • AirDNA的API可能会随时调整,需要定期检查接口是否变化
  • 认证信息(Cookie/Token)过期后需要重新从浏览器复制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:45:08