(python)selenium工具的安装及其使用

news2025/1/15 13:04:23

selenium概述

一个自动化测试工具。它可以让python代码调用浏览器。并获取到浏览器中加载的各种资源
优缺点:

  • 优点
    • selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易
    • 使用难度简单
    • 爬取速度慢,爬取频率更像人的行为,天生能够应对一些反爬措施
  • 缺点
    • 由于selenium操作浏览器,因此会将发送所有的请求,因此占用网络带宽
    • 由于操作浏览器,因此占用的内存非常大
    • 速度慢,对于效率要求高的话不建议使用

selenium安装

python终端安装selenium

pip install selenium

推荐使用谷歌浏览器,本文以谷歌浏览器为例

1、查看浏览器的版本号

在这里插入图片描述

2、下载浏览器对应版本的驱动

chrome驱动地址下载
找到对应的版本号(前三段数字相同即可),下载
在这里插入图片描述

3、驱动配置

将压缩包解压,建议放入与python解释器同一目录(此方式无需配置环境变量)
在这里插入图片描述
如何查看python解释器位置?
win下输入 py -0p查看(其余操作系统方式请自行查找查看方式)
在这里插入图片描述

selenium的基本使用

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")   # 访问百度网(会弹出百度网页)
driver.save_screenshot("baidu.png")   # 截图
print(driver.page_source)             # 打印源码
print(driver.get_cookies())           # 打印cookies
print(driver.current_url)             # 打印当前url

driver.close()  # 退出当前页面
driver.quit()   # 退出浏览器

cookie的使用

import time
from selenium.webdriver import Chrome
import json

# 登录操作 ...

#获取cookie
cookies = driver.get_cookies()
json_cookies = json.dumps(cookies)  # 使用json进行处理
with open('gsw_cookies.txt', 'w') as f:
    f.write(json_cookies)
    
with open('gsw_cookies.txt', 'r') as f:
    cookies = json.loads(f.read())  # 读取所有cookies  转换为列表的cookie

for cookie in cookies:
    cookie_dict = {}
    for k,v in cookie.items():
        cookie_dict[k] = v
    driver.add_cookie(cookie_dict) # 设置cookie

# 刷新  使我们的cookie生效
driver.refresh() 
 
# 此刻重新访
driver.get('https://xxx')

获取懒加载网页的源代码

import random
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By

def scroll_windwo(driver, stop_lengt=None, step_length=2000):
    '''
    使窗口不断向下滚动
    :param driver:
    :param stop_lengt:
    :param step_length:
    :return:
    '''
    while True:
        if stop_lengt:
            if stop_lengt - step_length <= 0:
                # 使用js实现滚动条自动往下走
                driver.execute_script(f'window.scrollBy(0, {stop_lengt})')
                break
            print(stop_lengt)
            # 使用js实现滚动条自动往下走
            driver.execute_script(f'window.scrollBy(0, {step_length})')
            stop_lengt -= step_length   # 每次减去滚动的距离
            time.sleep(0.1)

driver = Chrome()
driver.get('https://xxx.com/')
step_length = 2000  # 每次向下滚动的步长
stop_lengt = 30000   # 向下滚动到当前整个值得时候就不滚了
for i in range(1, 6):
    scroll_windwo(driver, stop_lengt, step_length)  # 先滚一些  把异步的分页加载先加载文 直到出现加载更多按钮
    more = driver.find_element(By.XPATH, '//*[@id="index2016_wrap"]/div[2]/div[2]/div[3]/div[2]/div[5]/div/a[3]')
    # more.click()
    # 无法使用more.click  原因上面有我们看不到的覆盖物 点击会报错
    driver.execute_script('arguments[0].click();', more)
    print(f'第{i}次点击')

print(driver.page_source)   # 获取页面最终源代码

selenium的定位操作

1、元素定位的两种方式

  • 精确定位一个元素,返回结果为一个element对象,定位不到则报错
	driver.find_element(By.xx, value)  # 建议使用
    driver.find_element_by_xxx(value)
  • 定位一组元素,返回结果为element对象列表,定位不到返回空列表
 	driver.find_elements(By.xx, value)  # 建议使用
    driver.find_elements_by_xxx(value)

