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,运行效率最高:
- 打开浏览器开发者工具的「网络」面板,筛选「XHR/ fetch」分类,滚动页面加载更多房源时,找到返回房源列表数据的后端接口
- 分析接口的请求参数、鉴权规则后,直接用
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
相关产品推荐
相关产品推荐

