如何用BeautifulSoup获取span标签中隐藏的公寓价格值?
获取前端渲染页面的公寓价格方案
你遇到的问题是因为页面价格是前端JavaScript动态渲染的,用requests直接获取的是服务器返回的模板源码,还没经过浏览器执行JS填充真实数据,所以看到的是模板语法{{ property.price | roundNumber }}。
下面是两种可行的解决方法:
方法一:抓取后端API接口
页面展示的公寓数据(包括价格)通常是通过AJAX请求从后端API获取的,直接请求这个接口就能拿到结构化的真实数据:
- 打开浏览器开发者工具(按F12),切换到「网络」标签页,刷新目标页面
- 过滤「XHR/fetch」类型的请求,找到返回公寓列表数据的接口(命名通常包含
properties、listings等关键词) - 复制该接口的URL、请求头(比如
User-Agent、Cookie),直接用requests请求接口获取JSON数据
示例代码:
import requests # 替换为你找到的真实API接口地址 api_url = "https://www.luxahome.com/api/your-found-endpoint" # 复制浏览器中的请求头,模拟真实用户请求 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值" } response = requests.get(api_url, headers=headers) property_data = response.json() # 遍历提取价格 for item in property_data.get("properties", []): price = item.get("price") print(f"公寓价格:{price}€")
方法二:使用无头浏览器渲染页面
用selenium或playwright模拟真实浏览器加载页面,等待JS执行完成后,再获取渲染后的HTML内容:
- 先安装依赖:
pip install selenium,并下载对应浏览器的驱动(比如ChromeDriver,需和浏览器版本匹配) - 编写代码模拟浏览器访问,切换到目标iframe后提取价格
示例代码(Selenium):
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options import time # 配置无头模式(不显示浏览器窗口) chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") # 初始化浏览器驱动 driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.luxahome.com/propiedades?arrival=01/02/2023&departure=28/02/2023&guests=2&idi=3") # 等待iframe加载完成(可根据实际情况调整等待时间) time.sleep(3) # 切换到目标iframe iframe = driver.find_element(By.CLASS_NAME, "icnea-iframe") driver.switch_to.frame(iframe) # 获取所有价格元素并提取文本 price_elements = driver.find_elements(By.CLASS_NAME, "preu") for elem in price_elements: print(f"公寓价格:{elem.text.strip()}") # 关闭浏览器 driver.quit()
两种方法对比
- API接口法:请求速度快、资源占用低,但需要分析接口参数和请求头,部分网站会有反爬限制
- 无头浏览器法:无需分析接口,完全模拟用户访问,但速度较慢、资源消耗高
内容的提问来源于stack exchange,提问作者Luis M Carvajal
相关产品推荐
相关产品推荐

