【Python爬虫(14)】解锁Selenium:Python爬虫的得力助手

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发者,都能从中汲取知识,助力掌握爬虫核心技能,开拓技术视野。

目录


一、Selenium 库简介

在 Python 爬虫领域中,当我们面对那些充满动态交互和 JavaScript 渲染的网页时,传统的爬虫库往往显得力不从心 。比如使用requests库,它只能获取静态页面的内容,对于通过 JavaScript 动态加载的数据,就无法直接获取。而 Selenium 库则宛如一把神奇的钥匙,能够打开动态网页数据获取的大门。

Selenium 最初是为 Web 应用程序测试而设计的强大工具,它可以模拟真实用户在浏览器中的各种操作,如点击按钮、填写表单、滚动页面等 。在爬虫场景下,Selenium 主要用于解决requests等库无法直接执行 JavaScript 代码的问题,通过驱动浏览器,实现对网页的完全模拟操作,从而获取网页渲染之后的完整结果。无论是需要模拟登录才能访问的数据,还是通过下拉加载、点击加载更多等方式呈现的动态数据,Selenium 都能应对自如。正是这些特性,使得 Selenium 在 Python 爬虫中占据着不可或缺的地位,成为爬虫开发者攻克动态网页数据抓取难题的有力武器,接下来,我们就深入学习 Selenium 库的基础使用方法。

二、安装与配置

在使用 Selenium 库之前,我们需要先进行安装和配置,确保其能够在我们的开发环境中正常运行。这包括安装 Selenium 库本身,以及下载和配置对应的浏览器驱动。

2.1 安装 Selenium 库

Selenium 库可以通过 Python 的包管理工具 pip 进行安装。打开命令行终端,输入以下命令:

python 复制代码
pip install selenium

如果你的网络连接较慢,或者默认的 pip 源不稳定,你可以使用国内的镜像源来加速下载。例如,使用清华大学的镜像源:

python 复制代码
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

在安装过程中,可能会遇到一些问题。比如,如果你使用的是 Python 2.x 版本,可能会出现兼容性问题,因为 Selenium 库对 Python 2.x 的支持逐渐减少。建议你升级到 Python 3.x 版本,以获得更好的兼容性和性能。另外,如果你的 pip 版本过旧,也可能导致安装失败。你可以通过以下命令来升级 pip:

python 复制代码
pip install --upgrade pip

安装完成后,你可以在 Python 交互式环境中输入以下代码来验证是否安装成功:

python 复制代码
import selenium
print(selenium.__version__)

如果没有报错,并且输出了 Selenium 库的版本号,说明安装成功。

2.2 下载浏览器驱动

Selenium 库需要通过浏览器驱动来控制浏览器的行为。不同的浏览器需要下载对应的驱动,并且驱动版本要与浏览器版本相匹配。以下是常见浏览器驱动的下载地址:

Chrome 浏览器驱动(Chromedriver):https://chromedriver.chromium.org/downloads

Firefox 浏览器驱动(Geckodriver):https://github.com/mozilla/geckodriver/releases

Edge 浏览器驱动(Microsoft Edge WebDriver):https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

以 Chrome 浏览器为例,下载驱动时,你需要先查看自己的 Chrome 浏览器版本。打开 Chrome 浏览器,在地址栏输入chrome://version/,即可查看浏览器版本号。然后,根据版本号在 Chromedriver 下载页面选择对应的驱动版本进行下载。例如,如果你的 Chrome 浏览器版本是 91.0.4472.124,你就需要下载与之匹配的 Chromedriver 版本。

2.3 配置浏览器驱动

下载好浏览器驱动后,需要将其配置到系统环境变量中,或者在代码中指定驱动的路径,确保 Selenium 能够正确调用。

