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
相关产品推荐
相关产品推荐

