当前位置:首页 > 技术 > 正文内容

使用Selenium进行网页自动化操作

访客 技术 2026年6月9日 1

环境准备与浏览器初始化

安装Selenium库:

pip3 install selenium

创建浏览器实例,支持多种主流浏览器:

from selenium import webdriver

driver = webdriver.Chrome()
# driver = webdriver.Firefox()
# driver = webdriver.Edge()
# driver = webdriver.PhantomJS()
# driver = webdriver.Safari()

页面加载与内容获取

打开目标网址并获取页面源码:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.taobao.com')
print(driver.page_source)
driver.close()

元素定位方法

通过不同方式查找单个或多个元素:

  • 单个元素:使用 find_element_by_*find_element(By.XX, 'value')
  • 多个元素:使用 find_elements_by_*find_elements(By.XX, 'value')

示例:通过ID、CSS选择器、XPath定位输入框:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://www.taobao.com')

# 方法一:传统方式
input_elem1 = driver.find_element_by_id('q')
input_elem2 = driver.find_element_by_css_selector('#q')
input_elem3 = driver.find_element_by_xpath('//*[@id="q"]')

# 方法二:推荐方式(更清晰且兼容性好)
input_elem = driver.find_element(By.ID, 'q')
print(input_elem)

多元素查找与处理

获取一组相同类名的列表项:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://www.taobao.com')

items = driver.find_elements(By.CSS_SELECTOR, '.service-bd li')
for item in items:
    print(item.text)

交互操作与行为模拟

在输入框中输入内容并点击搜索按钮:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('https://www.taobao.com')

search_input = driver.find_element(By.ID, 'q')
search_input.send_keys('iPhone')
time.sleep(1)
search_input.clear()
search_input.send_keys('iPad')

submit_button = driver.find_element(By.CLASS_NAME, 'btn-search')
submit_button.click()

拖拽动作实现

使用ActionChains完成元素拖拽:

from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
driver.get(url)

# 切换到iframe子页面
driver.switch_to.frame('iframeResult')

source = driver.find_element(By.CSS_SELECTOR, '#draggable')
target = driver.find_element(By.CSS_SELECTOR, '#droppable')

actions = ActionChains(driver)
actions.drag_and_drop(source, target).perform()

执行JavaScript脚本

滚动页面到底部并弹出提示:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.zhihu.com/explore')

driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
driver.execute_script('alert("已到达底部")')

获取元素属性与信息

提取元素的类名、文本内容、位置、尺寸等:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.zhihu.com/explore')

logo = driver.find_element(By.ID, 'zh-top-link-logo')
print(logo.get_attribute('class'))  # 获取类名
print(logo.text)                    # 获取文本
print(logo.id)                      # 元素唯一标识
print(logo.location)                # 坐标位置
print(logo.tag_name)                # 标签名
print(logo.size)                    # 宽高尺寸

处理嵌套框架(iframe)

切换至iframe并访问内部元素:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Chrome()
driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')

driver.switch_to.frame('iframeResult')
try:
    logo = driver.find_element(By.CLASS_NAME, 'logo')
except NoSuchElementException:
    print('未找到logo元素')

# 返回主文档
driver.switch_to.parent_frame()
main_logo = driver.find_element(By.CLASS_NAME, 'logo')
print(main_logo.text)

等待机制设置

隐式等待:全局等待,直到元素出现为止:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)  # 最长等待10秒
driver.get('https://www.zhihu.com/explore')
element = driver.find_element(By.CLASS_NAME, 'zu-top-add-question')

显式等待:精准控制特定条件满足后继续执行:

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

driver = webdriver.Chrome()
driver.get('https://www.taobao.com/')

wait = WebDriverWait(driver, 10)
search_input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
submit_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))

导航控制与历史管理

前进与后退页面:

import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.get('https://www.taobao.com')
driver.get('https://www.python.org')

driver.back()      # 后退
time.sleep(1)
driver.forward()   # 前进
driver.close()

Cookie管理

读取、添加和删除Cookies:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.zhihu.com/explore')

print(driver.get_cookies())  # 查看当前所有Cookie

driver.add_cookie({'name': 'test_cookie', 'domain': 'www.zhihu.com', 'value': 'test_value'})
print(driver.get_cookies())

driver.delete_all_cookies()
print(driver.get_cookies())

窗口句柄管理

打开新标签页并切换操作:

import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 新开一个标签页
driver.execute_script('window.open()')

print(driver.window_handles)  # 打印所有窗口句柄

# 切换到第二个标签页
driver.switch_to.window(driver.window_handles[1])
driver.get('https://www.taobao.com')

# 回到第一个标签页
driver.switch_to.window(driver.window_handles[0])
driver.get('https://python.org')

异常捕获与健壮性处理

避免因元素不存在导致程序崩溃:

from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException

driver = webdriver.Chrome()

try:
    driver.get('https://www.baidu.com')
except TimeoutException:
    print('页面加载超时')

try:
    element = driver.find_element(By.ID, 'nonexistent_id')
except NoSuchElementException:
    print('指定元素未找到')

finally:
    driver.quit()

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。