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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:32:52