You need to enable JavaScript to run this app. 使用BeautifulSoup抓取realtor.com房产代理个人页href并存入字典的问题
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup抓取realtor.com房产代理个人页href并存入字典的问题

房产代理列表页爬虫提取优化指南

当前实现存在的核心问题

  • 选择器适配失效:原链接选择器写死了nth-child(1)的位置规则,仅能匹配列表中第一个代理对应的元素,无法遍历所有代理条目,根本无法定位后续条目的目标链接
  • 元素匹配错位风险:原代码分别独立提取姓名、电话两个列表,再通过zip绑定对应关系,一旦任意一个字段选择出现偏移,就会出现不同代理的信息错配
  • 选择器稳定性不足:依赖jsx-开头的哈希类名拼接层级路径,这类类名是前端构建过程中生成的动态值,网站版本更新后极易失效

可落地的修正方案

核心思路调整为:先定位每个代理的独立最小卡片容器,再从容器内部依次提取所有目标字段,彻底避免跨层级选择带来的错位、失效问题

  1. 卡片容器定位:优先选择带固定业务语义的类名元素(即不包含动态哈希jsx-前缀的类名,如agent-list-card这类和业务逻辑绑定的固定类),一次拿到所有代理对应的独立卡片列表
  2. 单卡片内字段提取:对每个拿到的卡片,在自身DOM范围内匹配对应字段:
    • 提取代理姓名文本
    • 提取代理联系电话文本
    • 提取卡片内a标签的href属性,补充站点域名前缀后得到完整的个人主页链接
  3. 数据存储调整:不再以姓名为key存单个电话值,而是将每个代理的姓名、电话、主页链接组成子结构存入realtors_data,信息关联关系更清晰

修正后的可运行代码

from bs4 import BeautifulSoup
import requests
import numpy as np
import pandas as pd

realtors_data = {}
# 伪装请求头避免被站点反爬拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
pages = np.arange(1, 2, 1)
print("PAGES: ", pages)

# 每个代理的独立卡片选择器,优先选固定业务类
card_selector = "ul > div.agent-list-card"

for page in pages:
    resp = requests.get(
        "https://www.realtor.com/realestateagents/New-Orleans_LA/pg-" + str(page),
        headers=headers
    )
    soup = BeautifulSoup(resp.text, 'html.parser')
    # 拿到所有独立代理卡片
    agent_cards = soup.select(card_selector)

    for card in agent_cards:
        # 从卡片内提取姓名
        name_tag = card.select_one("div > div > div > div > div > a > div")
        name = name_tag.get_text(strip=True) if name_tag else "未知代理"
        # 从卡片内提取电话
        phone_tag = card.select_one("div > div > div > div > div > div.agent-phone")
        phone = phone_tag.get_text(strip=True) if phone_tag else "暂无联系电话"
        # 从卡片内提取个人主页链接,拼接完整域名
        link_tag = card.select_one("div.agent-list-card-img-wrapper > a")
        agent_link = "https://www.realtor.com" + link_tag["href"] if link_tag else "暂无主页链接"
        # 存入字典,每个代理的信息为子字典结构
        realtors_data[name] = {
            "phone": phone,
            "profile_link": agent_link
        }

# 输出最终结果
print(realtors_data)

关键注意事项

  • 不要在选择器中使用写死的位置规则(如nth-child(1)),这类规则会随着页面结构调整快速失效
  • 尽量避开动态生成的jsx-类名,优先选择带明确业务语义的固定类名,大幅提升选择器的长期稳定性
  • 提取DOM属性时增加空值判断,避免页面缺失某类元素时直接抛出空指针错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 11:36:04