Python Selenium自动化实现网页操控

 更新时间:2025年08月04日 09:42:04   作者:hui函数  
Selenium 是一个用于 Web 应用程序测试的工具,支持多种浏览器,下面我们就来看看Python如何使用Selenium实现自动化操作网页吧

1 什么是 Selenium 自动化

Selenium 是一个用于 Web 应用程序测试的工具,支持多种浏览器(如 Chrome、Firefox、Edge 等)。WebDriver 是 Selenium 的核心组件,用于控制浏览器行为并执行自动化操作。元素定位是通过各种方式(如 ID、Class Name、XPath 等)在网页上找到特定元素。

2 为什么要使用 Selenium 自动化

Selenium 可以用于自动化测试,减少人工测试的工作量。Selenium 可以用于抓取动态加载的数据,这些数据通常无法通过简单的 HTTP 请求获取。Selenium 支持多种浏览器,确保应用在不同浏览器上的一致性。

3 什么时候使用 Selenium 自动化

当网页内容是通过 JavaScript 动态加载时,Selenium 是抓取这些数据的理想工具。当需要模拟复杂的用户交互(如点击、输入、滚动等)时,Selenium 非常有用。在需要频繁进行回归测试或跨浏览器测试时,Selenium 是首选工具。

4 如何使用 Selenium 自动化

安装 Selenium 库和浏览器驱动(如 ChromeDriver)。打开浏览器、导航到 URL、定位元素、点击、输入等。处理弹出窗口、等待元素加载、执行 JavaScript 等。处理元素未找到、超时等异常情况。

安装与配置

安装 Selenium 库

pip install selenium==4.5.0

下载浏览器驱动(如 ChromeDriver)

将浏览器驱动程序的路径添加到系统环境变量中。

注意:不同版本的浏览器驱动程序支持的浏览器版本也不同,在下载浏览器驱动程序之前,先查看当前浏览器的版本号。

查看 Chrome 浏览器版本

单击 Chrome 浏览器右上角的图标打开 “自定义及控制 Google Chrome” 菜单,在该菜单中选择 “帮助”→“关于 Google Chrome” 打开关于 Chrome 页面。

访问 chromedriver 官网

根据 Chrome 浏览器的版本号,到 chromedriver官网 官方网站或者到 最新最全的外网

chromedriver驱动网站与Chrome浏览器版本对应的chromedriver的下载列表,下载对应版本的 ChromeDriver。

下载 chromedriver

单击与浏览器相应版本的 ChromeDriver 链接,进入下载页面,下载 ZIP 格式的压缩包到本地,解压后得到 chromedriver.exe。

WebDriver 的配置

将 WebDriver 配置到系统环境变量后,程序中再次使用 WebDriver 时,就不需要重复指定 WebDriver 的执行路径了。

5 selenium 的基本使用

from selenium import webdriver
​
url = 'https://www.baidu.com'
​
# 创建浏览器操作对象
browser = webdriver.Chrome()
​
# 打开网页
browser.get(url)
# 获取源码(同requests.text)
print(browser.page_source)
input('用户按下回车键退出')
# 退出
browser.quit()

6 Selenium 元素定位

元素定位首先要找到它们,WebDriver 提供很多定位元素的方法:

定位方式By 标识符示例
IDBy.IDfind_element(By.ID, "kw")
Name 属性By.NAMEfind_element(By.NAME, "wd")
Class nameBy.CLASS_NAMEfind_element(By.CLASS_NAME, "s_ipt")
标签名By.TAG_NAMEfind_elements(By.TAG_NAME, "input")
链接文本By.LINK_TEXTfind_element(By.LINK_TEXT, "新闻")
部分链接文本By.PARTIAL_LINK_TEXTfind_element(By.PARTIAL_LINK_TEXT, "新")
CSS 选择器By.CSS_SELECTORfind_element(By.CSS_SELECTOR, "#su")
XPathBy.XPATHfind_element(By.XPATH, '//input[@id="su"]')

代码演示:selenium 的元素定位

from selenium import webdriver
# 定位元素,必须要导入By
from selenium.webdriver.common.by import By
​
url = 'https://www.baidu.com'
​
# 创建浏览器操作对象
browser = webdriver.Chrome()
​
# 打开网页
browser.get(url)
​
# 通过id获取输入框
res1 = browser.find_element(By.ID,'kw')
print(res1)
​
# 通过name获取输入框
res2 = browser.find_element(By.NAME,'wd')
print(res2)
​
# 通过XPath获取输入框
res3 = browser.find_element(By.XPATH,"//*/input[@id='kw']")
print(res3)
print(res1==res2 and res2==res3)# True
​
# 通过类名获取输入框
res4 = browser.find_element(By.CLASS_NAME,"s_ipt")
​
# 通过css选择器来获取输入框
res5 = browser.find_element(By.CSS_SELECTOR,"#kw")
print(res3==res4 and res4==res5)# True
​
# 通过通过链接文本获取标签
res6 = browser.find_element(By.LINK_TEXT,"新闻")
​
# 通过部分链接文本获取标签
res7 = browser.find_element(By.PARTIAL_LINK_TEXT,"闻")
print(res6==res7)# True
​
# 通过标签名,并且由复数的形式获取a标签
res8 = browser.find_elements(By.TAG_NAME,"a")
print(res8)
​
input('用户按下回车键退出~')
# 退出
browser.quit()

