使用Selenium爬取无标识符分页页面时如何实现翻页操作?
解决方案
这个站点是典型的ASP.NET WebForm架构,分页操作通过__doPostBack方法触发,就算分页元素没有唯一标识,也可以通过以下两种方式实现下一页导航:
方案1:通过相对路径+文本特征定位下一页按钮
分页区域的页码都属于同一个父容器,当前激活页一般会有特殊样式(比如加粗、用span包裹而非a标签),可以通过以下XPATH定位下一页按钮:
- 定位到当前激活的页码元素后,取它的下一个同级a标签:
//td[@align='center']/span/../following-sibling::td[1]/a - 或者直接匹配下一页的文本标识,该站点下一页用的是
>符号,定位XPATH为://a[text()='>']
方案2:直接执行JS触发分页(更稳定,无需定位元素)
不需要找按钮,直接执行站点内置的__doPostBack方法即可触发翻页,每页对应的参数规则为第一个参数'ctl00$ContentPlaceHolder1$gvDetails',第二个参数为'Page$' + 页码数。
完整的翻页实现代码(接在你现有点击查询的代码之后)
# 等待查询结果加载完成 WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.ID, "ContentPlaceHolder1_gvDetails")) ) page_num = 1 while True: # ------------ 这里写你当前页的数据提取逻辑 ------------ rows = driver.find_elements(By.XPATH, "//table[@id='ContentPlaceHolder1_gvDetails']//tr[position()>1]") for row in rows: # 跳过分页导航行 if "Page" in row.text: continue # 提取字段逻辑可自行调整 cols = row.find_elements(By.TAG_NAME, "td") if len(cols) >=5: yield { "branch_name": cols[0].text.strip(), "address": cols[1].text.strip(), "state": cols[2].text.strip(), "district": cols[3].text.strip(), "pincode": cols[4].text.strip(), "brand": self.brand_name } # ----------------------------------------------------- # 检查是否存在下一页 try: # 尝试定位下一页按钮,不可点击就退出循环 next_btn = WebDriverWait(driver, 3).until( EC.element_to_be_clickable((By.XPATH, "//a[text()='>']")) ) # 若使用方案2的JS触发翻页,可替换上面两行代码为: # driver.execute_script(f"__doPostBack('ctl00$ContentPlaceHolder1$gvDetails', 'Page${page_num+1}')") # 点击下一页 next_btn.click() page_num +=1 # 等待页面加载完成,判断当前页是否更新 WebDriverWait(driver, 20).until( EC.text_to_be_present_in_element( (By.XPATH, "//td[@align='center']/span"), str(page_num) ) ) except Exception as e: # 没有下一页就退出循环 break # 操作完成关闭驱动 driver.quit()
注意事项
- 每次翻页后要加等待逻辑,判断当前页码是否更新,避免还没加载完成就提取数据导致重复
- 如果遇到部分城市分页数量多,可以加随机延时避免被反爬拦截
内容的提问来源于stack exchange,提问作者Aayush Jain
相关产品推荐
相关产品推荐

