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

使用BeautifulSoup爬取房源仅获少量数据,求问题排查与解决方法

问题分析与解决方法

可能的问题点

  • 请求头被识别为爬虫:requests.get() 默认的请求头(尤其是User-Agent)会被网站反爬机制标记,返回的内容是经过限制的部分数据。
  • 页面采用动态渲染:网站可能改用JavaScript加载更多房源,静态请求只能拿到初始加载的少量内容。
  • CSS选择器失效:你使用的css-n8rq67 es62z2j16这类动态生成的CSS类名,网站更新后已变更,导致无法匹配到完整的房源元素。
  • 反爬机制限制访问:多次请求触发了频率限制,或者需要保持会话才能获取完整数据。

对应解决方法

  1. 添加模拟浏览器的请求头
    修改请求代码,带上真实浏览器的User-Agent,同时更新CSS选择器为当前页面的有效类名:

    import requests
    from bs4 import BeautifulSoup
    
    url = "https://www.otodom.pl/pl/oferty/sprzedaz/mieszkanie/poznan?distanceRadius=0&market=ALL&locations=%5Bcities_6-1%5D&viewType=listing&lang=pl&searchingCriteria=sprzedaz&searchingCriteria=mieszkanie&searchingCriteria=cala-polska"
    
    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'
    }
    html_text = requests.get(url, headers=headers).text
    soup = BeautifulSoup(html_text, 'lxml')
    # 先通过浏览器开发者工具查看当前房源article标签的真实class名,替换此处
    houses = soup.find_all('article', class_='css-1e2w4si es62z2j16')
    for i in houses:
        print(i.text)
    
  2. 使用动态渲染工具获取完整内容
    如果网站依赖JavaScript加载数据,静态请求无法获取全部内容,改用Selenium模拟浏览器操作:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    
    url = "https://www.otodom.pl/pl/oferty/sprzedaz/mieszkanie/poznan?distanceRadius=0&market=ALL&locations=%5Bcities_6-1%5D&viewType=listing&lang=pl&searchingCriteria=sprzedaz&searchingCriteria=mieszkanie&searchingCriteria=cala-polska"
    
    driver = webdriver.Chrome()
    driver.get(url)
    # 模拟滚动加载更多内容(按需调整滚动次数)
    for _ in range(3):
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2)
    # 获取所有房源元素
    houses = driver.find_elements(By.TAG_NAME, 'article')
    for house in houses:
        print(house.text)
    driver.quit()
    
  3. 规范爬取行为避免触发限制

    • 给请求添加合理的time.sleep()间隔,避免频繁访问
    • 查看网站robots.txt文件,确认允许爬取的内容范围
  4. 维持会话获取完整数据
    部分网站需要保持会话才能返回完整内容,使用requests.Session()维持会话:

    session = requests.Session()
    session.headers.update(headers)
    # 先请求首页获取必要Cookie
    session.get("https://www.otodom.pl")
    # 再请求目标页面
    response = session.get(url)
    soup = BeautifulSoup(response.text, 'lxml')
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:25:22