配置环境变量(推荐)

  • Windows 系统:将下载的驱动文件解压到一个目录,比如C:\chromedriver。然后,右键点击 "此电脑",选择 "属性",点击 "高级系统设置",在弹出的窗口中点击 "环境变量"。在 "系统变量" 中找到 "Path" 变量,点击 "编辑",在弹出的编辑环境变量窗口中,点击 "新建",将驱动所在目录C:\chromedriver添加进去,点击 "确定" 保存设置。
  • MacOS 系统:将下载的驱动文件解压后,使用命令将其移动到/usr/local/bin目录下,例如sudo mv /path/to/chromedriver /usr/local/bin/,并赋予执行权限sudo chmod +x /usr/local/bin/chromedriver。
  • Linux 系统:与 MacOS 系统类似,将驱动文件解压后移动到合适的目录,并添加到环境变量中。

在代码中指定驱动路径

如果不想配置环境变量,也可以在代码中直接指定驱动路径。以 Chrome 浏览器为例,使用以下代码:

python 复制代码
from selenium import webdriver

# 指定Chromedriver路径
driver = webdriver.Chrome(executable_path='C:/chromedriver/chromedriver.exe')

这样,我们就完成了 Selenium 库和浏览器驱动的安装与配置,可以开始使用 Selenium 进行网页操作了。

三、基本操作

在完成 Selenium 库和浏览器驱动的安装与配置后,我们就可以使用 Selenium 来进行网页操作了。接下来,我们将介绍如何使用 Selenium 打开网页,以及对网页元素进行点击和输入等操作。

3.1 打开网页

使用 Selenium 打开网页非常简单,通过webdriver对象的get方法即可实现。以下是一个打开百度首页的示例代码:

python 复制代码
from selenium import webdriver

# 创建Chrome浏览器驱动对象
driver = webdriver.Chrome()

# 打开百度首页
driver.get('https://www.baidu.com')

# 关闭浏览器
driver.quit()

在上述代码中,首先创建了一个Chrome浏览器驱动对象driver,然后使用driver.get(url)方法打开指定的网页,这里的url是百度首页的网址。最后,使用driver.quit()方法关闭浏览器并释放资源。

在实际使用中,可能会遇到页面加载超时的问题。比如,当网络状况不佳或者目标网页响应缓慢时,页面可能无法在默认时间内加载完成,这会导致后续操作无法正常进行。为了解决这个问题,Selenium 提供了两种设置页面加载超时的方法:set_page_load_timeout和page_load_strategy。

set_page_load_timeout方法可以设置页面的加载超时时间,单位为秒。当页面加载时间超过设置的时间时,会抛出TimeoutException异常。我们可以使用try...except语句来捕获这个异常,并在异常处理中使用driver.execute_script('window.stop()')方法来强制停止页面加载,使程序继续执行后续操作 。示例代码如下:

python 复制代码
import time
from selenium import webdriver
from selenium.common.exceptions import TimeoutException

# 创建Chrome浏览器驱动对象
driver = webdriver.Chrome()

# 设置页面加载超时时间为10秒
driver.set_page_load_timeout(10)

try:
    # 打开网页
    driver.get('https://www.example.com')
except TimeoutException:
    # 超时后执行Javascript停止页面加载
    driver.execute_script('window.stop()')

# 关闭浏览器
driver.quit()

page_load_strategy属性则用于设置页面加载策略,它有三个可选值:normal(默认)、eager和none 。normal策略表示等待整个页面加载完成,包括文件、css、js 等所有资源;eager策略表示等待整个 DOM 树加载完成,即DOMContentLoaded事件完成,放弃等待图片、样式、子框架的加载;none策略表示等待 html 下载完成,哪怕还没开始解析。通过设置合适的加载策略,可以缩短等待时间,提高执行速度。例如,设置加载策略为eager的代码如下:

python 复制代码
import time
from selenium import webdriver

# 创建ChromeOptions对象
options = webdriver.ChromeOptions()
# 设置加载策略为eager
options.page_load_strategy = 'eager'

# 创建Chrome浏览器驱动对象,并传入options
driver = webdriver.Chrome(options=options)

# 打开网页
driver.get('https://www.example.com')

# 关闭浏览器
driver.quit()

3.2 操作元素 - 点击

