Python+BeautifulSoup爬取mmreality.cz房源信息无输出问题排查与需求实现
问题排查与解决方案:mmreality.cz房源数据抓取失败处理
我帮你梳理了代码里的问题,也给出了可行的实现方案:
问题根源分析
你的代码之所以没有输出,核心问题有两个:
- 标签名错误:
soup.find_all('id', attrs={'class':'...'})完全用错了语法——find_all的第一个参数是HTML标签名(比如div、p),而不是id。你想找的是带有指定class的房源容器,不是<id>标签,这直接导致results是空列表,循环根本没执行。 - 可能的请求拦截:很多网站会拦截没有浏览器标识(User-Agent)的请求,返回空内容或者错误页面,这也会导致后续解析不到数据。
另外,你用了完整的长class字符串,容易因为网站微调class属性而失效,建议简化匹配。
修正后的实现代码
import requests from bs4 import BeautifulSoup # 目标房源列表URL URL = 'https://www.mmreality.cz/nemovitosti/prodej/byty/praha-vychod/?query=bcw9DoAgDIbh2zgjiro4eQzCQBB%2FErUEigm3F3Ss69Ovr4HzhEsG1BiDkkyNdWU%2B0wb32xZYLaxeuy3J2S46HjhBvNCn9%2BYhupAfJSZnvwRnjHqtRiEo8zL%2FyTR53lFuMw%2BUReaeclfi%2FAE%3D' # 模拟浏览器请求头,避免被网站拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 发送HTTP请求 page = requests.get(URL, headers=headers) # 先检查请求是否成功 if page.status_code != 200: print(f"请求失败,状态码:{page.status_code}") else: soup = BeautifulSoup(page.content, 'html.parser') # 匹配房源容器,简化class参数(取独特的部分,避免网站更新class导致失效) results = soup.find_all('div', class_='cell xsmall-24 mb-4 grid-y pos-relative rounded') if not results: print("未找到任何房源容器,可能网站结构已更新或请求被拦截") else: for house_item in results: # 抓取房源描述文本(class为fs-s fw-light pl-4 pr-4的p元素) house_desc = house_item.find('p', class_='fs-s fw-light pl-4 pr-4') if house_desc: desc_text = house_desc.text.strip() print(f"房源信息:{desc_text}") # 抓取房源价格(class为block text-secondary fs-xxl pl-4 pr-4 mb-4的strong元素) house_price = house_item.find('strong', class_='block text-secondary fs-xxl pl-4 pr-4 mb-4') if house_price: price_text = house_price.text.strip() print(f"价格:{price_text}\n")
关键优化点说明
- 修正标签匹配:把错误的
find_all('id', ...)改成了find_all('div', class_='...'),准确匹配房源的父容器。 - 添加请求头:通过
User-Agent模拟浏览器请求,避免被网站反爬机制拦截。 - 简化class匹配:只保留class中独特的前缀部分,降低网站更新class导致代码失效的概率。
- 增加异常判断:添加了请求状态码检查、容器为空判断,以及元素非空判断,避免程序崩溃,同时方便排查问题。
- 分别处理两个目标元素:同时抓取了你需要的房源描述和价格信息,并且输出清晰。
内容的提问来源于stack exchange,提问作者Triliang123
相关产品推荐
相关产品推荐

