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

Beautiful Soup调用soup.select()仅返回前10条结果,是什么原因?

核心问题原因

目标房源站点采用动态懒加载逻辑:首次请求返回的静态HTML中仅包含前10条房源数据,剩余房源需要用户滚动页面后,由前端JS异步请求接口拉取数据再渲染到页面。
requests库仅能获取首次请求返回的静态HTML内容,无法执行页面JS触发后续数据加载,因此不管用select还是find_all匹配元素,都只能拿到前10条结果。

额外代码问题提示:你当前贴出的代码中get_links、get_address、get_prices方法缩进错误,没有归属在DataScraper类内部,运行时会触发属性不存在的报错,需要调整方法的缩进对齐到__init__方法同级。

两种可行解决方案

方案1:直接调用AJAX接口(优先推荐)

该方案无需解析HTML,运行效率最高:

  1. 打开浏览器开发者工具的「网络」面板,筛选「XHR/ fetch」分类,滚动页面加载更多房源时,找到返回房源列表数据的后端接口
  2. 分析接口的请求参数、鉴权规则后,直接用requests调用该接口,返回的JSON数据中会包含所有房源的链接、地址、价格等全量信息。

方案2:使用无头浏览器模拟页面渲染

如果接口参数加密难以逆向,可以用模拟浏览器工具实现JS渲染,核心逻辑如下(以selenium为例):

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

LISTINGS_URL = 'https://shorturl.at/ceoAB'
driver = webdriver.Chrome()
driver.get(LISTINGS_URL)

# 模拟滚动页面直到没有新数据加载
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # 滚动到页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待接口返回数据、页面渲染完成
    time.sleep(2)
    new_height = driver.execute_script("return document.body.scrollHeight")
    # 页面高度不再变化说明所有数据加载完成
    if new_height == last_height:
        break
    last_height = new_height

# 提取全量房源链接
links = driver.find_elements(By.CSS_SELECTOR, ".list-card-top a")
for link in links:
    print(link.get_attribute("href"))

driver.quit()

注意事项

  • 请求时注意控制频率,适当增加间隔时间,避免触发站点反爬规则
  • 若遇到反爬校验,可以根据站点规则调整请求头、添加代理IP等配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:30:02