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

Python爬取RayWhite房产网站遇URL无法重载问题求助

解决RayWhite房产网站爬取的翻页与数据获取问题

问题原因分析

  1. 动态内容渲染:RayWhite的列表页属于单页应用(SPA),翻页操作不会触发新页面加载,而是通过JavaScript向后端API异步请求数据再渲染到当前页面。你看到的翻页URL只是前端路由标识(比如带#的hash路由),实际不指向真实静态页面,所以直接访问或用BeautifulSoup静态解析拿不到第二页内容。
  2. 反爬限制:网站会对请求的User-Agent、会话Cookie、请求频率做校验,单纯用requests+BeautifulSoup发送请求会被拦截,返回空数据或错误页面。
  3. 路由伪装:翻页的可视化链接不直接对应真实分页请求参数,后端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格式数据,跳过前端渲染步骤,效率远高于模拟浏览器。

操作步骤

  1. 打开浏览器F12开发者工具,切换到Network标签,刷新目标页面
  2. 筛选XHR/Fetch类型的请求,找到加载房产列表的API(通常包含list、properties等关键词)
  3. 记录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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:27:43