Python爬取RayWhite房产网站遇URL无法重载问题求助
解决RayWhite房产网站爬取的翻页与数据获取问题
问题原因分析
- 动态内容渲染:RayWhite的列表页属于单页应用(SPA),翻页操作不会触发新页面加载,而是通过JavaScript向后端API异步请求数据再渲染到当前页面。你看到的翻页URL只是前端路由标识(比如带
#的hash路由),实际不指向真实静态页面,所以直接访问或用BeautifulSoup静态解析拿不到第二页内容。 - 反爬限制:网站会对请求的User-Agent、会话Cookie、请求频率做校验,单纯用
requests+BeautifulSoup发送请求会被拦截,返回空数据或错误页面。 - 路由伪装:翻页的可视化链接不直接对应真实分页请求参数,后端API通常用
page、limit等查询参数控制分页,而非URL路径变化。
Python实现方案
方案一:模拟浏览器渲染(适合新手,无需抓包)
用Selenium模拟真实浏览器操作,自动加载动态内容、点击翻页按钮,完全模拟用户行为,避开静态解析的局限。
依赖安装
pip install selenium webdriver-manager
代码示例(Selenium)
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time import random # 初始化Chrome浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("你的指定RayWhite房产列表链接") # 循环处理所有分页 while True: # 等待当前页房产卡片加载完成(需根据页面实际元素调整选择器) try: WebDriverWait(driver, 15).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.property-card")) ) except: print("当前页加载超时,跳过") break # 提取当前页房产信息 property_cards = driver.find_elements(By.CSS_SELECTOR, "div.property-card") for card in property_cards: # 提取字段(需根据页面实际DOM结构调整选择器) try: title = card.find_element(By.CSS_SELECTOR, "h3.property-title").text.strip() price = card.find_element(By.CSS_SELECTOR, "span.property-price").text.strip() address = card.find_element(By.CSS_SELECTOR, "div.property-address").text.strip() print(f"【{title}】 价格:{price} | 地址:{address}") except Exception as e: print("提取单条房产信息失败:", str(e)) continue # 尝试点击下一页 try: next_btn = driver.find_element(By.CSS_SELECTOR, "button.pagination-next") # 判断按钮是否可点击(不可点击则退出循环) if "disabled" in next_btn.get_attribute("class"): print("已到最后一页") break next_btn.click() # 随机延迟,避免反爬 time.sleep(random.uniform(1.5, 3)) except Exception as e: print("翻页失败或无更多页面:", str(e)) break # 关闭浏览器 driver.quit()
注意事项
- 需根据目标页面的实际DOM结构调整CSS选择器(比如
property-card、pagination-next等) - 可添加随机延迟、切换User-Agent进一步降低被封风险
- 若网站需要登录才能查看全部数据,可在代码中添加模拟登录步骤(输入账号密码、点击登录按钮)
方案二:抓包调用真实API(效率更高)
通过浏览器开发者工具找到网站加载数据的后端API,直接请求API获取JSON格式数据,跳过前端渲染步骤,效率远高于模拟浏览器。
操作步骤
- 打开浏览器F12开发者工具,切换到
Network标签,刷新目标页面 - 筛选
XHR/Fetch类型的请求,找到加载房产列表的API(通常包含list、properties等关键词) - 记录API的请求URL、请求头(尤其是
Cookie、User-Agent、Authorization)和分页参数(比如page、limit)
代码示例(requests)
import requests import time import random # 从开发者工具中复制真实请求头 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值", "Referer": "你的指定RayWhite列表页URL" } page = 1 # 从抓包结果中复制真实API地址 api_url = "https://api.raywhite.com.au/properties/search" while True: # 分页参数(从抓包结果中获取) params = { "page": page, "limit": 20, "location": "Sydney+NSW", # 替换为目标地区参数 "propertyType": "house", # 其他参数如价格范围、卧室数等按需添加 } try: response = requests.get(api_url, headers=headers, params=params) response.raise_for_status() # 抛出HTTP请求错误 data = response.json() except Exception as e: print(f"请求第{page}页失败: {str(e)}") break # 提取房产数据 properties = data.get("results", []) if not properties: print("已无更多数据") break for prop in properties: # 根据API返回的JSON结构提取字段 address = prop.get("address", {}).get("fullAddress", "") price = prop.get("price", {}).get("display", "") bedrooms = prop.get("bedrooms", "") print(f"地址:{address} | 价格:{price} | 卧室数:{bedrooms}") page += 1 # 随机延迟,避免触发反爬 time.sleep(random.uniform(1, 2.5))
注意事项
Cookie可能会过期,需定期从浏览器中更新,或通过模拟登录获取有效会话- 不要设置过高的请求频率,建议添加随机延迟
- 若API需要签名或动态token,优先选择模拟浏览器方案
内容的提问来源于stack exchange,提问作者raz999
相关产品推荐
相关产品推荐

