如何获取需认证的AJAX请求响应?以Realtor.com爬取为例
解决Realtor.com API请求无权访问的问题
你复制的请求里的authorization Bearer令牌和Cookie都是临时会话绑定的,过期后或者脱离原浏览器会话就会失效,这就是直接模拟请求返回无权访问的原因。下面是两种可行的解决思路:
方法一:动态获取有效认证信息
- 先访问首页初始化会话:发送GET请求到
https://www.realtor.com/realestateagents/,从响应的Set-Cookie头中提取必要的会话Cookie(比如__vst、__ssn这类标识)。 - 提取Bearer令牌:首页加载后,页面会通过JS请求获取认证令牌,你可以在浏览器DevTools的网络面板中查找返回Bearer令牌的接口,或者从页面全局变量(如
window.__INITIAL_STATE__)中提取。 - 组装有效请求:用新获取的Cookie和Bearer令牌替换原请求中的过期值,同时保持所有请求头(如
user-agent、referer、sec-ch-ua系列参数)与原请求完全一致,避免被识别为非浏览器请求。
方法二:用浏览器自动化工具直接捕获响应
如果不想处理复杂的认证逻辑,用Selenium或Playwright这类工具让浏览器自动执行操作并捕获API响应,以Python+Selenium为例:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import json import time # 初始化浏览器 driver = webdriver.Chrome() driver.get("https://www.realtor.com/realestateagents/") # 启用Chrome DevTools协议监听网络请求 driver.execute_cdp_cmd("Network.enable", {}) captured_data = [] # 定义响应捕获回调 def handle_response(response): target_url = "realestateagents/api/v3/search" if target_url in response.get("url", "") and response["response"]["status"] == 200: # 获取响应体内容 body = driver.execute_cdp_cmd( "Network.getResponseBody", {"requestId": response["requestId"]} ) captured_data.append(json.loads(body["body"])) # 注册响应监听 driver.execute_cdp_cmd("Network.responseReceived", {}, handle_response) # 模拟搜索洛杉矶 search_box = driver.find_element(By.CSS_SELECTOR, 'input[placeholder="Search for an agent or office"]') search_box.send_keys("洛杉矶") search_box.send_keys(Keys.ENTER) # 等待请求完成 time.sleep(4) # 输出捕获到的数据 if captured_data: print(json.dumps(captured_data[0], indent=2)) driver.quit()
- 注意事项:使用自动化工具时,需设置合理的等待时间,避免频繁触发反爬;可添加随机延迟、使用真实浏览器UA,降低被检测概率。
额外提示
- Realtor.com有严格的反爬机制,频繁请求可能导致IP封禁,建议添加请求间隔,必要时使用代理IP分散请求来源。
- 爬取前请确认符合网站服务条款与
robots.txt规则,避免法律风险。
内容的提问来源于stack exchange,提问作者Abdelkoddous Laarif
相关产品推荐
相关产品推荐