在网页操作中,点击按钮、链接等元素是常见的操作。使用 Selenium 进行元素点击操作,首先需要定位到要点击的元素,然后调用元素的click方法。Selenium 提供了多种定位元素的方法,以下是一些常见的定位方法示例:

  • 通过 id 定位:如果元素具有唯一的id属性,可以使用find_element_by_id方法通过id值来定位元素。例如,百度首页搜索按钮的id为su,定位并点击该按钮的代码如下:
python 复制代码
from selenium import webdriver

# 创建Chrome浏览器驱动对象
driver = webdriver.Chrome()

# 打开百度首页
driver.get('https://www.baidu.com')

# 通过id定位搜索按钮
search_button = driver.find_element_by_id('su')

# 点击搜索按钮
search_button.click()

# 关闭浏览器
driver.quit()
  • 通过 name 定位:使用find_element_by_name方法通过元素的name属性值来定位元素。比如,百度搜索框的name属性为wd,可以这样定位并输入搜索内容:
python 复制代码
from selenium import webdriver

# 创建Chrome浏览器驱动对象
driver = webdriver.Chrome()

# 打开百度首页
driver.get('https://www.baidu.com')

# 通过name定位搜索框
search_box = driver.find_element_by_name('wd')

# 在搜索框中输入内容
search_box.send_keys('Python爬虫')

# 关闭浏览器
driver.quit()
  • 通过 class name 定位:使用find_element_by_class_name方法通过元素的class属性值来定位元素。例如,假设某个按钮的class为btn btn-primary,可以这样定位并点击:
python 复制代码
from selenium import webdriver

# 创建Chrome浏览器驱动对象
driver = webdriver.Chrome()

# 打开网页
driver.get('https://www.example.com')

# 通过class name定位按钮
button = driver.find_element_by_class_name('btn.btn-primary')

# 点击按钮
button.click()

# 关闭浏览器
driver.quit()
  • 通过 xpath 定位:XPath 是一种用于在 XML 文档中查找信息的语言,也可以用于在 HTML 页面中定位元素。XPath 定位非常灵活,可以通过元素的属性、层级关系等多种方式进行定位。例如,要定位百度首页的搜索框,可以使用以下 XPath 表达式://*[@id="kw"],代码如下:
python 复制代码
from selenium import webdriver

# 创建Chrome浏览器驱动对象
driver = webdriver.Chrome()

# 打开百度首页
driver.get('https://www.baidu.com')

# 通过xpath定位搜索框
search_box = driver.find_element_by_xpath('//*[@id="kw"]')

# 在搜索框中输入内容
search_box.send_keys('Python爬虫')

# 关闭浏览器
driver.quit()
  • 通过 css selector 定位:CSS 选择器是一种用于选择 HTML 元素的模式,与 XPath 类似,也可以用于定位元素。例如,要定位百度首页的搜索按钮,可以使用以下 CSS 选择器:#su,代码如下:
python 复制代码
from selenium import webdriver

# 创建Chrome浏览器驱动对象
driver = webdriver.Chrome()

# 打开百度首页
driver.get('https://www.baidu.com')

# 通过css selector定位搜索按钮
search_button = driver.find_element_by_css_selector('#su')

# 点击搜索按钮
search_button.click()

# 关闭浏览器
driver.quit()

3.3 操作元素 - 输入

在网页中,填写表单是常见的操作之一。使用 Selenium 在输入框中输入内容,同样需要先定位到输入框元素,然后使用元素的send_keys方法来输入文本。例如,在百度搜索框中输入 "Python 爬虫" 并提交搜索:

python 复制代码
from selenium import webdriver

# 创建Chrome浏览器驱动对象
driver = webdriver.Chrome()

# 打开百度首页
driver.get('https://www.baidu.com')

# 定位搜索框
search_box = driver.find_element_by_id('kw')

# 输入搜索内容
search_box.send_keys('Python爬虫')

# 提交搜索,模拟按下回车键
search_box.send_keys('\n')

