当前位置:首页>python>Python使用Selenium实现浏览器自动化

Python使用Selenium实现浏览器自动化

  • 2026-09-03 21:46:08
Python使用Selenium实现浏览器自动化

准备工作

为什么要模拟浏览器?

对爬虫稍有了解的同学可能会有疑问:明明可以用 requests 库直接获取网页源代码,为什么还要模拟浏览器呢?

现实很骨感:

  1. 反爬虫机制
     - 你有爬虫,别人有反爬虫。网站会检测请求头,非浏览器请求直接拒绝
  2. JavaScript 渲染
     - 现代网站很多内容是通过 JS 动态加载的,requests 拿到的只是空壳
  3. 验证码拦截
     - 滑块验证、点击验证、短信验证...这些用代码很难绕过
  4. 登录态维持
     - Cookie、Session、Token 等身份验证机制复杂

Selenium 的优势:

  • 真实打开浏览器,网站识别为正常用户
  • 自动执行 JavaScript,拿到完整渲染后的页面
  • 可以模拟人工操作:点击、输入、滑动
  • 能处理复杂的登录流程

Selenium 介绍

Selenium 可以说是网络爬虫中的王者级工具了:

  • 最初用途
    :自动化测试工具,测试网页功能是否正常
  • 爬虫领域
    :控制真实浏览器,绕过大部分反爬机制
  • 更多玩法
    :
    • 自动登录各类网站
    • 定时抢购商品(茅台、火车票、演唱会门票)
    • 自动填写表单、提交数据
    • 批量上传/下载文件
    • 自动化运营(自动发帖、点赞、评论)

一句话总结:Selenium 就是一个用代码控制的"机器人浏览器"。


安装工作

要在 Windows 中使用 Selenium,需要准备三样东西:

组件
作用
本教程使用
Selenium 库
Python 控制浏览器的接口
最新版
浏览器
被控制的程序
Chrome
浏览器驱动
翻译官(把 Python 指令转成浏览器能懂的语言)
chromedriver

1. 安装 Selenium 库

打开 PyCharm 底部的终端(Terminal),输入:

pip install selenium

安装完成后,在代码中这样导入:

from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.service import Service

2. 安装 Chrome 浏览器

直接访问官网下载安装:Google Chrome 网络浏览器

安装完成后,在 Chrome 地址栏输入 chrome://version/ 查看版本号:

记住版本号的前三位,比如 98.0.4758,等下要用。

3. 安装 ChromeDriver 驱动

为什么需要驱动?

想象 Selenium 是说英语的,Chrome 是说法语的,它们之间需要一个翻译——这就是 ChromeDriver。

下载步骤:

  1. 打开下载地址:http://chromedriver.storage.googleapis.com/index.html
  2. 找到与你的 Chrome 版本对应的文件夹
  3. 点击进入,下载 Windows 版本(chromedriver_win32.zip)
  4. 解压后得到 chromedriver.exe
  5. 把它放到一个固定位置,比如 D:\driver\chromedriver.exe

版本对应很重要! Chrome 升级后,驱动可能也要重新下载对应版本。


基本用法

初始化浏览器对象

准备工作完成,来写第一行 Selenium 代码:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Service# 指定驱动路径s = Service(r'D:\driver\chromedriver.exe')# 初始化浏览器browser = webdriver.Chrome(service=s)# 等待2秒看看效果time.sleep(2)# 关闭浏览器browser.close()

运行后,你会看到 Chrome 窗口弹出来,过2秒自动关闭。这就是 Selenium 在控制浏览器!


无头模式(Headless)

上面的代码会弹出浏览器窗口,有时候我们不需要看到界面(比如在服务器上运行),可以用无头模式:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Services = Service(r'D:\driver\chromedriver.exe')# 创建配置对象option = webdriver.ChromeOptions()option.add_argument("headless")  # 开启无头模式# 初始化无头浏览器browser = webdriver.Chrome(service=s, options=option)# 访问百度browser.get(r'https://www.baidu.com/')# 截图看看效果browser.get_screenshot_as_file('截图.png')print("截图已保存")browser.close()

运行后没有窗口弹出,但会生成一张 截图.png:

无头模式的适用场景:

  • 服务器环境(没有图形界面)
  • 提高运行速度(不用渲染界面)
  • 后台自动化任务

访问页面

使用 get() 方法访问指定网址:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Services = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)# 访问百度首页browser.get(r'https://www.baidu.com/')print("已打开百度")time.sleep(2)browser.close()

设置浏览器大小

可以设置窗口分辨率,或者最大化:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Services = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')time.sleep(1)# 设置窗口大小为 500x500browser.set_window_size(500, 500)print("窗口已调整为 500x500")time.sleep(1)# 设置窗口大小为 1000x800browser.set_window_size(1000, 800)print("窗口已调整为 1000x800")time.sleep(1)# 最大化窗口browser.maximize_window()print("窗口已最大化")time.sleep(1)browser.close()

