如何使用Python Selenium遍历同名View链接并实现循环爬取
解决Selenium爬虫循环处理止赎板块所有View链接的问题
问题背景
我用Python和Selenium做网页爬虫,已完成80%内容,但无网页开发经验,对Selenium了解有限,不会识别标签与元素。目前能成功导航到目标页面,点击止赎(Foreclosures)板块的第一个"View"链接,切换到新窗口爬取数据,但不知道如何从子窗口返回原页面,也不会遍历下一个"View"链接。需要实现循环点击该板块所有"View"链接,爬取每个对应页面的数据。
需求总结
- 从子窗口返回原页面
- 定位下一个"View"链接
- 执行爬取代码
- 重复操作直至所有链接处理完毕
核心解决步骤
1. 从子窗口返回原页面
打开新窗口前先记录原窗口的句柄(handle),爬取完子页面数据后:
- 关闭当前子窗口
- 切换回原窗口的句柄
关键代码片段:
# 记录原窗口句柄 original_window = driver.current_window_handle # 点击View链接后切换到新窗口 link.click() # 等待新窗口加载完成 WebDriverWait(driver, 10).until(lambda d: len(d.window_handles) == 2) # 切换到新窗口 for window_handle in driver.window_handles: if window_handle != original_window: driver.switch_to.window(window_handle) break # 爬取数据... # 关闭子窗口并切回原窗口 driver.close() driver.switch_to.window(original_window)
2. 定位所有止赎板块的View链接
不要用find_element(仅返回第一个元素),改用find_elements获取所有符合条件的链接。同时为避免误抓其他板块的View链接,先定位到止赎板块容器,再在内部查找链接:
方法一(通过板块ID定位):
# 定位止赎板块的表格容器(需根据页面实际结构调整) foreclosures_table = driver.find_element("id", "foreclosures") # 获取该板块下所有View链接 view_links = foreclosures_table.find_elements("link text", "View")
方法二(通过XPath精准定位):
# 定位包含"Foreclosures"标题区域下的所有View链接 view_links = driver.find_elements(By.XPATH, "//h3[contains(text(), 'Foreclosures')]/following::a[text()='View']")
3. 封装爬取逻辑
把爬取子页面数据的代码封装成函数,提高复用性:
def scrape_foreclosure_data(driver): labels = ["lbl1", "lbl2", "lbl3", "lbl4", "lbl5", "lbl6", "lbl7", "lbl8", "lbl9", "lbl10", "lbl11"] list_of_data = [] for item in labels: # 显式等待元素加载,避免超时 element = WebDriverWait(driver, 10).until(lambda d: d.find_element("id", item)) list_of_data.append(element.text) titles = ["Borrower", "Address", "Original Trustee", "Attorney", "Instrumental No.", "Substitute Trustee", "Advertised Auction Date", "Date of First Public Notice", "Trust Date", "DR No."] return dict(zip(titles, list_of_data))
4. 循环遍历所有链接
遍历获取到的view_links列表,逐个处理每个链接,完成爬取后返回原窗口继续下一个:
for index, link in enumerate(view_links): print(f"正在处理第{index+1}条记录...") # 滚动到链接可见位置,避免点击失败 driver.execute_script("arguments[0].scrollIntoView();", link) link.click() # 等待新窗口并切换 WebDriverWait(driver, 10).until(lambda d: len(d.window_handles) == 2) for window_handle in driver.window_handles: if window_handle != original_window: driver.switch_to.window(window_handle) break # 爬取并处理数据 data = scrape_foreclosure_data(driver) for key, value in data.items(): print(f"{key}: {value}") print("--- 完成当前记录 ---") # 返回原窗口 driver.close() driver.switch_to.window(original_window)
完整修改后的代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By def scrape_foreclosure_data(driver): labels = ["lbl1", "lbl2", "lbl3", "lbl4", "lbl5", "lbl6", "lbl7", "lbl8", "lbl9", "lbl10", "lbl11"] list_of_data = [] for item in labels: element = WebDriverWait(driver, 10).until(lambda d: d.find_element("id", item)) list_of_data.append(element.text) titles = ["Borrower", "Address", "Original Trustee", "Attorney", "Instrumental No.", "Substitute Trustee", "Advertised Auction Date", "Date of First Public Notice", "Trust Date", "DR No."] return dict(zip(titles, list_of_data)) # 初始化驱动 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.maximize_window() # 导航到目标页面 driver.get("http://www.hamiltoncountyherald.com/PublicNotices.aspx") # 记录原窗口句柄 original_window = driver.current_window_handle # 获取止赎板块下的所有View链接 view_links = WebDriverWait(driver, 10).until( lambda d: d.find_elements(By.XPATH, "//h3[contains(text(), 'Foreclosures')]/following::a[text()='View']") ) # 遍历所有链接 for index, link in enumerate(view_links): print(f"正在处理第{index+1}条记录...") driver.execute_script("arguments[0].scrollIntoView();", link) link.click() # 切换到新窗口 WebDriverWait(driver, 10).until(lambda d: len(d.window_handles) == 2) for window_handle in driver.window_handles: if window_handle != original_window: driver.switch_to.window(window_handle) break # 爬取数据 data = scrape_foreclosure_data(driver) for key, value in data.items(): print(f"{key}: {value}") print("--- 完成当前记录 ---") # 返回原窗口 driver.close() driver.switch_to.window(original_window) # 关闭驱动 driver.quit()
注意事项
- 页面元素定位需根据实际页面结构调整,可通过浏览器开发者工具(F12)查看元素真实属性。
- 优先使用
WebDriverWait显式等待,避免页面未加载完成导致的报错,尽量不用time.sleep()强制延时。
内容的提问来源于stack exchange,提问作者jcoop7777
相关产品推荐
相关产品推荐