# 关闭浏览器
driver.quit()

在上述代码中,首先通过id定位到百度搜索框,然后使用send_keys方法输入搜索内容 "Python 爬虫",最后再次使用send_keys方法并传入\n(换行符,模拟回车键)来提交搜索。

除了简单的输入文本,有时还需要处理一些特殊情况。比如,在输入之前可能需要清空输入框中的原有内容,可以使用元素的clear方法。例如:

python 复制代码
from selenium import webdriver

# 创建Chrome浏览器驱动对象
driver = webdriver.Chrome()

# 打开网页
driver.get('https://www.example.com')

# 定位输入框
input_box = driver.find_element_by_id('input-box')

# 清空输入框
input_box.clear()

# 输入新内容
input_box.send_keys('新的文本内容')

# 关闭浏览器
driver.quit()

这样,我们就完成了使用 Selenium 进行打开网页、操作元素(点击、输入)的基本操作。通过这些操作,我们可以模拟用户在浏览器中的行为,实现对网页的自动化交互。

四、页面等待策略

在使用 Selenium 进行网页操作时,由于网络状况、网页加载速度以及元素渲染等因素的影响,页面元素可能不会立即出现或可用。如果在元素还未准备好的情况下就进行操作,很容易导致NoSuchElementException等异常的出现。为了解决这个问题,Selenium 提供了多种页面等待策略,其中最常用的是隐式等待和显式等待。合理使用这些等待策略,可以大大提高爬虫程序的稳定性和可靠性。下面我们就详细介绍这两种等待策略。

4.1 隐式等待

隐式等待是一种全局等待策略,它为 WebDriver 设置一个全局的超时时间。在这个时间范围内,当 Selenium 查找元素时,如果元素没有立即出现,WebDriver 会定期轮询检查该元素是否存在 ,一旦找到元素,就会立即继续执行后续代码。如果在超时时间内仍未找到元素,则会抛出NoSuchElementException异常。

通过implicitly_wait方法来设置隐式等待时间,单位为秒。以下是设置隐式等待时间为 10 秒的代码示例:

python 复制代码
from selenium import webdriver

# 创建Chrome浏览器驱动对象
driver = webdriver.Chrome()

# 设置隐式等待时间为10秒
driver.implicitly_wait(10)

# 打开网页
driver.get('https://www.example.com')

# 查找元素
element = driver.find_element_by_id('some_element')

# 关闭浏览器
driver.quit()

在上述代码中,driver.implicitly_wait(10)设置了隐式等待时间为 10 秒。在后续查找id为some_element的元素时,如果该元素没有立即出现,Selenium 会在 10 秒内不断尝试查找,直到找到元素或者超时。

隐式等待适用于页面加载较慢但元素固定的场景 。比如,在登录后的静态页面中,虽然页面加载可能需要一些时间,但页面上的元素是固定的,不会动态变化。在这种情况下,使用隐式等待可以确保在查找元素时,有足够的时间让页面加载完成,元素出现。它的优点是设置简单,一次设置后对整个 WebDriver 实例的所有元素定位操作都生效 。但它也有一定的局限性,由于是全局等待,可能会导致不必要的等待时间,影响程序的执行效率。比如,当页面上大部分元素已经加载完成,只有个别元素加载较慢时,隐式等待会等待所有元素加载完成,即使其他元素已经可以进行操作。

4.2 显式等待

显式等待是一种更为灵活的等待策略,它可以针对某些特定的元素设置等待条件和超时时间 ,直到满足设定的条件后才会继续执行后续代码。显式等待主要通过WebDriverWait类和expected_conditions模块来实现。

WebDriverWait类用于设置等待的基本参数,包括 WebDriver 实例、超时时间、调用频率(默认 0.5 秒)和要忽略的异常(默认忽略NoSuchElementException异常)。expected_conditions模块则提供了一系列丰富的预期条件,如presence_of_element_located(等待元素出现在 DOM 中,但不一定可见)、visibility_of_element_located(等待元素出现在 DOM 中且可见)、element_to_be_clickable(等待元素可见并可点击)等。

