BeautifulSoup抓取Autochek仅返回前8条车辆数据 无法获取完整HTML如何解决
问题原因
- 目标站点采用无限滚动懒加载机制,首次请求仅返回前8条车辆数据,后续数据需要用户滚动页面到接近底部时才会触发接口请求加载渲染
- 原代码筛选完成后切换为requests请求静态HTML,只能拿到首次渲染的初始内容,无法获取后续异步加载的车辆数据
代码调整方案
直接基于已完成筛选的Selenium驱动模拟滚动加载,等所有数据加载完成后再提取页面内容解析,调整后的完整代码如下:
from bs4 import BeautifulSoup import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By import time url = 'https://autochek.africa/ng/cars-for-sale' driver = webdriver.Chrome() driver.get(url) driver.maximize_window() time.sleep(2) # 适配selenium 4+写法,原find_element_by_xpath已废弃 xpath_search = r'//*[@id="__next"]/div/div[2]/div/div/div[2]/div[3]/div[2]/div[3]/div/div' element = driver.find_element(By.XPATH, xpath_search) element.click() element_2 = driver.find_element(By.XPATH, r'//*[@id="__next"]/div/div[2]/div/div/div[2]/div[3]/div[2]/div[3]/div/ul/li[4]') element_2.click() time.sleep(3) # -------------------新增滚动加载逻辑------------------- last_car_count = 0 while True: # 滚动到页面底部触发加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待新内容加载完成,可根据网络情况调整等待时长 time.sleep(3) # 统计当前页面车辆条目数量 current_cars = driver.find_elements(By.CSS_SELECTOR, 'div.car-grid-container a.hover\\:tw-shadow-md') current_car_count = len(current_cars) # 车辆数量无变化说明已加载完全部内容,退出循环 if current_car_count == last_car_count: break last_car_count = current_car_count # ------------------------------------------------------ # 直接使用Selenium渲染完成的全量页面源码解析,无需再发requests请求 soup = BeautifulSoup(driver.page_source,'html.parser') # 操作完成关闭浏览器驱动 driver.quit() tag = 'div' attributes = {'class':'car-grid-container'} content_list = soup.find_all(tag, attributes) basic_info = [] for item in content_list: basic_info.append(item.find_all('a', {'class':'hover:tw-shadow-md'})) text_info = [] for item in content_list: text_info.append(item.find_all('div', {'class':'other-details tw-flex tw-flex-row tw-justify-between tw-items-stretch'}))
调整说明
- 移除了原代码中requests发送请求的逻辑,直接抓取Selenium渲染完成的全量页面内容,避免异步加载数据丢失
- 新增的滚动循环会持续触发加载直到没有新的车辆数据出现,确保拿到全部在售车辆数据
- 兼容了Selenium 4.x版本的元素定位写法,避免版本兼容报错
内容的提问来源于stack exchange,提问作者Alex Markides
相关产品推荐
相关产品推荐

