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

打印 上一主题 下一主题

主题 1015|帖子 1015|积分 3045

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
【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 进行安装。打开命令行终端,输入以下命令:
  1. pip install selenium
复制代码
假如你的网络毗连较慢,大概默认的 pip 源不稳定,你可以使用国内的镜像源来加快下载。比方,使用清华大学的镜像源:
  1. pip install selenium
  2. -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码
在安装过程中,可能会遇到一些问题。比如,假如你使用的是 Python 2.x 版本,可能会出现兼容性问题,由于 Selenium 库对 Python 2.x 的支持逐渐减少。建议你升级到 Python 3.x 版本,以获得更好的兼容性和性能。另外,假如你的 pip 版本过旧,也可能导致安装失败。你可以通过以下命令来升级 pip:
  1. pip install --upgrade pip
复制代码
安装完成后,你可以在 Python 交互式环境中输入以下代码来验证是否安装成功:
  1. import selenium
  2. 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 浏览器为例,使用以下代码:
  1. from selenium import webdriver
  2. # 指定Chromedriver路径
  3. driver = webdriver.Chrome(executable_path='C:/chromedriver/chromedriver.exe')
复制代码
这样,我们就完成了 Selenium 库和浏览器驱动的安装与配置,可以开始使用 Selenium 进行网页操纵了。
三、根本操纵

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

使用 Selenium 打开网页非常简单,通过webdriver对象的get方法即可实现。以下是一个打开百度首页的示例代码:
  1. from selenium import webdriver
  2. # 创建Chrome浏览器驱动对象
  3. driver = webdriver.Chrome()
  4. # 打开百度首页
  5. driver.get('https://www.baidu.com')
  6. # 关闭浏览器
  7. 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()’)方法来逼迫制止页面加载,使步伐继续实行后续操纵 。示例代码如下:
  1. import time
  2. from selenium import webdriver
  3. from selenium.common.exceptions import TimeoutException
  4. # 创建Chrome浏览器驱动对象
  5. driver = webdriver.Chrome()
  6. # 设置页面加载超时时间为10秒
  7. driver.set_page_load_timeout(10)
  8. try:
  9.     # 打开网页
  10.     driver.get('https://www.example.com')
  11. except TimeoutException:
  12.     # 超时后执行Javascript停止页面加载
  13.     driver.execute_script('window.stop()')
  14. # 关闭浏览器
  15. driver.quit()
复制代码
page_load_strategy属性则用于设置页面加载计谋,它有三个可选值:normal(默认)、eager和none 。normal计谋表示等待整个页面加载完成,包括文件、css、js 等所有资源;eager计谋表示等待整个 DOM 树加载完成,即DOMContentLoaded变乱完成,放弃等待图片、样式、子框架的加载;none计谋表示等待 html 下载完成,哪怕还没开始解析。通过设置符合的加载计谋,可以收缩等待时间,提高实行速度。比方,设置加载计谋为eager的代码如下:
  1. import time
  2. from selenium import webdriver
  3. # 创建ChromeOptions对象
  4. options = webdriver.ChromeOptions()
  5. # 设置加载策略为eager
  6. options.page_load_strategy = 'eager'
  7. # 创建Chrome浏览器驱动对象,并传入options
  8. driver = webdriver.Chrome(options=options)
  9. # 打开网页
  10. driver.get('https://www.example.com')
  11. # 关闭浏览器
  12. driver.quit()
复制代码
3.2 操纵元素 - 点击

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


  • 通过 id 定位:假如元素具有唯一的id属性,可以使用find_element_by_id方法通过id值来定位元素。比方,百度首页搜索按钮的id为su,定位并点击该按钮的代码如下:
  1. from selenium import webdriver
  2. # 创建Chrome浏览器驱动对象
  3. driver = webdriver.Chrome()
  4. # 打开百度首页
  5. driver.get('https://www.baidu.com')
  6. # 通过id定位搜索按钮
  7. search_button = driver.find_element_by_id('su')
  8. # 点击搜索按钮
  9. search_button.click()
  10. # 关闭浏览器
  11. driver.quit()
复制代码


  • 通过 name 定位:使用find_element_by_name方法通过元素的name属性值来定位元素。比如,百度搜索框的name属性为wd,可以这样定位并输入搜索内容:
  1. from selenium import webdriver
  2. # 创建Chrome浏览器驱动对象
  3. driver = webdriver.Chrome()
  4. # 打开百度首页
  5. driver.get('https://www.baidu.com')
  6. # 通过name定位搜索框
  7. search_box = driver.find_element_by_name('wd')
  8. # 在搜索框中输入内容
  9. search_box.send_keys('Python爬虫')
  10. # 关闭浏览器
  11. driver.quit()
复制代码


  • 通过 class name 定位:使用find_element_by_class_name方法通过元素的class属性值来定位元素。比方,假设某个按钮的class为btn btn-primary,可以这样定位并点击:
  1. from selenium import webdriver
  2. # 创建Chrome浏览器驱动对象
  3. driver = webdriver.Chrome()
  4. # 打开网页
  5. driver.get('https://www.example.com')
  6. # 通过class name定位按钮
  7. button = driver.find_element_by_class_name('btn.btn-primary')
  8. # 点击按钮
  9. button.click()
  10. # 关闭浏览器
  11. driver.quit()
