Python-Selenium的基本使用
本文简介:本文主要讲解 Python 第三方库 Selenium的动态技术,可用于爬取动态网页的数据。使用的是 Google 浏览器,若不能下载 Google 浏览器及驱动的可替换为其它浏览器。本文使用有一定计算机基础和 Python 基础的学习人士。
参考链接:
- 视频参考:https://www.bilibili.com/video/BV1Y9UPYAEqN/
- 理论网站参考:https://www.runoob.com/python3/python-selenium.html
第一章 Selenium 概述
web 自动化开源库,支持多种浏览器,如 Chrome、Firefox、Edge、Safari 等。
跨平台、兼容性高。
通过浏览器驱动控制浏览器,通过元素定位法模拟人工交互以实现 web 自动化。
Selenium 官方技术文档:https://www.selenium.dev/
第二章 Selenium 环境安装
2.1 安装浏览器
-
下载浏览器,此处以 Chrome 浏览器为例。浏览器下载地址为https://www.google.cn/chrome/
-
安装浏览器。
-
安装浏览器对应的驱动,此处安装的是 chromedriver 驱动,谷歌浏览器驱动下载地址为https://googlechromelabs.github.io/chrome-for-testing/
注意:驱动版本号要和浏览器版本号对应(至少大版本要对应符合),否则失效
-
关闭浏览器自动更新,防止更新导致驱动失效。
在开始内搜索 services.msc 找到 Google 更新组件全部禁用。
2.2 安装第三方库 Selenium
在 pycharm 中的终端通过以下命令安装第三方库 selenium:
# https://pypi.tuna.tsinghua.edu.cn/simple 此网站是清华镜像源,可以加快第三方库的安装
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
第三章 Selenium 的使用
本节操作需要完成前面两章的操作才能进行。
3.1 操作浏览器
-
创建浏览器、设置、打开
- 禁用沙盒模式,增加兼容性。若出现闪退情况可以添加此属性设置:add_argument(‘–no-sandbox’)
- 浏览器保持打开状态,浏览器在默认情况下是代码执行完自动关闭:add_experimental_option(‘detach’,True)
# 用于操作浏览器 from selenium import webdriver # 用于设置 Google 浏览器参数 from selenium.webdriver.chrome.options import Options # 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动 from selenium.webdriver.chrome.service import Service # 实例化参数类 option=Options() option.add_argument('--no-sandbox') option.add_experimental_option('detach',True) # 创建并启动浏览器,将设置的参数绑定到浏览器上 chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option) -
打开网页、关闭网页、浏览器
通过创建的浏览器对象打开网页、关闭网页、浏览器,对应的方法是get()、close()、quit()。
# 用于操作浏览器 from selenium import webdriver # 用于设置 Google 浏览器参数 from selenium.webdriver.chrome.options import Options # 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动 from selenium.webdriver.chrome.service import Service import time def driver(): # 实例化参数类 option=Options() option.add_argument('--no-sandbox') option.add_experimental_option('detach',True) # 创建并启动浏览器,将设置的参数绑定到浏览器上 chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option) return chrome_driver chrome_driver=driver() # 打开网页 chrome_driver.get("https://www.taobao.com/") time.sleep(3) # 关闭当前标签页 chrome_driver.close() # 退出浏览器 chrome_driver.quit() -
浏览器最大化、最小化
通过创建的浏览器对象最大化、最小化浏览器,对应的方法是maximize_window()、minimize_window()。
# 用于操作浏览器 from selenium import webdriver # 用于设置 Google 浏览器参数 from selenium.webdriver.chrome.options import Options # 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动 from selenium.webdriver.chrome.service import Service import time def driver(): # 实例化参数类 option=Options() option.add_argument('--no-sandbox') option.add_experimental_option('detach',True) # 创建并启动浏览器,将设置的参数绑定到浏览器上 chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option) return chrome_driver chrome_driver=driver() # 打开网页 chrome_driver.get("https://www.taobao.com/") time.sleep(3) chrome_driver.maximize_window() time.sleep(2) chrome_driver.minimize_window() time.sleep(2) chrome_driver.maximize_window() -
浏览器打开位置、尺寸
设置浏览器打开位置:set_window_position(x,y),此设置是浏览器对象的方法,通过给定x(距离左边的距离)、y(距离顶部的距离)的值设置浏览器在何处打开。
设置浏览器打开的尺寸:set_window_size(width,height),此设置是浏览器对象的方法,通过给定的width(浏览器的宽)、height(浏览器的高)的值设置浏览器打开的尺寸。
注意:数字的单位是像素
# 用于操作浏览器 from selenium import webdriver # 用于设置 Google 浏览器参数 from selenium.webdriver.chrome.options import Options # 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动 from selenium.webdriver.chrome.service import Service import time def driver(): # 实例化参数类 option=Options() option.add_argument('--no-sandbox') option.add_experimental_option('detach',True) # 创建并启动浏览器,将设置的参数绑定到浏览器上 chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option) return chrome_driver chrome_driver=driver() # 打开网页 chrome_driver.get("https://www.taobao.com/") #浏览器打开位置 chrome_driver.set_window_position(0,0) #浏览器打开尺寸 chrome_driver.set_window_size(600,600) -
浏览器截图、网页刷新
浏览器截图:get_screenshot_as_file(‘绝对路径或相对路径+图片名’)通过创建的浏览器对象调用。
刷新当前网页:refresh(),通过创建的浏览器对象调用。
# 用于操作浏览器 from selenium import webdriver # 用于设置 Google 浏览器参数 from selenium.webdriver.chrome.options import Options # 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动 from selenium.webdriver.chrome.service import Service import time def driver(): # 实例化参数类 option=Options() option.add_argument('--no-sandbox') option.add_experimental_option('detach',True) # 创建并启动浏览器,将设置的参数绑定到浏览器上 chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option) return chrome_driver chrome_driver=driver() # 打开网页 chrome_driver.get("https://www.taobao.com/") #浏览器截图 chrome_driver.get_screenshot_as_file('1.png') time.sleep(2) #刷新当前网页 chrome_driver.refresh()
3.2 操作网页元素
3.2.1 元素定位
-
定位1个元素
通过创建的浏览器对象调用 find_element(元素定位方式,value),找到的话返回结果,找不到的话报错。
-
定位多个元素
浏览器对象调用 find_elements(元素定位方式,value),找到的话返回列表形式的结果,找不到的话返回空列表。
-
浏览器查找多个元素
在浏览器打开开发者工具,在控制台输入
document.getElementById('元素值')即可查找到你想要的元素。
# 用于操作浏览器
from selenium import webdriver
# 用于设置 Google 浏览器参数
from selenium.webdriver.chrome.options import Options
# 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动
from selenium.webdriver.chrome.service import Service
#用于管理元素定位的库
from selenium.webdriver.common.by import By
import time
def driver():
# 实例化参数类
option=Options()
option.add_argument('--no-sandbox')
option.add_experimental_option('detach',True)
# 创建并启动浏览器,将设置的参数绑定到浏览器上
chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option)
return chrome_driver
chrome_driver=driver()
# 打开网页
chrome_driver.get("https://www.baidu.com/")
#定位1个元素
a2=chrome_driver.find_element(By.ID,'kw')
print(a2)
#定位多个元素
a3=chrome_driver.find_elements(By.ID,'kw')
print(a3)
3.2.2 元素交互操作
元素交互操作就是对查找到的元素进行操作。如元素输入、元素清空、元素点击等,其对应的方法是send_keys(‘要输入的文本’)、clear()、click()。
# 用于操作浏览器
from selenium import webdriver
# 用于设置 Google 浏览器参数
from selenium.webdriver.chrome.options import Options
# 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动
from selenium.webdriver.chrome.service import Service
#用于管理元素定位的库
from selenium.webdriver.common.by import By
import time
def driver():
# 实例化参数类
option=Options()
option.add_argument('--no-sandbox')
option.add_experimental_option('detach',True)
# 创建并启动浏览器,将设置的参数绑定到浏览器上
chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option)
return chrome_driver
chrome_driver=driver()
# 打开网页
chrome_driver.get("https://www.baidu.com/")
#定位1个元素
a2=chrome_driver.find_element(By.ID,'kw')
#元素输入
a2.send_keys('dafait')
time.sleep(2)
#元素清空
a2.clear()
time.sleep(2)
#元素输入
a2.send_keys('dafait')
time.sleep(2)
#元素点击
chrome_driver.find_element(By.ID,'su').click()
3.2.3 元素定位 ID
通过 ID 定位元素的特点:
- 通过 ID 定位元素,一般比较准确。
- 并不是所有的网页或者元素都要 ID 值。
3.2.4 元素定位 NAME
通过 NAME 定位元素的特点:
- 通过 NAME 定位元素,一般比较准确。
- 并不是所有的网页或者元素都要 NAME 值。
# 用于操作浏览器
from selenium import webdriver
# 用于设置 Google 浏览器参数
from selenium.webdriver.chrome.options import Options
# 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动
from selenium.webdriver.chrome.service import Service
#用于管理元素定位的库
from selenium.webdriver.common.by import By
import time
def driver():
# 实例化参数类
option=Options()
option.add_argument('--no-sandbox')
option.add_experimental_option('detach',True)
# 创建并启动浏览器,将设置的参数绑定到浏览器上
chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option)
return chrome_driver
chrome_driver=driver()
# 打开网页
chrome_driver.get("https://www.baidu.com/")
#元素定位——NAME
chrome_driver.find_element(By.Name,'wd').send_keys('dafait')
3.2.5 元素定位 CLASS_NAME
通过 CLASS_NAME 定位元素:
- class 值不能有空格,否则会报错。
- class 值重复的有很多,需要切片。
- class 值有的网站是随机的,通过 class 值定位就失效了。
# 用于操作浏览器
from selenium import webdriver
# 用于设置 Google 浏览器参数
from selenium.webdriver.chrome.options import Options
# 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动
from selenium.webdriver.chrome.service import Service
#用于管理元素定位的库
from selenium.webdriver.common.by import By
import time
def driver():
# 实例化参数类
option=Options()
option.add_argument('--no-sandbox')
option.add_experimental_option('detach',True)
# 创建并启动浏览器,将设置的参数绑定到浏览器上
chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option)
return chrome_driver
chrome_driver=driver()
# 打开网页
chrome_driver.get("https://www.bilibili.com/")
#元素定位——CLASS_NAME
chrome_driver.find_elements(By.CLASS_NAME,'channel-link')[1].click()
3.2.6 元素定位 TAG_NAME
通过 TAG_NAME 定位元素:
- 查找<开头的标签名字>
- 重复的标签名字有很多,需要通过切片处理。
# 用于操作浏览器
from selenium import webdriver
# 用于设置 Google 浏览器参数
from selenium.webdriver.chrome.options import Options
# 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动
from selenium.webdriver.chrome.service import Service
#用于管理元素定位的库
from selenium.webdriver.common.by import By
import time
def driver():
# 实例化参数类
option=Options()
option.add_argument('--no-sandbox')
option.add_experimental_option('detach',True)
# 创建并启动浏览器,将设置的参数绑定到浏览器上
chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option)
return chrome_driver
chrome_driver=driver()
# 打开网页
chrome_driver.get("https://www.baidu.com/")
#元素定位——TAG_NAME
chrome_driver.find_elements(By.TAG_NAME,'a')[3].click()
3.2.7 元素定位 LINK_TEXT
通过 LINK_TEXT 定位元素:
- 通过精准链接文本找到标签 a 的元素
- 有重复的文本需要切片
# 用于操作浏览器
from selenium import webdriver
# 用于设置 Google 浏览器参数
from selenium.webdriver.chrome.options import Options
# 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动
from selenium.webdriver.chrome.service import Service
#用于管理元素定位的库
from selenium.webdriver.common.by import By
import time
def driver():
# 实例化参数类
option=Options()
option.add_argument('--no-sandbox')
option.add_experimental_option('detach',True)
# 创建并启动浏览器,将设置的参数绑定到浏览器上
chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option)
return chrome_driver
chrome_driver=driver()
# 打开网页
chrome_driver.get("https://www.baidu.com/")
#元素定位——LINK_TEXT
chrome_driver.find_element(By.LINK_TEXT,'新闻').click()
3.2.8 元素定位 PARTIAL_LINK_TEXT
通过 PARTIAL_LINK_TEXT 定位元素:
- 通过模糊链接文本找到标签 a 的元素[模糊文本定位]
- 有重复的文本需要切片。
# 用于操作浏览器
from selenium import webdriver
# 用于设置 Google 浏览器参数
from selenium.webdriver.chrome.options import Options
# 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动
from selenium.webdriver.chrome.service import Service
#用于管理元素定位的库
from selenium.webdriver.common.by import By
import time
def driver():
# 实例化参数类
option=Options()
option.add_argument('--no-sandbox')
option.add_experimental_option('detach',True)
# 创建并启动浏览器,将设置的参数绑定到浏览器上
chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option)
return chrome_driver
chrome_driver=driver()
# 打开网页
chrome_driver.get("https://www.baidu.com/")
#元素定位——PARTIAL_LINK_TEXT
chrome_driver.find_elements(By.PARTIAL_LINK_TEXT,'图')[1].click()
3.2.9 元素定位 CSS_SELECTOR
通过 CSS_SELECTOR 进行元素定位:
- 通过 id 定位,格式是
#id=井号 +id 值; - 通过 class 定位,格式是
.class=点+class 值; - 通过标签头定位,不加修饰符;
- 通过任意类型定位:“[类型=‘精准值’]”;
- 通过任意类型定位:“[类型*=‘模糊值’]”;
- 通过任意类型定位:“[类型^=‘开头值’]”;
- 通过任意类型定位:“[类型$=‘结尾值’]”;
- 更简单的定位方式:在浏览器控制台直接复制 SELECTOR (个别元素定位值会比较长)
1-7 条属于理论定位法,第 8 条元素定位法更简单。
# 用于操作浏览器
from selenium import webdriver
# 用于设置 Google 浏览器参数
from selenium.webdriver.chrome.options import Options
# 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动
from selenium.webdriver.chrome.service import Service
#用于管理元素定位的库
from selenium.webdriver.common.by import By
import time
def driver():
# 实例化参数类
option=Options()
option.add_argument('--no-sandbox')
option.add_experimental_option('detach',True)
# 创建并启动浏览器,将设置的参数绑定到浏览器上
chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option)
return chrome_driver
chrome_driver=driver()
# 打开网页
chrome_driver.get("https://www.baidu.com/")
# 元素定位 SELECTOR
chrome_driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('dafait') # 通过 id 定位,class 类似
# chrome_driver.find_elements(By.CSS_SELECTOR,'input')[3].send_keys('dafait') # 通过标签定位
# chrome_driver.find_element(By.CSS_SELECTOR,'[autocomplete="off"]').send_keys('dafait') # 通过任意类型定位
3.2.10 元素定位 XPATH
通过 XPATH 进行元素定位:
- 复制浏览器的 XPATH(通过属性 + 路径定位,属性是随机的,可能定位不到);
- 复制浏览器 XPATH 完整路径(缺点是定位值太长,优的是基本百分百准确)。
# 用于操作浏览器
from selenium import webdriver
# 用于设置 Google 浏览器参数
from selenium.webdriver.chrome.options import Options
# 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动
from selenium.webdriver.chrome.service import Service
#用于管理元素定位的库
from selenium.webdriver.common.by import By
import time
def driver():
# 实例化参数类
option=Options()
option.add_argument('--no-sandbox')
option.add_experimental_option('detach',True)
# 创建并启动浏览器,将设置的参数绑定到浏览器上
chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option)
return chrome_driver
chrome_driver=driver()
# 打开网页
chrome_driver.get("https://www.baidu.com/")
# 元素定位 XPATH
chrome_driver.find_element(By.XPATH,'//*[@id="s-top-left"]/a[1]').click()
# chrome_driver.find_element(By.XPATH,'/html/body/div/div[2]/div[2]/a[1]').click()
3.2.11 元素定位隐性等待
元素定位隐性等待:多少秒内找到元素立刻执行,没有找到元素就报错。注意这是一个设置,只需要写一次每次执行都会等待。
# 用于操作浏览器
from selenium import webdriver
# 用于设置 Google 浏览器参数
from selenium.webdriver.chrome.options import Options
# 指名 Google 浏览器驱动的位置,即用于管理浏览器驱动
from selenium.webdriver.chrome.service import Service
#用于管理元素定位的库
from selenium.webdriver.common.by import By
import time
def driver():
# 实例化参数类
option=Options()
option.add_argument('--no-sandbox')
option.add_experimental_option('detach',True)
# 创建并启动浏览器,将设置的参数绑定到浏览器上
chrome_driver=webdriver.Chrome(service=Service('指名浏览器驱动(chromedriver.exe)的位置(相对路径、绝对路径都可以)'),options=option)
return chrome_driver
chrome_driver=driver()
# 打开网页
chrome_driver.get("https://www.baidu.com/")
# 元素隐性等待
chrome_driver.implicitly_wait(30)
chrome_driver.find_element(By.XPATH,'/html/body/div/div[2]/div[2]/a[1]').click()
更多推荐



所有评论(0)