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 标识符 | 示例 |
---|---|---|
id | by.id | find_element(by.id, "kw") |
name 属性 | by.name | find_element(by.name, "wd") |
class name | by.class_name | find_element(by.class_name, "s_ipt") |
标签名 | by.tag_name | find_elements(by.tag_name, "input") |
链接文本 | by.link_text | find_element(by.link_text, "新闻") |
部分链接文本 | by.partial_link_text | find_element(by.partial_link_text, "新") |
css 选择器 | by.css_selector | find_element(by.css_selector, "#su") |
xpath | by.xpath | find_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网页操作的资料请关注代码网其它相关文章!
发表评论