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

网页爬取数据异常:仅获取3条Otodom房源价格而非全部36条

问题:爬取Otodom单身公寓房源仅获取3条价格,原因排查与解决

我尝试爬取Otodom平台上的全波兰单身公寓租赁房源(页面显示共36条)价格,但最终只获取到3条数据。所有房源及其价格都处于相同的HTML元素中,想确认是网站拦截请求导致,还是我的代码存在问题?

我的Python爬取代码

import requests
from bs4 import BeautifulSoup  # 原代码漏写该导入,实际运行需补充

headers = {
    "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}

req = requests.get("https://www.otodom.pl/pl/wyniki/wynajem/kawalerka/cala-polska?ownerTypeSingleSelect=ALL&viewType=listing", headers=headers)
req = req.content

soup = BeautifulSoup(req, 'html.parser')

rent_prices = []
ul = soup.find('ul', class_='css-rqwdxd e127mklk0')
lis = ul.find_all('li')

for li in lis:
    price = li.find_all('span', class_='css-1uwck7i evk7nst0')
    rent_prices.append([price])

返回的rent_prices结果

[[[<span class="css-1uwck7i evk7nst0" direction="horizontal">2499 zł<style data-emotion="css v14eu1">.css-v14eu1{color:#495260;font-size:14px;font-weight:400;}</style><span class="css-v14eu1 evk7nst1">+ <!-- -->czynsz: 680 zł/miesiąc</span></span>]],
 [[<span class="css-1uwck7i evk7nst0" direction="horizontal">2300 zł</span>]],
 [[<span class="css-1uwck7i evk7nst0" direction="horizontal">5098 zł</span>]]]

原因分析

  1. 核心问题:动态内容加载
    Otodom这类房产网站的房源列表大多是JavaScript动态加载的——你用requests.get获取的只是页面的静态HTML,里面仅包含页面初始化时渲染的前3条房源,剩下的33条是页面加载完成后,通过异步JS请求从服务器获取并渲染的,静态HTML里根本没有这些数据。

  2. 代码的小问题

  • 原代码漏写BeautifulSoup导入,运行时会报错;
  • find_all返回元素列表,你用append([price])造成多层嵌套,后续处理冗余。

解决方案

方案1:用Selenium模拟浏览器渲染(简单易上手)

Selenium可以模拟真实浏览器加载页面,等待所有JS渲染完成后再获取完整页面源码:

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

# 初始化Chrome浏览器(需提前安装ChromeDriver并配置环境变量)
driver = webdriver.Chrome()
url = "https://www.otodom.pl/pl/wyniki/wynajem/kawalerka/cala-polska?ownerTypeSingleSelect=ALL&viewType=listing"
driver.get(url)

# 等待房源列表加载完成(最多等待10秒)
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "css-rqwdxd")))

# 获取完整页面源码并关闭浏览器
page_source = driver.page_source
driver.quit()

# 解析页面并提取价格
soup = BeautifulSoup(page_source, 'html.parser')
rent_prices = []

ul = soup.find('ul', class_='css-rqwdxd e127mklk0')
for li in ul.find_all('li'):
    price_elem = li.find('span', class_='css-1uwck7i evk7nst0')
    if price_elem:
        # 提取主价格,剔除附加费用文本
        main_price = price_elem.get_text(strip=True).split('+')[0].strip()
        rent_prices.append(main_price)

print(f"共获取到{len(rent_prices)}条价格:")
print(rent_prices)

方案2:直接调用API接口(效率更高)

打开浏览器开发者工具(F12),切换到「Network」标签,刷新页面后筛选「XHR」请求,找到加载房源数据的API接口(通常类似/api/v1/offers格式),然后用requests直接请求该接口,解析返回的JSON数据即可。这种方式无需模拟浏览器,速度更快,但需要自行分析接口的参数和请求头。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 23:12:23