为什么要设置窗口大小?

  • 有些网站会检测窗口大小判断是否为机器人
  • 响应式网页在不同分辨率下显示不同内容
  • 截图时需要固定尺寸

刷新页面

相当于按 F5 刷新:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Services = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')time.sleep(2)# 刷新页面browser.refresh()print("页面已刷新")time.sleep(2)browser.close()

前进后退

模拟浏览器的后退和前进按钮:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Services = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)# 访问百度browser.get(r'https://www.baidu.com/')print("当前页面:百度")time.sleep(2)# 访问淘宝browser.get(r'https://www.taobao.com')print("当前页面:淘宝")time.sleep(2)# 后退到百度browser.back()print("后退到:百度")time.sleep(2)# 前进到淘宝browser.forward()print("前进到:淘宝")time.sleep(2)browser.close()

获取页面基础属性

可以获取网页的各种基本信息:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Services = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')time.sleep(2)# 获取网页标题print(f"网页标题: {browser.title}")# 获取当前网址print(f"当前网址: {browser.current_url}")# 获取浏览器名称print(f"浏览器: {browser.name}")# 获取页面源码(可以用来解析数据)html = browser.page_sourceprint(f"页面源码长度: {len(html)} 字符")browser.close()

页面源码怎么用?

  • 用正则表达式提取数据
  • 用 BeautifulSoup 解析 HTML
  • 用 XPath 定位元素

定位元素

网页自动化的核心就是找到元素,然后操作它。Selenium 提供了 8 种定位方式。

以百度搜索框为例,它的 HTML 结构是:

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

首先导入 By 类:

from selenium.webdriver.common.by import By

1. id 定位

通过元素的 id 属性定位,最常用也最精准:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bys = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')time.sleep(2)# 通过 id="kw" 定位搜索框,输入"python"browser.find_element(By.ID, 'kw').send_keys('python')print("已输入搜索词:python")time.sleep(2)browser.close()

id 定位的特点:

  • 一个页面中 id 应该是唯一的
  • 定位速度最快
  • 首选的定位方式

2. name 定位

通过 name 属性定位:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bys = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')time.sleep(2)# 通过 name="wd" 定位搜索框browser.find_element(By.NAME, 'wd').send_keys('python')print("已使用 name 定位输入")time.sleep(2)browser.close()

3. class 定位

通过 class 属性定位:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bys = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')time.sleep(2)# 通过 class="s_ipt" 定位搜索框browser.find_element(By.CLASS_NAME, 's_ipt').send_keys('python')print("已使用 class 定位输入")time.sleep(2)browser.close()

注意: 一个页面中可能有多个元素使用相同的 class,这时候只会找到第一个。


4. tag 定位

通过 HTML 标签名定位:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bys = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')time.sleep(2)# 通过 tag "input" 定位# 注意:页面可能有多个 input,这只会找到第一个browser.find_element(By.TAG_NAME, 'input').send_keys('python')time.sleep(2)browser.close()

tag 定位的问题:

  • 一个页面通常有大量相同的标签
  • 很难精准定位到目标元素
  • 一般配合其他条件使用

5. link 定位

通过链接的完整文本定位:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bys = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')time.sleep(2)# 点击文本为"新闻"的链接browser.find_element(By.LINK_TEXT, '新闻').click()print("已点击新闻链接")time.sleep(2)browser.quit()  # 使用 quit() 关闭所有页面

6. partial link 定位

通过链接的部分文本定位(模糊匹配):

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bys = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')time.sleep(2)# 链接文本包含"闻"字就匹配(比如"新闻")browser.find_element(By.PARTIAL_LINK_TEXT, '闻').click()print("已使用模糊匹配点击")time.sleep(2)browser.quit()

适用场景:

  • 链接文本很长,不想写全
  • 链接文本有动态变化的部分

7. XPath 定位

XPath 是一种在 XML/HTML 文档中定位元素的语言,功能非常强大:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bys = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')time.sleep(2)# XPath 定位://input[@id="kw"]# 意思是:找到 id 属性等于 kw 的 input 元素browser.find_element(By.XPATH, '//*[@id="kw"]').send_keys('python')print("已使用 XPath 定位输入")time.sleep(2)browser.quit()

常用 XPath 语法:

XPath 表达式
含义
//div
找到所有 div 元素
//input[@id="kw"]
找到 id=kw 的 input
//div[@class="item"]
找到 class=item 的 div
//div[contains(@class, "item")]
class 包含 item 的 div
//div[text()="确定"]
文本为"确定"的 div
//div[@id="a"]//span
id=a 的 div 下的所有 span

8. CSS Selector 定位

CSS 选择器定位,语法简洁、执行速度快:

