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

使用Python Selenium抓取URL不变化的网站问题求助

解决AJAX分页的Selenium抓取问题

嘿,这个情况我太熟悉了!这种靠AJAX异步加载内容的分页,确实容易让Selenium刚点击完就拿到旧内容,给你几个实用的解决思路:

1. 显式等待新内容加载完成

这是最常用也最有效的办法。点击下一页后,页面不会立刻更新,你需要让Selenium等待特定元素出现/消失,确认新内容加载完毕后再抓取。比如:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 定位并点击下一页按钮
next_page_btn = driver.find_element(By.XPATH, "//button[contains(text(), '下一页')]")
next_page_btn.click()

# 等待新页面的标志性元素出现(比如新的列表项、更新的页码)
# 这里需要替换成目标网站的实际元素定位
WebDriverWait(driver, 15).until(
    EC.presence_of_element_located((By.CLASS_NAME, "new-page-item"))
)

# 现在再获取页面内容就没问题了
current_page_html = driver.page_source

如果不确定等哪个元素,也可以等待旧页面的某个元素消失,比如上一页的最后一条数据。

2. 检查是否切换了窗口/iframe

有些网站点击下一页会弹出新窗口,或者把内容加载到隐藏的iframe里。这时候你需要切换Selenium的上下文:

  • 切换新窗口:
# 点击下一页后,获取所有窗口句柄
all_windows = driver.window_handles
# 切换到最新打开的窗口
driver.switch_to.window(all_windows[-1])
  • 切换iframe:
# 找到目标iframe并切换进去
target_iframe = driver.find_element(By.ID, "content-iframe")
driver.switch_to.frame(target_iframe)
# 抓取完成后切回主文档
driver.switch_to.default_content()

3. 直接抓取AJAX接口(效率更高)

打开浏览器的开发者工具(F12),切换到Network面板,点击下一页时观察XHR/fetch请求,你会发现网站其实是通过接口获取分页数据的。直接用requests库调用这些接口,比用Selenium快得多:

import requests

# 从Network面板复制请求URL、参数和请求头
url = "https://目标网站/api/page-data"
params = {"page": 2, "limit": 20}
headers = {"User-Agent": "你的浏览器UA"}

response = requests.get(url, params=params, headers=headers)
data = response.json()
# 直接解析JSON数据即可,不用处理HTML结构

这种方法避开了页面渲染的问题,是最优解,前提是能找到对应的接口。

4. 等待页面状态变化

如果页面有加载动画,或者滚动位置会更新,也可以基于这些状态等待:

  • 等待加载动画消失:
WebDriverWait(driver, 10).until(
    EC.invisibility_of_element_located((By.CLASS_NAME, "loading-spinner"))
)
  • 等待滚动位置变化:
# 记录点击前的滚动位置
old_scroll_pos = driver.execute_script("return window.pageYOffset;")
next_page_btn.click()
# 等待滚动位置发生变化
WebDriverWait(driver, 10).until(
    lambda d: d.execute_script("return window.pageYOffset;") != old_scroll_pos
)

你可以先从显式等待开始尝试,这基本能解决大部分问题。如果还是不行,去看看Network面板的请求,直接抓接口会省心很多!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:37:03