Selenium/Python点击Next按钮后URL无变化 无法正常抓取下一页数据
问题根因
你抓取的站点属于单页应用(SPA),翻页操作通过Ajax异步加载渲染内容,页面URL不会随翻页发生变化,所以你每次用未变化的URL通过requests发起请求,拿到的永远是首页的返回结果,和你是否点击了Next按钮无关。同时你现有代码存在逻辑缺陷,点击翻页后没有复用Selenium已加载的新页面内容,且循环仅执行一次就会终止。
可行解决方案
方案1:直接调用后端API(更稳定高效)
不需要依赖Selenium模拟点击,直接请求翻页对应的后端接口即可,操作步骤如下:
- 打开浏览器F12开发者工具,切换到「网络」面板,筛选「Fetch/XHR」类型的请求
- 点击页面上的Next按钮,就能捕获到翻页对应的POST请求,接口地址为
https://www.hunterdouglas.com/xdan/locator/v1/search - 请求参数中包含
pageNum(页码)、pageSize(每页条数)、address、country等字段,你只需要修改pageNum的数值,构造合法的POST请求就能拿到所有页的结果,比模拟点击的性能和稳定性高很多。
方案2:修正现有Selenium代码
如果你需要继续使用Selenium方案,可以按以下规则修改代码:
- 不要使用requests重新请求页面URL,点击Next等待内容加载完成后,直接取
driver.page_source传给bs4解析,这部分源码已经包含异步加载的新页内容 - 替换固定等待
time.sleep(10)为显式等待,避免等待时间不足或者过长的问题:可以在点击Next前先记录当前页第一条列表数据的唯一标识,点击后等待页面出现和之前标识不同的第一条数据,再开始解析 - 移除循环中
else分支的break语句,增加Next按钮是否置灰不可用的判断,按钮不可用时再终止循环
修正后参考代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains from bs4 import BeautifulSoup import time # 先获取第一页内容 first_page = driver.page_source get_page_content(first_page) # 你的解析函数,直接传页面源码即可 loop = True while loop: try: # 记录点击前第一条数据的内容 pre_first_item = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.locator-result-item'))).text # 等待Next按钮可点击 next_btn = WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH, '//button[text()="Next"]'))) # 滚动到按钮位置点击 ActionChains(driver).move_to_element(next_btn).click(next_btn).perform() # 等待页面内容更新:第一条数据发生变化 WebDriverWait(driver, 10).until_not( EC.text_to_be_present_in_element((By.CSS_SELECTOR, '.locator-result-item'), pre_first_item) ) except Exception as e: loop = False print(e, f"翻页终止,当前页面:{driver.current_url}") else: # 直接拿当前渲染好的页面源码解析 current_page_source = driver.page_source get_page_content(current_page_source)
内容的提问来源于stack exchange,提问作者Justin Benfit
相关产品推荐
相关产品推荐

