基于Selenium与BeautifulSoup实现Sales Navigator分页爬取求助
解决方案
核心思路
把单页的滚动加载、姓名提取逻辑封装成可复用的函数,然后循环点击「下一页」按钮处理剩余8页,每次将提取到的姓名直接追加到全局的names列表中。
优化后的完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup import time # 初始化浏览器驱动(根据你的浏览器类型调整,比如Chrome/Firefox) driver = webdriver.Chrome() # 全局存储所有姓名的列表 names = [] def scrape_single_page(driver, names_list): """爬取单页姓名数据并追加到传入的列表""" # 定位结果容器 section = driver.find_element(By.XPATH, "//*[@id='search-results-container']") time.sleep(3) # 执行8次滚动加载 counter = 0 while counter < 8: driver.execute_script('arguments[0].scrollTop = arguments[0].scrollTop + arguments[0].offsetHeight;', section) counter += 1 time.sleep(7) # 解析页面提取姓名 src2 = driver.page_source soup = BeautifulSoup(src2, 'lxml') name_soup = soup.find_all('span', {'data-anonymize': 'person-name'}) # 追加数据到全局列表 for name in name_soup: names_list.append(name.text.strip()) # 1. 处理第一页 dm = "你的Sales Navigator搜索页URL" # 替换为实际搜索页URL driver.get(dm) time.sleep(5) # 等待页面初始加载 scrape_single_page(driver, names) # 2. 处理剩余8页 for page in range(8): try: # 等待下一页按钮可点击后点击(注意:aria-label文本需匹配页面语言,英文页面为"Next") next_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='下一页']")) ) next_btn.click() time.sleep(5) # 等待页面切换加载完成 # 爬取当前页数据 scrape_single_page(driver, names) except Exception as e: print(f"爬取第{page+2}页时出错: {e}") break # 输出结果(可选) print(f"总共爬取到{len(names)}个姓名") print(names) # 关闭浏览器 driver.quit()
关键说明
- 函数复用:
scrape_single_page函数封装了单页的核心操作,避免重复编写相同代码。 - 分页逻辑:循环8次定位并点击下一页按钮,需根据页面实际语言调整按钮的
aria-label文本。 - 等待优化:用
WebDriverWait替代部分time.sleep,能更可靠地等待元素加载,减少页面加载慢导致的错误。 - 全局列表:
names列表在函数外部初始化,确保所有页面的姓名都累计存储在同一个列表中。
内容的提问来源于stack exchange,提问作者Sushmitha
相关产品推荐
相关产品推荐

