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

Python实现Airbnb登录后下载CSV数据遇权限错误求助

解决Airbnb预订历史CSV提取的登录认证问题

Hey there, let's break down why your current approaches aren't working and walk through a reliable way to pull that booking history CSV.

为什么你的尝试失败了?

  • urllib的403 Forbidden:Airbnb的登录体系和API不接受简单的表单提交——你缺少关键请求头(比如User-Agent)、CSRF令牌,甚至可能用错了登录API端点。403通常意味着服务器把你的请求识别为非浏览器发起的,或者缺少必要的验证信息。
  • requests auth参数返回401:auth=(username, password)是用于HTTP Basic认证的,但Airbnb用的是基于会话Cookie和CSRF令牌的表单登录体系,这个参数完全不匹配它的认证逻辑,所以肯定会失败。

可行的解决方案:模拟真实浏览器登录流程

Airbnb的认证依赖于会话Cookie和CSRF令牌,我们需要用requests.Session()来保持登录状态,复刻浏览器的完整登录步骤:

步骤1:初始化会话并获取CSRF令牌

先访问登录页面,从页面的meta标签里提取CSRF令牌——这是Airbnb用来防止跨站请求伪造的必备参数。

步骤2:提交登录请求

从浏览器Network面板找到正确的登录POST端点(通常是类似/api/v2/users/login的URL),构造包含用户名、密码和CSRF令牌的表单数据,用会话发送请求。

步骤3:用已登录的会话请求预订API

登录成功后,会话会自动保存验证后的Cookie,直接用这个会话请求你之前捕获的预订历史API URL,就能拿到CSV数据了。

代码示例

import requests
from bs4 import BeautifulSoup

# 初始化会话,自动保持Cookie
session = requests.Session()

# 设置真实浏览器的User-Agent,避免被识别为爬虫
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',
    'Referer': 'https://www.airbnb.com/'
}

# 1. 访问登录页面,提取CSRF令牌
login_page_url = 'https://www.airbnb.com/login'
response = session.get(login_page_url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
csrf_token = soup.find('meta', attrs={'name': 'csrf-token'})['content']

# 2. 构造登录表单数据(注意字段名要和登录页面的form一致,可能是email而非username)
login_payload = {
    'email': 'your_email@example.com',  # 替换成你的账号邮箱
    'password': 'your_password',        # 替换成你的密码
    '_csrf': csrf_token,
    'remember': 'true'  # 可选,根据你的需求调整
}

# 替换成你从Network面板找到的真实登录POST端点
login_post_url = 'https://www.airbnb.com/api/v2/users/login'
login_response = session.post(login_post_url, data=login_payload, headers=headers)

# 验证登录是否成功(可以检查响应状态码或返回的用户信息)
if login_response.status_code == 200:
    print("✅ 登录成功!")
else:
    print(f"❌ 登录失败,状态码:{login_response.status_code},响应:{login_response.text}")
    exit()

# 3. 请求预订历史API,保存为CSV
booking_api_url = 'your_captured_api_url_here'  # 替换成你之前找到的API URL
booking_response = session.get(booking_api_url, headers=headers)

if booking_response.status_code == 200:
    with open('airbnb_bookings.csv', 'wb') as f:
        f.write(booking_response.content)
    print("📄 预订历史CSV已成功保存!")
else:
    print(f"❌ 请求API失败,状态码:{booking_response.status_code},响应:{booking_response.text}")

关键注意事项

  • 准确获取登录端点和表单字段:一定要从浏览器的Network面板里找真实的登录POST URL和表单参数(比如有的字段可能叫login而不是email)。
  • 处理验证码:如果登录时遇到验证码,你可能需要手动输入(比如在代码里暂停,手动登录后把Cookie复制到会话里),个人使用不推荐用自动化验证码服务。
  • 避免频繁请求:Airbnb有反爬机制,不要短时间内多次请求,否则可能被封号。
  • 更新User-Agent:如果遇到403,检查你的User-Agent是否是最新的浏览器标识。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:32:43