import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bys = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')time.sleep(2)# CSS 选择器:#kw# # 表示 id,所以 #kw 就是 id=kw 的元素browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python')print("已使用 CSS 选择器定位输入")time.sleep(2)browser.quit()

常用 CSS 选择器:

CSS 选择器
含义
#id
id 选择器,如 #kw
.class
class 选择器,如 .s_ipt
tag
标签选择器,如 input
tag#id
组合选择器,如 input#kw
tag.class
组合选择器,如 input.s_ipt
[attr=value]
属性选择器,如 [name="wd"]
div > span
子元素选择器
div span
后代元素选择器

9. 定位多个元素

如果页面上有多个相同条件的元素,可以用 find_elements(注意多了个 s):

from selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bys = Service(r'D:\driver\chromedriver.exe')browser = webdriver.Chrome(service=s)browser.get(r'https://www.baidu.com/')# 找到所有 input 元素inputs = browser.find_elements(By.TAG_NAME, 'input')print(f"页面共有 {len(inputs)} 个 input 元素")# 遍历每个元素for i, input_elem in enumerate(inputs):    print(f"第{i+1}个 input")browser.quit()

返回的是列表,可以遍历处理每个元素。


文档总结

一、核心知识点回顾

1. Selenium 是什么?

Selenium 是一个浏览器自动化工具,就像一个用代码控制的"机器人":

  • 能做什么
    :打开网页、点击按钮、输入文字、截图、获取数据
  • 为什么用它
    :绕过反爬虫、执行 JavaScript、模拟真实用户操作
  • 典型场景
    :自动登录、数据抓取、自动化测试、定时抢购

工作流程图:

Python代码 → Selenium库 → ChromeDriver → Chrome浏览器 → 目标网站

2. 环境搭建三步走

步骤
操作
注意事项
① 装库
pip install selenium
使用 PyCharm 终端安装
② 装浏览器
下载安装 Chrome
记住版本号
③ 装驱动
下载对应版本的 chromedriver
版本必须匹配!

版本匹配检查:

  • Chrome 地址栏输入 chrome://version/ 查看版本
  • 驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
  • 前三位版本号要对上(如 98.0.4758)

3. 浏览器基本操作

from selenium import webdriverfrom selenium.webdriver.chrome.service import Service# 初始化s = Service(r'驱动路径')browser = webdriver.Chrome(service=s)# 常用操作browser.get('网址')              # 访问页面browser.refresh()               # 刷新browser.back()                  # 后退browser.forward()               # 前进browser.set_window_size(宽, 高)  # 设置大小browser.maximize_window()       # 最大化# 获取信息browser.title           # 页面标题browser.current_url     # 当前网址browser.page_source     # 页面源码# 关闭browser.close()         # 关闭当前窗口browser.quit()          # 关闭所有窗口

4. 元素定位八法

定位方式
语法
适用场景
id
By.ID, 'kw'
首选,最精准
name
By.NAME, 'wd'
表单元素常用
class
By.CLASS_NAME, 's_ipt'
样式类名
tag
By.TAG_NAME, 'input'
标签名
link
By.LINK_TEXT, '新闻'
完整链接文本
partial link
By.PARTIAL_LINK_TEXT, '闻'
部分链接文本
XPath
By.XPATH, '//*[@id="kw"]'
万能,功能最强
CSS
By.CSS_SELECTOR, '#kw'
简洁,速度快

选择建议:

  1. 有 id 用 id(最快最准)
  2. 没 id 用 name 或 class
  3. 复杂情况用 XPath 或 CSS
  4. 避免用 tag(太泛)

5. 元素操作方法

找到元素后,可以进行的操作:

element = browser.find_element(By.ID, 'kw')# 输入文字element.send_keys('要输入的内容')# 点击元素element.click()# 清空输入框element.clear()# 获取元素文本text = element.text# 获取属性值value = element.get_attribute('value')

二、常见问题与解决

问题1:报错 SessionNotCreatedException

原因:Chrome 和 ChromeDriver 版本不匹配解决:重新下载对应版本的驱动

问题2:报错 NoSuchElementException

原因:元素还没加载出来就去找了解决:加 time.sleep() 等待,或用显式等待

问题3:找不到元素,但页面上明明有

原因:元素在 iframe 里,或是新窗口解决:切换 iframe 或切换窗口句柄

问题4:输入中文出现乱码

解决:send_keys() 直接支持中文,如乱码检查文件编码为 UTF-8

三、学习建议

  1. 从模仿开始
     —— 先把文档里的代码跑通,再修改参数看效果
  2. 多用开发者工具
     —— F12 检查元素,练习定位方法
  3. 注意等待
     —— 网页加载需要时间,适当加 sleep 或学习显式等待
  4. 异常处理
     —— 网络不稳定,要加 try-except 处理异常
  5. 循序渐进
     —— 先掌握基础操作,再学复杂功能

最新文章

随机文章