准备工作
为什么要模拟浏览器?
对爬虫稍有了解的同学可能会有疑问:明明可以用 requests 库直接获取网页源代码,为什么还要模拟浏览器呢?
现实很骨感:
- 反爬虫机制 - 你有爬虫,别人有反爬虫。网站会检测请求头,非浏览器请求直接拒绝
- JavaScript 渲染 - 现代网站很多内容是通过 JS 动态加载的,requests 拿到的只是空壳
- 验证码拦截 - 滑块验证、点击验证、短信验证...这些用代码很难绕过
- 登录态维持 - Cookie、Session、Token 等身份验证机制复杂
Selenium 的优势:
- 自动执行 JavaScript,拿到完整渲染后的页面
Selenium 介绍
Selenium 可以说是网络爬虫中的王者级工具了:
一句话总结:Selenium 就是一个用代码控制的"机器人浏览器"。
安装工作
要在 Windows 中使用 Selenium,需要准备三样东西:
| | |
|---|
| | |
| | |
| 翻译官(把 Python 指令转成浏览器能懂的语言) | |
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。
下载步骤:
- 打开下载地址:http://chromedriver.storage.googleapis.com/index.html
- 找到与你的 Chrome 版本对应的文件夹

- 点击进入,下载 Windows 版本(
chromedriver_win32.zip) - 把它放到一个固定位置,比如
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()
页面源码怎么用?
定位元素
网页自动化的核心就是找到元素,然后操作它。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 定位的特点:
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 语法:
| |
|---|
//div | |
//input[@id="kw"] | |
//div[@class="item"] | |
//div[contains(@class, "item")] | |
//div[text()="确定"] | |
//div[@id="a"]//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 选择器:
| |
|---|
#id | |
.class | |
tag | |
tag#id | |
tag.class | |
[attr=value] | |
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. 环境搭建三步走
版本匹配检查:
- Chrome 地址栏输入
chrome://version/ 查看版本 - 驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
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. 元素定位八法
| | |
|---|
| By.ID, 'kw' | |
| By.NAME, 'wd' | |
| By.CLASS_NAME, 's_ipt' | |
| By.TAG_NAME, 'input' | |
| By.LINK_TEXT, '新闻' | |
| By.PARTIAL_LINK_TEXT, '闻' | |
| By.XPATH, '//*[@id="kw"]' | |
| By.CSS_SELECTOR, '#kw' | |
选择建议:
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
三、学习建议
- 从模仿开始
- 多用开发者工具
- 注意等待 —— 网页加载需要时间,适当加 sleep 或学习显式等待
- 异常处理 —— 网络不稳定,要加 try-except 处理异常
- 循序渐进