使用 Selenium 自动化获取 CSDN 博客资源列表详解

在本文中,我们将详细介绍如何使用 Selenium 自动化工具来滚动页面并获取 CSDN 博客上博主发布的资源列表。我们将逐步展示代码实现过程,并解释每个步骤的作用和原理。

1. 准备工作

在开始之前,请确保已经安装了以下软件和库:

  • Chrome 浏览器:确保你已经安装了最新版的 Chrome 浏览器。
  • ChromeDriver:ChromeDriver 是 Chrome 浏览器的驱动程序,用于控制浏览器的操作。你可以从 ChromeDriver 官网 下载与你的 Chrome 浏览器版本匹配的驱动程序。
  • Python 环境:本文使用 Python 3.x。
  • Selenium 库:Selenium 是一个自动化测试工具,也可以用于自动化浏览器操作。可以通过以下命令安装 Selenium 库:
    pip install selenium
    

2. 编写代码

下面是完整的 Python 代码,用于实现自动化获取 CSDN 博客资源列表的功能。

import os
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

# CSDN 博客资源列表页面 URL
index_url = 'https://blog.csdn.net/XXXX?type=download'

# 获取当前脚本的目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 构建 ChromeDriver 的相对路径
chrome_driver_path = os.path.join(current_dir, 'chromedriver.exe')

# 设置 ChromeDriver 的服务
service = Service(chrome_driver_path)

# 配置 ChromeDriver 的选项以连接到已经运行的 Chrome 实例
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

# 启动 WebDriver 并连接到现有的 Chrome 实例
driver = webdriver.Chrome(service=service, options=chrome_options)

# 获取当前窗口句柄(初始标签页)
main_window = driver.current_window_handle
print(f'Main window handle: {main_window}')

# 打开目标网页
driver.get(index_url)

# 滚动页面,直到加载完所有内容
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # 向下滚动页面
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(1)
    driver.execute_script("window.scrollBy(0, -100);")
    time.sleep(1)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    print('正在滚动页面....')
    # 等待加载新的内容
    time.sleep(2)  # 适当等待时间,可根据页面加载速度调整

    # 计算新的滚动高度并与上次的滚动高度进行比较
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break  # 如果高度没有变化,则表示已到页面底部
    last_height = new_height

# 查找包含 class "resources-list-box" 的元素列表
resource_boxes = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CLASS_NAME, 'resources-list-box'))
)

# 遍历每个资源列表项并点击链接
for box in resource_boxes:
    # 找到内部的 <a> 标签
    link = box.find_element(By.XPATH, './/a')
    href = link.get_attribute('href')

    # 打开链接
    # 模拟人类鼠标点击
    actions = ActionChains(driver)
    actions.move_to_element(link).click().perform()
    print(f'点击链接: {href}')

    # 等待新窗口打开并加载完成
    WebDriverWait(driver, 10).until(EC.new_window_is_opened(driver.window_handles))

    # 获取所有窗口句柄
    all_windows = driver.window_handles

    # 找到新打开的窗口句柄
    new_window = [window for window in all_windows if window != main_window][0]

    # 切换到新打开的窗口
    driver.switch_to.window(new_window)
    print("切换到新窗口")

    # 等待新页面加载完成
    WebDriverWait(driver, 60).until(lambda d: d.execute_script('return document.readyState') == 'complete')

    # 执行需要的操作,例如打印页面标题
    print(f'新页面标题: {driver.title}')

    # 等待一秒钟
    time.sleep(1)
    # 关闭当前窗口
    driver.close()

    # 切换回主窗口
    driver.switch_to.window(main_window)
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'resources-list-box'))
    )

# 关闭浏览器
driver.quit()

3. 解析代码

现在让我们逐步解释上述代码的关键部分:

  • 导入模块:首先导入必要的 Python 模块,包括 ostime 以及 Selenium 相关的模块。

  • 设置 ChromeDriver:设置 ChromeDriver 的服务和选项,确保能够连接到 Chrome 浏览器的已存在实例。

  • 打开目标网页:使用 driver.get(index_url) 打开指定的 CSDN 博客资源页面。

  • 滚动页面:通过执行 JavaScript 脚本来模拟向下滚动页面,直到加载完所有内容。使用 window.scrollTowindow.scrollBy 来实现滚动操作,并使用 time.sleep 等待页面加载新内容。

  • 查找资源列表项:使用 WebDriverWaitpresence_of_all_elements_located 方法来等待并获取页面中所有包含 resources-list-box 类名的元素列表。

  • 点击链接:遍历每个资源列表项,找到内部的 <a> 标签,并模拟人类鼠标点击操作。使用 ActionChains 类来创建操作链,执行 move_to_elementclick 操作。

  • 处理新窗口:等待新窗口打开并加载完成,切换到新打开的窗口处理,例如获取页面标题,并在操作完成后关闭当前窗口并切换回主窗口。

  • 关闭浏览器:最后使用 driver.quit() 方法关闭浏览器,释放资源。

4. 总结

通过本文的示例,我们学习了如何使用 Selenium 和 Python 自动化工具来滚动页面并获取 CSDN 博客上的资源列表。通过模拟用户操作,我们能够获取到页面中的所有内容,并且能够处理新窗口的打开与切换。这对于需要大量获取网页内容或自动化测试网页的场景非常有用。

希望本文能够帮助你理解如何使用 Selenium 进行 Web 自动化,如果你有任何问题或意见,请随时在下方留言!

声明:

** 代码仅用于学习参考使用。请勿使用非法目的。本人不对代码产生的影响负有任何责任。**

Logo

一站式 AI 云服务平台

更多推荐