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

Selenium多页爬取仅抓取1页的问题排查与修复方案

代码错误排查

你的代码爬不到多页数据是几个逻辑错误叠加导致的:

  • 分页判断逻辑位置错误:你把翻页判断写在了单条详情页的遍历循环里,而且每次进入详情页爬取完单条数据后,就直接判断下一页按钮——此时浏览器停在律师详情页,根本不存在列表页的分页按钮,判断条件永远不会按预期触发
  • 循环终止逻辑错误:就算触发了翻页判断,你在page +=1之后无论是否达到5页阈值都写了break,直接跳出整个循环,根本不会继续爬取新页内容
  • 链接抓取逻辑错误:page_links只在脚本最开始初始化时抓取了一次第一页的详情链接,翻页后没有重新抓取新页面的条目链接,自然不会爬取后续页的内容
  • 入口URL参数错误:初始访问的URL缺少weergave=lijst(列表视图)、pagina(页码)等关键参数,和你构造的分页URL结构不统一,容易触发站点重定向到非预期页面
  • 细节兼容问题:用了Selenium 4已废弃的find_element_by_xpath旧接口,新版本环境下运行会直接抛异常;另外进入详情页爬完数据后没有返回列表页,后续的元素判断全在详情页执行,完全匹配不到目标元素
修正后可运行代码
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import pandas as pd

options = webdriver.ChromeOptions()
options.add_argument("--no-sandbox")
options.add_argument("--disable-gpu")
options.add_argument("--window-size=1920x1080")
options.add_argument("--disable-extensions")

chrome_driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    options=options
)


def supplyvan_scraper():
    data = []
    max_page = 5 # 要爬的最大页数,按需修改
    with chrome_driver as driver:
        driver.implicitly_wait(15)
        # 统一使用和分页规则一致的入口URL,从第一页开始
        base_url = "https://zoekeenadvocaat.advocatenorde.nl/zoeken?q=&type=advocaten&limiet=10&sortering=afstand&filters%5Brechtsgebieden%5D=%5B%5D&filters%5Bspecialisatie%5D=0&filters%5Btoevoegingen%5D=0&locatie%5Badres%5D=Holland&locatie%5Bgeo%5D%5Blat%5D=52.132633&locatie%5Bgeo%5D%5Blng%5D=5.291266&locatie%5Bstraal%5D=56&locatie%5Bhash%5D=67eb2b8d0aab60ec69666532ff9527c9&weergave=lijst&pagina={}"
        
        for current_page in range(1, max_page + 1):
            # 跳转当前页码的列表页
            driver.get(base_url.format(current_page))
            time.sleep(3)
            # 每次翻页后重新抓取当前页所有详情链接
            page_links = [element.get_attribute('href') for element in
                        driver.find_elements(By.XPATH, "//span[@class='h4 no-margin-bottom']//a")]
            if not page_links:
                # 没有抓到条目说明已经到最后一页,直接终止
                break

            # 遍历当前页所有详情链接
            for link in page_links:
                wev = {}
                driver.get(link)
                time.sleep(2)
                # 抓取详情字段,缺省值设为空字符串避免未定义报错
                title = ""
                try:
                    title = driver.find_element(By.CSS_SELECTOR, '.title h3').text
                except:
                    pass
                wev['title'] = title
                
                advocaten = ""
                try:
                    advocaten = driver.find_element(By.CSS_SELECTOR,".secondary").text
                except:
                    pass
                wev['advocaten'] = advocaten
                
                address = ""
                email = ""
                website = ""
                details = driver.find_elements(By.XPATH,"//section[@class='lawyer-info']")
                for detail in details:
                    try:
                        address = detail.find_element(By.XPATH, ".//div[@class='column medium-6']").text.strip()
                    except:
                        pass
                    try:
                        email = detail.find_element(By.XPATH, ".//div[@class='row'][3]//div[@class='column small-9']//a").get_attribute('href')
                    except:
                        pass
                    try:
                        website = detail.find_element(By.XPATH, ".//div[@class='row'][4]//div[@class='column small-9']//a").get_attribute('href')
                    except:
                        pass
                wev['address'] = address
                wev['email'] = email
                wev['website'] = website
                data.append(wev)
        
    df = pd.DataFrame(data)
    print(df)
    # 如需保存结果取消下面注释即可
    # df.to_csv("advocaten_data.csv", index=False, encoding="utf-8-sig")

if __name__ == "__main__":
    supplyvan_scraper()
额外优化点说明
  • 把详情内的xpath匹配从全局//改成相对路径.//,避免在详情页匹配到其他非目标区块的元素
  • 所有字段提前初始化空值,解决原代码里如果元素抓不到会触发变量未定义报错的问题
  • 把分页循环改成外层独立逻辑,单页详情遍历做内层循环,逻辑分层更清晰,不会出现跨页面找元素的问题
  • 增加空列表判断,抓不到条目时自动终止,不需要硬依赖下一页按钮判断
  • 补全函数入口判断,直接运行脚本即可触发爬取
  • 直接通过修改URL参数实现翻页,比模拟点击下一页按钮更稳定,不会因为按钮加载延迟、被遮挡导致翻页失败

内容的提问来源于stack exchange,提问作者Amen Aziz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:54:22