7 访问元素信息

获取元素属性 .get_attribute('class'),获取元素文本 .text,获取标签名.tag_name

8 元素信息获取

from selenium import webdriver
from selenium.webdriver.common.by import By
​
# 创建浏览器操作对象
browser = webdriver.Chrome()
​
url = "https://www.baidu.com"
# 打开网页
browser.get(url)
​
# 获取到新闻文本的a链接(通过链接文本内容)
a = browser.find_element(By.LINK_TEXT,"新闻")
​
# 获取href
a_href = a.get_attribute('href')
print(f"href:{a_href}")
# 结果:href:http://news.baidu.com/
​
# 获取class
a_class = a.get_attribute('class')
print(f"class:{a_class}")
# 结果:class:mnav c-font-normal c-color-t
​
# 获取文本内容
a_text = a.text
print(a_text)
# 结果:新闻
​
# 获取标签名称
a_tag_name = a.tag_name
print(a_tag_name)
# 结果:a

9 交互操作

点击、send_keys()、后退操作、前进操作、模拟 JS 滚动、执行 JS 代码、获取网页代码 page_source、退出。

selenium 元素交互

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
​
# 创建浏览器操作对象
browser = webdriver.Chrome()
# 将窗口最大化
# browser.maximize_window()
​
url = 'https://www.baidu.com'
# 打开浏览器
browser.get(url)
​
# 获取输入框
get_input = browser.find_element(By.ID,"kw")
# 输入周杰伦
get_input.send_keys('周杰伦')
​
# 获取点击按钮
get_button = browser.find_element(By.CSS_SELECTOR,"input[type='submit']")
# 执行点击操作
get_button.click()
​
def scoll():
    # 这里要进行等待,否则后面的滑动页面没有反应,目的是等待页面加载
    time.sleep(2)
    # 执行滑动
    js = 'document.documentElement.scrollTop=100000'
    browser.execute_script(js)
def next_page():
    scoll()
    time.sleep(2)
    # 获取下一页按钮
    next_button = browser.find_element(By.PARTIAL_LINK_TEXT,"下一页")
    # 执行点击操作
    next_button.click()
for i in range(3):
    next_page()
# 导航操作
browser.back()  # 回退
time.sleep(2)
browser.forward() # 前进
input('回车键退出程序~')
browser.quit()

10 案例练习

12306 注册下拉框功能实现

# 导入模块
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select  # 专门处理下拉框
​
# 目标网站
url = 'https://kyfw.12306.cn/otn/regist/init'
​
# 创建浏览器操作对象
browser = webdriver.Chrome()
​
# 打开网页
browser.get(url)
​
# 获取下拉框对象
get_selector = browser.find_element(By.ID,'cardType')
# 实例化Selectors对象
selector = Select(get_selector)
time.sleep(2)
# 使用value来选定
# selector.select_by_value('B')
# 使用索引来选择
selector.select_by_index(5)
input('回车键退出程序~')
browser.quit()

11 案例实战

目标

开发一个爬虫程序,从苏宁易购网站抓取口红商品信息,并保存为 CSV 文件。

目标网址

苏宁易购(Suning.com)

要求

  • 商品信息采集:实现苏宁易购平台特定商品(口红)信息的自动化采集,支持多页数据连续采集。
  • 用户交互模拟:实现浏览器自动化操作,模拟真实用户搜索行为,处理页面动态加载内容。
  • 数据存储与分析:结构化存储商品信息,支持后续数据分析处理,提供可扩展的数据存储方案。

需求

商品信息包括:商品名、评论数、价格、店铺名、详情页链接。

页面结构分析

通过分析,每个商品都是一个 <li> 标签,这一页的所有数据都在一个 <ul> 标签里面。

实现思路分析

  • 打开网站
  • 输入内容(口红)
  • 点击搜索
  • 拖动滚轮到底部
  • 爬取数据 / 解析数据
  • 翻页处理

实现代码:

# 导入模块
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import csv

# 目标网站
url = 'https://www.suning.com/'

# 创建浏览器操作对象
browser = webdriver.Chrome()

browser.maximize_window()
# 打开网页
browser.get(url)

# 获取输入框对象
input_element = browser.find_element(By.ID,"searchKeywords")
# 执行输入
input_element.send_keys('口红')
time.sleep(1)

# 获取点击按钮
button_element = browser.find_element(By.ID,"searchSubmit")
# 执行点击
button_element.click()
time.sleep(1)
# 下滑
def drop_down():
    time.sleep(6)
    for x in range(1,12,2):
        time.sleep(1)
        j = x / 9
        js = f'document.documentElement.scrollTop = document.documentElement.scrollHeight * {j}'
        browser.execute_script(js)
