📜  使用Python控制 Web 浏览器(1)

📅  最后修改于: 2023-12-03 15:36:36.685000             🧑  作者: Mango

使用Python控制 Web 浏览器

在开发 Web 自动化测试、爬虫、数据收集等应用时,我们通常需要通过自动化控制 Web 浏览器(比如 Chrome、Firefox、PhantomJS 等)来模拟人类用户的操作,进行页面的自动化测试、信息的自动收集等;而 Python 是一门功能强大的高级编程语言,可以通过各种库和工具来实现对 Web 浏览器的自动化控制。

Python中常用的Web浏览器自动化控制库

Python 中有许多可以用来控制 Web 浏览器的库和工具,其中最为常用的包括:

  • Selenium:Selenium 是一个自动化测试工具,对浏览器的支持非常全面,可以控制多种浏览器,包括 Firefox、Chrome、Edge、Safari、Opera、PhantomJS 等,支持多种操作系统平台,包括 Windows、Mac、Linux,另外,Selenium 还提供了丰富的 API 接口,方便我们进行各种操作和自定义设置。
  • MechanicalSoup:MechanicalSoup 是一个基于 BeautifulSoup 和 requests 的爬虫框架,主要用于处理 Web 表单,支持浏览器自动化,可以自行封装浏览器基本操作。
  • Splinter:Splinter 是一个类似于 Selenium 的 Web 浏览器自动化控制库,也可以支持多种浏览器(Firefox、Chrome、Edge、Safari、Opera 等),提供了丰富的 API 接口。
  • PyAutoGUI:PyAutoGUI 是一个基于图像识别的自动化工具,可以模拟用户的鼠标和键盘操作,对浏览器的控制能力较弱,但可以很方便地模拟鼠标、键盘等操作,尤其适用于一些结构简单、交互少的 Web 页面的自动化操作。

在这些库中,Selenium 和 Splinter 是最为常用和强大的,均提供了针对 Web 应用和浏览器的完整控制,而且可以轻易地实现自动化测试、数据采集和网站爬虫等操作。

使用Selenium控制Web浏览器
安装和配置

在使用 Selenium 时,首先需要安装 Selenium 库:

!pip install selenium

同时,还需要下载并安装浏览器驱动:

  • Firefox:https://github.com/mozilla/geckodriver/releases
  • Chrome:http://chromedriver.storage.googleapis.com/index.html
  • Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
  • Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

选择对应的浏览器驱动下载并解压,然后将其所在路径添加到系统 Path 环境变量中,例如:

import os
os.environ["PATH"] += os.pathsep + "D:/Downloads/webdriver"
控制浏览器基本操作

启动和关闭浏览器

启动和关闭浏览器非常简单,可以通过以下命令完成:

from selenium import webdriver

# 启动 Chrome 浏览器
browser = webdriver.Chrome()

# 启动 Firefox 浏览器
browser = webdriver.Firefox()

# 关闭浏览器
browser.quit()

访问网页

启动浏览器后,我们通常需要访问指定的网页:

from selenium import webdriver

browser = webdriver.Chrome()
browser.get("https://www.baidu.com")

这里我们以百度首页为例。

查找元素

Selenium 提供了一系列方法来查找 Web 页面中的元素,包括 ID、tag name、class name、name、link text、partial link text、XPath 和 CSS selector 等等。

这里以百度首页的搜索输入框为例:

<input type="text" class="s_ipt" name="wd" maxlength="255" autocomplete="off">

我们可以通过以下代码完成查找:

from selenium.webdriver.common.by import By

# 通过 ID 查找元素
el = browser.find_element(by=By.ID, value="kw")
# 通过 name 查找元素
el = browser.find_element(by=By.NAME, value="wd")
# 通过 class name 查找元素
el = browser.find_element(by=By.CLASS_NAME, value="s_ipt")
# 通过 tag name 查找元素
el = browser.find_element(by=By.TAG_NAME, value="input")
# 通过 link text 查找元素
el = browser.find_element(by=By.LINK_TEXT, value="hao123")
# 通过部分 link text 查找元素
el = browser.find_element(by=By.PARTIAL_LINK_TEXT, value="新闻")
# 通过 XPath 查找元素
el = browser.find_element(by=By.XPATH, value="//input[@name='wd']")
# 通过 CSS selector 查找元素
el = browser.find_element(by=By.CSS_SELECTOR, value="input.s_ipt[name='wd']")

操作元素

当找到元素后,我们可以对其进行各种操作:

# 输入文字
el.send_keys("Python")
# 点击元素
el.click()
# 清空输入框
el.clear()

等待元素加载

在实际应用中,可能需要等待 Web 页面中的某个元素加载结束后再进行后续操作,这时可以使用 Selenium 的等待工具,包括隐式等待和显式等待。

隐式等待是指在一个固定时间内页面中的所有元素都加载后再执行后续操作,通过设置 implicit_wait 属性即可实现:

browser.implicitly_wait(10)

这里的 10 表示等待的最长时间为 10 秒。

显式等待是指在页面中等待指定元素的加载完成后再执行后续操作,可以通过 WebDriverWait 类以及 expected_conditions 模块中的条件实现:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

el = WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.ID, "kw"))
)

这里表示等待 ID 为 kw 的元素加载完成后再进行后续操作,最长等待时间为 10 秒。

示例程序

下面是一个使用 Selenium 控制 Chrome 浏览器,访问百度并进行搜索操作的示例程序:

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

browser = webdriver.Chrome()
browser.get("https://www.baidu.com")

el = WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.ID, "kw"))
)
el.send_keys("Python")
el.submit()

browser.quit()
参考资料