2、元素定位的八种方法

  • By.ID 使用id值定位
	el = driver.find_element(By.ID, '')
    el = driver.find_element_by_id()    
  • By.XPATH 使用xpath定位
	el = driver.find_element(By.XPATH, '')
    el = driver.find_element_by_xpath()   
  • By.TAG_NAME. 使用标签名定位
	el = driver.find_element(By.TAG_NAME, '')
    el = driver.find_element_by_tag_name()    
  • By.LINK_TEXT使用超链接文本定位
	el = driver.find_element(By.LINK_TEXT, '')
    el = driver.find_element_by_link_text() 
  • By.PARTIAL_LINK_TEXT 使用部分超链接文本定位
	el = driver.find_element(By.PARTIAL_LINK_TEXT  , '')
    el = driver.find_element_by_partial_link_text()
  • By.NAME 使用name属性值定位
	el = driver.find_element(By.NAME, '')
    el = driver.find_element_by_name()
  • By.CLASS_NAME 使用class属性值定位
     el = driver.find_element(By.CLASS_NAME, '')   
     el = driver.find_element_by_class_name()
  • By.CSS_SELECTOR 使用css选择器定位
 	el = driver.find_element(By.CSS_SELECTOR, '')  
    el = driver.find_element_by_css_selector()

3、元素的操作

  • 从定位到的元素中获取数据
el.get_attribute(key)           # 获取key属性名对应的属性值
el.text                        	# 获取开闭标签之间的文本内容
  • 对定位到的元素的操作
el.click()                      # 对元素执行点击操作

el.submit()                     # 对元素执行提交操作

el.clear()                      # 清空可输入元素中的数据

el.send_keys(data)              # 向可输入元素输入数据

4、使用案例

import time

from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By

driver = Chrome()  # 实例化
driver.get('https://www.gushiwen.cn/')  # 访问古诗文网站

# 使用id查找节点
# txtKey = driver.find_element(By.ID, 'txtKey')
# print(txtKey)  #<selenium.webdriver.remote.webelement.WebElement (session="953d50dc821197e9bd2ce97a7ab66045", element="9f422884-c998-45f2-8274-3414bd3c50db")>
# time.sleep(1)
# 向搜索框中输入数据
# txtKey.send_keys('唐诗')
# 点击搜索
# submit = driver.find_element(By.XPATH, '/html/body/div[1]/div/div[2]/div[2]/div[1]/form/input[3]')
# submit.click()  # 点击搜索按钮


# 使用xpath
# txtKey = driver.find_element(By.XPATH, '//*[@id="txtKey"]')
# txtKey.send_keys('唐诗')
# 点击搜索
# submit = driver.find_element(By.XPATH, '/html/body/div[1]/div/div[2]/div[2]/div[1]/form/input[3]')
# submit.click()  # 点击搜索按钮

# 匹配所有超链接
# a_list = driver.find_elements(By.TAG_NAME, 'a')
# a_list = driver.find_elements_by_tag_name('a')  # 老版本的写法  作为了解
# print(a_list)
# for a in a_list:
    # 获取href属性
    # print(a.get_attribute('href'))

# 通过超链接的内容进行节点获取
# res = driver.find_elements(By.LINK_TEXT, '唐诗三百')
# print(res)

# 通过class进行查找  只要是是cont值 就都会返回
# res = driver.find_elements(By.CLASS_NAME, 'cont')
# print(res)

# print(driver.page_source)  # 获取页面源代码

selenium的其他操作

1、无头浏览器

无头即不显示网页

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
opt = Options()
opt.add_argument("--headless")
opt.add_argument('--disable-gpu')
opt.add_argument("--window-size=4000,1600")  # 设置窗口大小

web = Chrome(options=opt)
web.get('https://news.163.com/')
print(web.page_source)

2、switch方法切换的操作

