网页爬取数据异常:仅获取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>]]]
原因分析
核心问题:动态内容加载
Otodom这类房产网站的房源列表大多是JavaScript动态加载的——你用requests.get获取的只是页面的静态HTML,里面仅包含页面初始化时渲染的前3条房源,剩下的33条是页面加载完成后,通过异步JS请求从服务器获取并渲染的,静态HTML里根本没有这些数据。代码的小问题
- 原代码漏写
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
相关产品推荐
相关产品推荐

