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

如何解决Beautiful Soup未等待页面完全加载的爬取问题

解决动态页面抓取问题:BeautifulSoup抓不到延迟加载内容

嘿,这个问题我太熟了!你遇到的是静态爬虫抓动态内容的经典坑——你的urllib只能拿到服务器返回的初始空壳HTML,而那些公寓信息是浏览器加载完初始页面后,通过JavaScript异步请求数据再渲染出来的,所以BeautifulSoup自然抓不到啦。

核心原因

urllib/requests这类工具都是静态HTTP请求工具,只会获取服务器第一次返回的HTML源码,不会执行页面中的JavaScript,也不会等待后续动态加载的内容。而你要爬的公寓网站,是把公寓数据通过AJAX接口异步加载,再用JS渲染到页面的grid-item容器里,所以静态抓取时这些容器还没生成。

解决方案:用Selenium模拟真实浏览器

Selenium会启动一个真实的浏览器(比如Chrome),完全模拟用户浏览的过程:等待页面加载、执行JS、渲染动态内容,之后再获取完整的页面源码给BeautifulSoup解析。

步骤1:安装依赖

先安装Selenium库,以及对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配):

pip install selenium

步骤2:修改后的代码

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 as soup

my_url = 'https://xxxxx.com/properties/?sort=latest'

# 初始化Chrome浏览器(如果ChromeDriver没在PATH里,要指定executable_path参数)
# 无头模式(不弹出浏览器窗口)的配置可以看下面的补充
driver = webdriver.Chrome()
driver.get(my_url)

try:
    # 显式等待:最多等10秒,直到第一个grid-item元素出现
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "grid-item"))
    )
    # 获取完全渲染后的页面源码
    page_html = driver.page_source
    page_soup = soup(page_html, "html.parser")
    containers = page_soup.findAll("div", {"class": "grid-item"})
    
    print(f"成功抓到{len(containers)}个公寓信息!")
    # 这里可以继续处理你的容器内容
finally:
    # 无论成功失败,都关闭浏览器,避免资源占用
    driver.quit()

补充:无头模式(不弹出浏览器窗口)

如果不想每次爬取都弹出浏览器窗口,可以启用无头模式:

from selenium.webdriver.chrome.options import Options

options = Options()
# 启用新版无头模式
options.add_argument('--headless=new')
driver = webdriver.Chrome(options=options)

进阶思路:直接请求API接口(效率更高)

如果你不想用Selenium(毕竟模拟浏览器比较占资源),可以打开浏览器的开发者工具(F12),切换到Network标签,刷新页面后找XHR/Fetch类型的请求,看看有没有返回公寓数据的API接口。找到后直接用requests请求这个接口,就能拿到结构化的JSON数据,不用解析HTML,效率会高很多。

比如你可能会找到类似https://xxxxx.com/api/properties?sort=latest这样的接口,直接请求它:

import requests

api_url = 'https://xxxxx.com/api/properties?sort=latest'
response = requests.get(api_url)
data = response.json()
# 直接处理JSON数据,比解析HTML方便多了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:41:38