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

