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

使用BeautifulSoup爬取特定地图网站房产数据遇阻求助

解决Govmap房产交易数据爬取问题

问题原因

你用requests.get()获取的是网站初始静态HTML,但点击房屋后显示的交易价格表格是通过JavaScript异步加载的——也就是页面加载完成后,浏览器才会发送额外请求获取数据并渲染表格。BeautifulSoup只能解析初始返回的静态内容,自然拿不到动态生成的表格数据。

解决方案

方案1:抓包获取API接口(推荐)

直接找到网站加载表格数据的后端API,绕过前端HTML直接请求数据:

  1. 打开浏览器开发者工具(按F12),切换到「网络」标签
  2. 点击目标房屋触发表格加载,在「XHR」或「Fetch」分类下找到返回交易数据的请求
  3. 复制该请求的URL、参数和请求头,用requests直接请求接口获取JSON数据

示例代码:

import requests

# 替换为抓包得到的真实API地址和参数
api_url = "https://www.govmap.gov.il/api/nadlan/transaction-data"
params = {
    "coord": "180570.51,667032.28",
    "zoom": 10,
    "property_id": "目标房屋ID"  # 从点击事件或元素属性中提取
}

# 模拟浏览器请求头,避免被拦截
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.govmap.gov.il/?c=180570.51,667032.28&z=10&lay=NADLAN"
}

response = requests.get(api_url, params=params, headers=headers)
transaction_data = response.json()

# 提取并处理数据
for item in transaction_data.get("transactions", []):
    print(f"交易日期: {item['date']}, 价格: {item['price']}, 面积: {item['area']}")

方案2:用自动化工具模拟浏览器操作

如果API接口有复杂验证(如签名、Cookie校验),可以用Selenium/Playwright模拟完整浏览器流程:

示例代码(Selenium):

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time

# 初始化浏览器
driver = webdriver.Chrome()
driver.get("https://www.govmap.gov.il/?c=180570.51,667032.28&z=10&lay=NADLAN")

# 等待页面加载完成,点击目标房屋(需替换为实际元素选择器)
wait = WebDriverWait(driver, 10)
house = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.property-marker")))
house.click()

# 等待表格渲染
time.sleep(2)
table = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.transaction-table")))

# 提取表格HTML并用BeautifulSoup解析
table_html = table.get_attribute("outerHTML")
soup = BeautifulSoup(table_html, "html.parser")

# 遍历表格行
for row in soup.find_all("tr")[1:]:  # 跳过表头
    cols = row.find_all("td")
    print([col.text.strip() for col in cols])

driver.quit()

注意事项

  • 遵守网站使用条款和robots.txt规则,避免过度请求导致IP被封禁
  • 动态元素的选择器可能随网站更新变化,需定期检查调整
  • 频繁请求建议添加随机间隔,必要时使用代理IP

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:25:51