Python网页抓取中BeautifulSoup配合Selenium处理无URL变化的分页问题
动态分页场景下的多页数据抓取实现方法
针对分页不更新URL的单页应用场景,可采用以下两种可行方案实现全量分页数据抓取:
方案1:Selenium模拟点击分页(新手友好,适配现有技术栈)
该方案无需额外分析网站底层请求逻辑,直接模拟用户操作即可完成数据抓取,适合对接口分析不熟悉的新手:
- 初始化Selenium驱动打开目标页面,先完成第一页表格数据的提取,可直接复用你已经写好的bs4解析逻辑
- 定位分页区域的下一页按钮,推荐使用
find_element()方法通过CSS选择器或XPath匹配,同时配合显性等待逻辑避免元素未加载导致的点击失败 - 编写循环逻辑:每次点击下一页后,等待表格内容完成更新(可通过判断当前页表格首行内容与上一页是否不同实现,或直接用
WebDriverWait监听表格元素重载),再提取当前页数据追加到总数据集 - 循环终止条件:检测到下一页按钮变为不可点击状态(通常表现为元素class属性新增
disabled字段、aria-disabled属性为true、透明度降低等特征)即可退出循环
示例参考代码:
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 # 初始化驱动 driver = webdriver.Chrome() driver.get("https://olympics.com/tokyo-2020/olympic-games/en/results/all-sports/medalists.htm") wait = WebDriverWait(driver, 10) total_data = [] # 此处替换为你已实现的单页数据提取逻辑 def extract_current_page(): page_html = driver.page_source # 用bs4解析page_html提取表格数据 # return 提取到的当前页数据列表 # 先提取第一页数据 total_data.extend(extract_current_page()) while True: try: # 匹配下一页按钮,选择器可根据页面实际结构调整 next_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//li[contains(@class, 'pagination-next')]/a"))) # 判断下一页是否不可点击 if next_btn.get_attribute("aria-disabled") == "true" or "disabled" in next_btn.get_attribute("class"): break next_btn.click() # 等待表格加载完成,可替换为更精准的内容校验逻辑 wait.until(lambda d: d.find_element(By.TAG_NAME, "tbody").text != "") total_data.extend(extract_current_page()) except Exception as e: break driver.quit()
使用注意:
- 控制点击频率,避免短时间高频请求触发网站反爬限制
- 若分页按钮不在可视区域,可先执行JS滚动到分页区域再进行点击操作
方案2:抓取后端异步接口(效率更高,资源消耗更低)
分页不更新URL的本质是前端点击后发送异步请求拉取分页数据,直接抓取接口性能远高于模拟浏览器操作:
- 打开浏览器F12开发者工具,切换到「网络」面板,筛选「Fetch/XHR」类型请求
- 点击页面下一页按钮,查看网络面板新增的请求,请求参数中通常会携带
page、pageNo、offset等分页标识字段 - 分析接口的请求头、请求参数、返回格式,直接用
requests库循环修改分页参数发起请求即可拿到全量数据,接口返回一般为JSON格式,解析成本比HTML更低
使用注意:
- 部分接口会携带鉴权参数,请求时需要和浏览器发起的请求头保持一致才能正常获取数据
- 可先单独测试单页接口的可访问性,验证通过后再编写循环逻辑
内容的提问来源于stack exchange,提问作者Shiva Govindaswamy
相关产品推荐
相关产品推荐