以下是一个使用显式等待等待按钮可点击并点击的代码示例:

python 复制代码
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

# 创建Chrome浏览器驱动对象
driver = webdriver.Chrome()

# 打开网页
driver.get('https://www.example.com')

# 设置显式等待条件:等待某按钮元素可点击,最长等待10秒
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID,'some_button')))

# 点击按钮
element.click()

# 关闭浏览器
driver.quit()

在上述代码中,首先创建了一个WebDriverWait对象wait,设置最长等待时间为 10 秒。然后使用wait.until方法,传入EC.element_to_be_clickable((By.ID,'some_button'))条件,等待id为some_button的按钮元素变为可点击状态。当按钮满足可点击条件时,until方法会返回该元素,程序继续执行后续的点击操作。如果在 10 秒内按钮一直未满足可点击条件,则会抛出TimeoutException异常。

显式等待适用于页面动态加载,元素需要特定条件才能出现的情况 。比如,有些网页使用 Ajax 技术,当用户点击某个按钮后,会通过 Ajax 请求动态加载新的内容,新内容中的元素需要在请求完成并渲染后才会出现。在这种情况下,使用显式等待可以根据元素的特定条件(如是否可见、是否可点击等)来等待元素出现,而不是像隐式等待那样盲目等待整个页面加载完成,从而提高程序的执行效率和准确性。通过合理使用WebDriverWait和expected_conditions,我们可以实现各种复杂的等待逻辑,确保爬虫程序能够准确地获取到所需的页面元素和数据 。

五、总结与实践建议

通过本文的学习,我们深入了解了 Selenium 库在 Python 爬虫中的基础使用方法。从安装与配置 Selenium 库及浏览器驱动,到使用 Selenium 打开网页、操作元素,再到运用页面等待策略来确保爬虫程序的稳定性,这些都是使用 Selenium 进行网页数据抓取的关键技能。

Selenium 库的强大之处在于它能够模拟真实用户的操作,突破动态网页数据获取的障碍。在安装和配置过程中,要注意 Selenium 库与浏览器驱动版本的匹配,以及驱动的正确配置,这是使用 Selenium 的前提。在操作网页元素时,熟练掌握各种定位元素的方法,能够根据不同的网页结构灵活选择合适的定位方式,是实现精准操作的关键。而页面等待策略的合理运用,则是保证爬虫程序能够在复杂的网络环境和网页加载情况下稳定运行的重要保障。

对于读者来说,实践是掌握这些知识的最好方式。建议大家通过爬取一些简单的网页数据进行练习,比如爬取新闻网站的文章标题和链接、电商网站的商品信息等。在实践过程中,不断尝试不同的操作和等待策略,加深对 Selenium 库的理解和运用能力。同时,遇到问题时要善于查阅官方文档和相关资料,积极探索解决方案,逐步提升自己在 Python 爬虫领域的技术水平。

相关推荐
爱丫爱1 分钟前
Python中常见库 PyTorch和Pydantic 讲解
开发语言·pytorch·python
Ryan_Gosling2 分钟前
C++-构造函数-接口
开发语言·c++
诚信爱国敬业友善5 分钟前
GUI编程(window系统→Linux系统)
linux·python·gui
查理零世22 分钟前
【蓝桥杯集训·每日一题2025】 AcWing 6134. 哞叫时间II python
python·算法·蓝桥杯
紫雾凌寒31 分钟前
解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”
人工智能·python·神经网络·算法·机器学习·卷积神经网络
sun lover44 分钟前
conda简单命令
python·conda
服务端相声演员1 小时前
Oracle JDK、Open JDK zulu下载地址
java·开发语言
Mike_188702783511 小时前
1688代采下单API接口使用指南:实现商品采集与自动化下单
前端·python·自动化
19岁开始学习1 小时前
Go学习-入门
开发语言·学习·golang
青铜念诗1 小时前
python脚本文件设置进程优先级(在.py文件中实现)
开发语言·python