# 获取数据
def get_info():
    # 先执行下拉
    drop_down()
    # 构建字典
    info_dict = {
        '商品名称':"",
        '商品价格':"",
        '评论数':"",
        '店铺名称':"",
        '详情链接':"",
        '图片url':""
    }
    # 获取每一个盒子
    list_box = browser.find_elements(By.CLASS_NAME,"product-box ")
    if list_box:
        for box in list_box:
            # 获取商品名称
            title = box.find_element(By.CSS_SELECTOR,".title-selling-point > a").text
            info_dict['商品名称'] = title
            # 获取商品价格
            price = box.find_element(By.CSS_SELECTOR,".def-price").text
            info_dict['商品价格'] = price
            # 获取评论数
            comment = box.find_element(By.CSS_SELECTOR,".info-evaluate > a").text
            info_dict['评论数'] = comment
            # 获取店铺名称
            dianpu = box.find_element(By.CSS_SELECTOR,".store-stock > a").text
            info_dict['店铺名称'] = dianpu
            # 获取详情链接
            detail_url = box.find_element(By.CSS_SELECTOR,".title-selling-point > a").get_attribute('href')
            info_dict['详情链接'] = detail_url
            # 获取图片url
            photo_url = box.find_element(By.CSS_SELECTOR,".sellPoint > img").get_attribute('src')
            info_dict['图片url'] = photo_url
            csv_writer.writerow(info_dict)
            print(info_dict)
    else:
        print('没有获取到所有盒子')
flag = True
i = 1
with open('苏宁易购_口红.csv','w',newline='',encoding='utf-8') as f:
    field_list = ['商品名称','商品价格','评论数','店铺名称','详情链接','图片url']
    csv_writer = csv.DictWriter(f,fieldnames=field_list)
    csv_writer.writeheader()
    while flag:
        try:
            print(f'正在获取第{i}页内容')
            # 调用获取内容函数
            get_info()
            # # 获取下一页按钮
            # next_page_btn = browser.find_element(By.ID,"nextPage")
            # # 执行点击下一页
            # next_page_btn.click()
            # 翻页
            browser.execute_script('document.querySelector("#nextPage").click()')
            time.sleep(2)  # 等待页面加载
            i += 1
        except Exception as e:
            flag = False
            print('已经是最后一页了')
            input('回车键结束')
            browser.quit()

以上就是Python Selenium自动化实现网页操控的详细内容,更多关于Python Selenium网页操作的资料请关注脚本之家其它相关文章!

相关文章

  • Python中应用protobuf的示例详解

    Python中应用protobuf的示例详解

    这篇文章主要来和大家聊一聊 protobuf,它是一个数据序列化和反序列化协议,因此它和 json 的定位是一样的。文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-02-02
  • Python学习小技巧之列表项的排序

    Python学习小技巧之列表项的排序

    这篇文章主要给大家介绍了Python学习小技巧之列表项排序的相关资料,文中介绍的非常详细,需要的朋友们可以参借鉴,下面跟着小编一起来学习学习吧。
    2017-05-05
  • python中print的不换行即时输出的快速解决方法

    python中print的不换行即时输出的快速解决方法

    下面小编就为大家带来一篇python中print的不换行即时输出的快速解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考
    2016-07-07
  • 浅析Python数据处理

    浅析Python数据处理

    本篇文章给大家分享了关于Python数据处理的相关内容以及要点解释,对此知识点有兴趣的朋友可以参考学习下。
    2018-05-05
  • Python 虚拟环境的价值和常用命令详解

    Python 虚拟环境的价值和常用命令详解

    在实际项目开发中,我们通常会根据自己的需求去下载各种相应的框架库,如Scrapy、Beautiful Soup等,但是可能每个项目使用的框架库并不一样,或使用框架的版本不一样,今天给大家分享下Python 虚拟环境的价值和常用命令,感兴趣的朋友一起看看吧
    2022-05-05
  • Python实现合并两个列表的方法分析

    Python实现合并两个列表的方法分析

    这篇文章主要介绍了Python实现合并两个列表的方法,结合实例形式对比分析了常见的Python列表合并操作技巧,需要的朋友可以参考下
    2018-05-05
  • 实例Python处理XML文件的方法

    实例Python处理XML文件的方法

    这篇文章主要介绍了实例Python处理XML文件的方法,包括用Python处理XML大文件的情况,需要的朋友可以参考下
    2015-08-08
  • python关于字典及遍历的常用方法

    python关于字典及遍历的常用方法

    这篇文章主要介绍了python关于字典及遍历的常用方法,字典的键可以是字符串、整数、元组或字典。字典的值也可以是字符串、整数,文章围绕主题展开更多详细的内容,需要的小伙伴可以参考一下
    2022-06-06
  • 在Python中处理列表之reverse()方法的使用教程

    在Python中处理列表之reverse()方法的使用教程

    这篇文章主要介绍了在Python中处理列表之reverse()方法的使用教程,是Python入门中的基础知识,需要的朋友可以参考下
    2015-05-05
  • python实现自动登录12306自动抢票功能

    python实现自动登录12306自动抢票功能

    随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行,往往会出现一票难求的情况,因此,一些技术爱好者尝试利用编程语言如Python来开发抢票脚本
    2025-01-01

最新评论