2.1 一个浏览器肯定会有很多窗口,切换窗口的方法如下:
# 可以使用 window_handles 方法来获取每个窗口的操作对象。例如:
# 1. 获取当前所有的窗口
current_windows = driver.window_handles

# 2. 根据窗口索引进行切换
driver.switch_to.window(current_windows[1])

driver.switch_to.window(web.window_handles[-1])  # 跳转到最后一个窗口
driver.switch_to.window(current_windows[0])      # 回到第一个窗口
2.2 iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是
driver.switch_to.frame(name/el/id)     
# 传入的参数可以使iframe对应的id值,也可以是用元素定位之后的元素对象
2.3 当你触发了某个事件之后,页面出现了弹窗提示,处理这个提示或者获取提示信息方法如下:
alert = driver.switch_to_alert()
2.4. 页面前进和后退
driver.forward()     # 前进
driver.back()        # 后退
driver.refresh() 	 # 刷新
driver.close()       # 关闭当前窗口
2.5、设置浏览器最大窗口
driver.maximize_window()  # 最大化浏览器窗口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s安装nfs设置pv pvc并部署mysql

在k8s系列第一篇中提到有一个用于nfs机器没有部署任何东西&#xff0c;这一篇我们来搭建nfs服务&#xff0c;并在k8s上部署mysql&#xff0c;并将mysql的data目录映射到nfs中。网上的部分教程为了简便教学用的hostPath做的映射&#xff0c;只是便于教学的简便做法&#xff0c;实…

Linux常用命令——skill命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) skill 向选定的进程发送信号冻结进程 补充说明 skill命令用于向选定的进程发送信号&#xff0c;冻结进程。这个命令初学者并不常用&#xff0c;深入之后牵涉到系统服务优化之后可能会用到。 语法 skill(选项…

vim的自动化配置(一条指令就够了)

应该没有人在因为vim中括号不能对齐和补齐和自动缩进而烦恼吧&#xff01; 自动化配置不香吗&#xff1f; 如果你想把你的vim给配置成像vs2022编译器一样&#xff0c;那么恭喜你&#xff0c;当你看到这篇文章的时候你就要成功了&#xff01; 一条指令&#xff0c;下载出vs20…

Java 分支及循环语句

