本文简介:本文主要讲解 Python 第三方库 Selenium的动态技术,可用于爬取动态网页的数据。使用的是 Google 浏览器,若不能下载 Google 浏览器及驱动的可替换为其它浏览器。本文使用有一定计算机基础和 Python 基础的学习人士。

参考链接:

第一章 Selenium 概述

web 自动化开源库,支持多种浏览器,如 Chrome、Firefox、Edge、Safari 等。

跨平台、兼容性高。

通过浏览器驱动控制浏览器,通过元素定位法模拟人工交互以实现 web 自动化。

Selenium 官方技术文档:https://www.selenium.dev/

第二章 Selenium 环境安装

2.1 安装浏览器

  1. 下载浏览器,此处以 Chrome 浏览器为例。浏览器下载地址为https://www.google.cn/chrome/

  2. 安装浏览器。

  3. 安装浏览器对应的驱动,此处安装的是 chromedriver 驱动,谷歌浏览器驱动下载地址为https://googlechromelabs.github.io/chrome-for-testing/

    注意:驱动版本号要和浏览器版本号对应(至少大版本要对应符合),否则失效

  4. 关闭浏览器自动更新,防止更新导致驱动失效。

    在开始内搜索 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 操作浏览器

  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)
    
  2. 打开网页、关闭网页、浏览器

    通过创建的浏览器对象打开网页、关闭网页、浏览器,对应的方法是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()
    
  3. 浏览器最大化、最小化

    通过创建的浏览器对象最大化、最小化浏览器,对应的方法是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()
    
  4. 浏览器打开位置、尺寸

    设置浏览器打开位置: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)
    
  5. 浏览器截图、网页刷新

    浏览器截图: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. 定位1个元素

    通过创建的浏览器对象调用 find_element(元素定位方式,value),找到的话返回结果,找不到的话报错。

  2. 定位多个元素

    浏览器对象调用 find_elements(元素定位方式,value),找到的话返回列表形式的结果,找不到的话返回空列表。

  3. 浏览器查找多个元素

    在浏览器打开开发者工具,在控制台输入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 定位元素的特点:

  1. 通过 ID 定位元素,一般比较准确。
  2. 并不是所有的网页或者元素都要 ID 值。

3.2.4 元素定位 NAME

通过 NAME 定位元素的特点:

  1. 通过 NAME 定位元素,一般比较准确。
  2. 并不是所有的网页或者元素都要 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 定位元素:

  1. class 值不能有空格,否则会报错。
  2. class 值重复的有很多,需要切片。
  3. 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 定位元素:

  1. 查找<开头的标签名字>
  2. 重复的标签名字有很多,需要通过切片处理。
# 用于操作浏览器
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 定位元素:

  1. 通过精准链接文本找到标签 a 的元素
  2. 有重复的文本需要切片
# 用于操作浏览器
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 定位元素:

  1. 通过模糊链接文本找到标签 a 的元素[模糊文本定位]
  2. 有重复的文本需要切片。
# 用于操作浏览器
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 进行元素定位:

  1. 通过 id 定位,格式是#id=井号 +id 值;
  2. 通过 class 定位,格式是.class=点+class 值;
  3. 通过标签头定位,不加修饰符;
  4. 通过任意类型定位:“[类型=‘精准值’]”;
  5. 通过任意类型定位:“[类型*=‘模糊值’]”;
  6. 通过任意类型定位:“[类型^=‘开头值’]”;
  7. 通过任意类型定位:“[类型$=‘结尾值’]”;
  8. 更简单的定位方式:在浏览器控制台直接复制 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 进行元素定位:

  1. 复制浏览器的 XPATH(通过属性 + 路径定位,属性是随机的,可能定位不到);
  2. 复制浏览器 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()
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