复制代码


  • 通过 xpath 定位:XPath 是一种用于在 XML 文档中查找信息的语言,也可以用于在 HTML 页面中定位元素。XPath 定位非常灵活,可以通过元素的属性、层级关系等多种方式进行定位。比方,要定位百度首页的搜索框,可以使用以下 XPath 表达式://*[@id=“kw”],代码如下:
  1. from selenium import webdriver
  2. # 创建Chrome浏览器驱动对象
  3. driver = webdriver.Chrome()
  4. # 打开百度首页
  5. driver.get('https://www.baidu.com')
  6. # 通过xpath定位搜索框
  7. search_box = driver.find_element_by_xpath('//*[@id="kw"]')
  8. # 在搜索框中输入内容
  9. search_box.send_keys('Python爬虫')
  10. # 关闭浏览器
  11. driver.quit()
复制代码


  • 通过 css selector 定位:CSS 选择器是一种用于选择 HTML 元素的模式,与 XPath 类似,也可以用于定位元素。比方,要定位百度首页的搜索按钮,可以使用以下 CSS 选择器:#su,代码如下:
  1. from selenium import webdriver
  2. # 创建Chrome浏览器驱动对象
  3. driver = webdriver.Chrome()
  4. # 打开百度首页
  5. driver.get('https://www.baidu.com')
  6. # 通过css selector定位搜索按钮
  7. search_button = driver.find_element_by_css_selector('#su')
  8. # 点击搜索按钮
  9. search_button.click()
  10. # 关闭浏览器
  11. driver.quit()
复制代码
3.3 操纵元素 - 输入

在网页中,填写表单是常见的操纵之一。使用 Selenium 在输入框中输入内容,同样需要先定位到输入框元素,然后使用元素的send_keys方法来输入文本。比方,在百度搜索框中输入 “Python 爬虫” 并提交搜索:
  1. from selenium import webdriver
  2. # 创建Chrome浏览器驱动对象
  3. driver = webdriver.Chrome()
  4. # 打开百度首页
  5. driver.get('https://www.baidu.com')
  6. # 定位搜索框
  7. search_box = driver.find_element_by_id('kw')
  8. # 输入搜索内容
  9. search_box.send_keys('Python爬虫')
  10. # 提交搜索,模拟按下回车键
  11. search_box.send_keys('\n')
  12. # 关闭浏览器
  13. driver.quit()
复制代码
在上述代码中,首先通过id定位到百度搜索框,然后使用send_keys方法输入搜索内容 “Python 爬虫”,末了再次使用send_keys方法并传入\n(换行符,模拟回车键)来提交搜索。
除了简单的输入文本,偶然还需要处理一些特别情况。比如,在输入之前可能需要清空输入框中的原有内容,可以使用元素的clear方法。比方:
  1. from selenium import webdriver
  2. # 创建Chrome浏览器驱动对象
  3. driver = webdriver.Chrome()
  4. # 打开网页
  5. driver.get('https://www.example.com')
  6. # 定位输入框
  7. input_box = driver.find_element_by_id('input-box')
  8. # 清空输入框
  9. input_box.clear()
  10. # 输入新内容
  11. input_box.send_keys('新的文本内容')
  12. # 关闭浏览器
  13. driver.quit()
复制代码
这样,我们就完成了使用 Selenium 进行打开网页、操纵元素(点击、输入)的根本操纵。通过这些操纵,我们可以模拟用户在浏览器中的举动,实现对网页的自动化交互。
四、页面等待计谋

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

隐式等待是一种全局等待计谋,它为 WebDriver 设置一个全局的超时时间。在这个时间范围内,当 Selenium 查找元素时,假如元素没有立刻出现,WebDriver 会定期轮询检查该元素是否存在 ,一旦找到元素,就会立刻继续实行后续代码。假如在超时时间内仍未找到元素,则会抛出NoSuchElementException异常。
通过implicitly_wait方法来设置隐式等待时间,单元为秒。以下是设置隐式等待时间为 10 秒的代码示例:
  1. from selenium import webdriver
  2. # 创建Chrome浏览器驱动对象
  3. driver = webdriver.Chrome()
  4. # 设置隐式等待时间为10秒
  5. driver.implicitly_wait(10)
  6. # 打开网页
  7. driver.get('https://www.example.com')
  8. # 查找元素
  9. element = driver.find_element_by_id('some_element')
  10. # 关闭浏览器
  11. 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(等待元素可见并可点击)等。
以下是一个使用显式等待等待按钮可点击并点击的代码示例:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. # 创建Chrome浏览器驱动对象
  6. driver = webdriver.Chrome()
  7. # 打开网页
  8. driver.get('https://www.example.com')
  9. # 设置显式等待条件:等待某按钮元素可点击,最长等待10秒
  10. wait = WebDriverWait(driver, 10)
  11. element = wait.until(EC.element_to_be_clickable((By.ID,'some_button')))
  12. # 点击按钮
  13. element.click()
  14. # 关闭浏览器
  15. 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 爬虫领域的技术程度。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表