文章目录一、分支语句1. if 语句2. switch 语句二、循环语句1. for 循环语句2. while 循环语句3. do...while 循环语句4. 跳转控制语句5. 循环嵌套6. Random6.1 猜数字游戏一、分支语句 1. if 语句 if(关系表达式1) {语句体1; } else if(关系表达式2){语句体2; } ... else {语…

带你去了解什么是makefile文件

GNU make命令是用来控制从源文件生成可执行文件或非可执行文件的方式。那么make命令又是通过makefile文件来控制了。所以了解makefile文件就显得很有必要了。 makefile文件由许多规则组成&#xff0c;这些规则的形式一般是这样的&#xff1a; 目标 ... : 先决条件 ...命令目标…

PMP范围和需求的区别是什么?

定义需求&#xff1a;为满足业务需求&#xff0c;某个产品、服务或成果必须达到的条件或具备的能力。范围&#xff1a;项目所提供的产品、服务和成果的总和。在PMI中我们常说的范围一般为项目范围&#xff0c;其定义为&#xff1a;为交付具有规定特性与功能的产品、服务或成果而…

现金+股票再平衡策略的测试 - 针对恒指

最近很多人在讨论一个策略&#xff0c;就是50%现金&#xff0c;50%ETF&#xff0c;然后按照一定的策略再平衡一次&#xff0c;将会获得比单纯股票投资更安全的策略和更加稳定的收益。我做了一个简单的回测。 测试模式1 1990-01-02 - 2023-01-20 长期涨模式 首先假设我找到了一…

Redis面试题万字汇总 [施工中]

1. Redis 数据结构Redis底层有五种数据结构,String, long / double : 底层是小于Long的数字时, 使用的时long字符.它也可以支持double类型浮点数,embstr : 如果是短字符串,长度小于39个字节, 使用的是embstr数据结构. 之所以是39字节,主要是redis的jemalloc最小单位是64个字节,…

深度估计源码详解

源码链接见文末 论文地址: Monocular Depth Estimation Using Laplacian Pyramid-Based Depth Residuals | IEEE Journals & Magazine | IEEE Xplore 1.项目环境配置 项目中所包含的库直接使用pip install就好,但是有3个地方需要处理一下: fcntl,这个需要打开anacon…

DFS(六) N皇后 II

n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/pr…

浮动 应用场景 浮动的基本特点 高度坍塌 解决浮动时盒子冲突问题

目录浮动应用场景浮动的基本特点盒子尺寸盒子排列文字环绕高度坍塌浮动 视觉格式化模型&#xff0c;大体上将页面中盒子的排列分为三种方式&#xff1a; 常规流浮动定位 应用场景 文字环绕横向排列 浮动的基本特点 修改float属性值为&#xff1a; left&#xff1a;左浮动…

【HBase入门】6. 常用 Shell 操作(3)

前言 我们可以以shell的方式来维护和管理HBase。例如&#xff1a;执行建表语句、执行增删改查操作等等。 过滤器的用法 过滤器一般结合scan命令来使用。打开HBase的JAVA API文档。找到RowFilter的构造器说明&#xff0c;我们来看以下&#xff0c;HBase的过滤器该如何使用。 …

快速排序的实现和优化~

相比于冒泡排序的改进点&#xff1a; 在前面学过的冒泡排序中&#xff0c;由于扫描过程只对相邻的两个元素进行比较&#xff0c;因此在互换两个相邻元素时&#xff0c;只能消除一个逆序&#xff0c;如果能通过两个(不相邻的)元素的交换&#xff0c;消除待排序记录 中的多个逆序…

docker desktop window10家庭版踩坑实录

安装 桌面版&#xff1a;https://www.docker.com/products/docker-desktop 这里我就安装的是桌面版 选择windows 前置工作 1.按下 wins&#xff08;找到这个&#xff09; 将下面的这个勾选中&#xff0c;如果你是家庭版很可能没有这个东西&#xff0c;那么请看我的这篇文章…

5-5中央处理器-指令流水线

文章目录一.基本概念1.多条指令在处理器中的执行方式&#xff08;1&#xff09;顺序执行方式/串行执行方式&#xff08;2&#xff09;流水线执行方式①一次重叠执行方式②二次重叠执行方式2.流水线的表示方法&#xff08;时空图&#xff09;3.超标量流水线二.分类1.部件功能级、…

第四十五章 动态规划——背包问题模型(二)

一、概述 我们在上一章中已经对背包模型做了一定地讲解&#xff0c;但是我们发现其实在上一章节中我们所介绍的例题大部分是给背包问题套上一个背景&#xff0c;当我们识破了背后的模型后&#xff0c;我们就可以直接套用模板&#xff0c;基本不需要对代码做改变。 那么在这一…

SpringBoot读写Redis客户端并实现技术切换(Jedis)

SpringBoot整合Redishttps://blog.csdn.net/weixin_51882166/article/details/128759780?spm1001.2014.3001.5501 读写客户端 首先应该打开redis服务&#xff1b; cd命令进入Redis安装目录下&#xff1a; 进入Redis客户端&#xff1a; redis-cli.exe -h 127.0.0.1 -p 6379…

梯度下降算法有哪些?有什么区别?【背景、原理、公式、代码】

一、梯度下降算法背景 梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯…

行为型模式-职责链模式

1.概述 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象的处理条件或权限不同。例如&#xff0c;公司员工请假&#xff0c;可批假的领导有部门负责人、副总经理、总经理等&#xff0c;但每个领导能批准的天数不同…

记一段相亲反思

记一段相亲反思项目系统启动项目相亲需求的细分高净值人群特定类型的高预期结婚结婚前的彩礼引流系统启动流量&#xff0c;从哪里来&#xff1f;作弊避险&#xff0c;什么钱不能赚&#xff1f;这不是一篇找对象的文章&#xff0c;而是帮别人找对象来赚钱的文章。 项目系统 启…