骏域网站建设专家东莞/公司网站设计需要多少钱
Selenium是一个自动化测试框架,主要用于Web应用程序的自动化测试。它可以模拟用户在浏览器中的操作,如打开网页、点击链接、填写表单等,并且可以在代码中实现条件判断、异常处理等功能。Selenium最初是用于测试Web应用程序的,但也可以用于其他用途,如爬取网站数据、自动化提交表单等。Selenium支持多种编程语言,如Java、Python、C#等,同时也支持多种浏览器,如Chrome、Firefox、Safari等。
该工具在使用时需要安装两个模块,首先读者需要自行安装selenium
包,并且需下载与对应浏览器匹配的驱动程序。
- 安装PIP包:pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
- 安装驱动程序:https://chromedriver.storage.googleapis.com/index.html
我们以Google
浏览器为例,此处本人的版本为112.0.5615.121(32 位)
根据该版本下载对应的驱动程序,并将驱动程序放入到Google
浏览器根目录下,如下图所示,此时的驱动就已经安装成功了;
21.9.1 模拟打开页面
当需要使用浏览器模拟时,首先我们要调用webdriver.Chrome(executable_path=WebPath)
函数并传入驱动程序路径,此时即可打开驱动程序与谷歌浏览器链接,接着就可以通过各类函数操控浏览器行为。
from selenium import webdriver
from selenium.webdriver.common.by import ByWebPath = "C:/Users/admin/AppData/Local/Google/Chrome/Application/chromedriver.exe"if __name__ == "__main__":driver = webdriver.Chrome(executable_path=WebPath)# 设置窗口大小为1275*765driver.set_window_size(1275, 765)# 设置窗体为全屏driver.maximize_window()# 获得窗口大小get_size = driver.get_window_size()print("获取窗口大小: {}".format(get_size))# 获取当前窗体句柄handle = driver.current_window_handleprint("当前句柄: {}".format(handle))# 打开链接并得到页面源代码url = "https://www.baidu.com"driver.get(url)url_source = str(driver.page_source)# print("页面源代码: {}".format(url_source))# 定位a标签并点击,跳转到贴吧click_url = driver.find_element(By.XPATH, '//*[@id="s-top-left"]/a[4]')click_url.click()# 打开页面后输出所有窗体句柄all_handles = driver.window_handlesprint("当前所有窗体句柄: {}".format(all_handles))input("输入回车结束")driver.quit()
上述代码片段中,首先通过set_window_size()
函数将浏览器页面设置为1275*765
接着再调用maximize_window()
设置为全屏,通过得到当前窗体句柄,并通过get()
函数让浏览器打开一个页面,最后通过xpath
语法定位到//*[@id="s-top-left"]/a[4]
标签(贴吧)上,并点击鼠标左键,打开页面后并输出所有窗体,如下图所示;
21.9.2 切换窗体句柄
如上代码执行后虽然打开了百度百科,但是窗体的句柄其实还是停留在了百度首页上,定位的元素还是在百度上,此时我们就需要切换窗体句柄,也就是将当前句柄切换到百度贴吧页面上,此时才可读取该页面的完整源代码信息。
我们通过使用all_handles[-1]
的方式切换到最后一个窗体上,也就是对应的百度贴吧页面,接着再执行switch_to.window(new_handle_tieba)
函数实现窗口句柄的切换功能,代码如下所示;
from selenium import webdriver
from selenium.webdriver.common.by import ByWebPath = "C:/Users/admin/AppData/Local/Google/Chrome/Application/chromedriver.exe"if __name__ == "__main__":driver = webdriver.Chrome(executable_path=WebPath)# 设置窗口大小为1275*765driver.set_window_size(1275, 765)# 打开链接并得到页面源代码url = "https://www.baidu.com"driver.get(url)# 定位a标签并点击,跳转到贴吧click_url = driver.find_element(By.XPATH, '//*[@id="s-top-left"]/a[4]')click_url.click()# 打开页面后输出所有窗体句柄all_handles = driver.window_handlesprint("当前所有窗体句柄: {}".format(all_handles))# 从所有句柄的集合中,获取最后那个,也就是最新的new_handle_tieba = all_handles[-1]# 执行切换操作driver.switch_to.window(new_handle_tieba)# 切换后查看现在的句柄now_handles = driver.current_window_handleprint("贴吧窗体句柄: {}".format(now_handles))# 得到贴吧源代码url_source = str(driver.page_source)print(url_source)input("输入回车结束")driver.quit()
运行后读者可自行查询当前句柄所在位置,如下图所示;
21.9.3 前进后退刷新
在控制页面是我们可能需要使用页面前进后退与刷新功能,前进时可以调用driver.forward()
函数实现,后退调用driver.back()
函数,而刷新则可调用driver.refresh()
函数,功能如下案例所示;
from selenium import webdriver
from selenium.webdriver.common.by import ByWebPath = "C:/Users/admin/AppData/Local/Google/Chrome/Application/chromedriver.exe"if __name__ == "__main__":driver = webdriver.Chrome(executable_path=WebPath)# 设置窗口大小为1275*765driver.set_window_size(1275, 765)# 打开链接driver.get(url="https://www.baidu.com")driver.get(url="https://www.lyshark.com")# 后退上一页,等待3秒driver.implicitly_wait(3)driver.back()# 前进下一页,等待3秒driver.implicitly_wait(3)driver.forward()# 刷新页面,等待3秒driver.implicitly_wait(3)driver.refresh()# 获取当前页面句柄,并切换过去handle = driver.current_window_handledriver.switch_to.window(handle)# 得到源代码url_source = str(driver.page_source)print(url_source)# 关闭当前窗口driver.close()input("输入回车结束")driver.quit()
运行后读者可自行观察输出效果,如下图所示;
21.9.4 自动页面采集
如下是一个综合案例,在案例中我们通过使用三种解析库实现了对百度页面中特定关键字的采集,当运行后读者可自行判断是否存在安全验证,如果存在可自行手动绕过检测,并输入y
此时即可实现关键字的采集,当采集完成后自动柏村委html
格式文件。
import re,argparse,requests
from selenium import webdriver
from bs4 import BeautifulSoup
from queue import QueueWebPath = "C:/Users/admin/AppData/Local/Google/Chrome/Application/chromedriver.exe"if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument("--search",dest="search",help="输入要搜索的语法,inurl:lyshark")args = parser.parse_args()if args.search:driver = webdriver.Chrome(executable_path=WebPath)driver.set_window_size(1024,768)queue = Queue()# 生成链接for item in range(0,1000,10):queue.put('https://www.baidu.com/s?wd={}&pn={}'.format(str(args.search),str(item)))# 每次吐出一个for item in queue.queue:driver.get(item)ret = str(driver.page_source)# 是否有验证if driver.title == "百度安全验证":print("请用户完成验证,并输入y: ")is_true = input()if is_true != "y":driver.close()soup = BeautifulSoup(ret,'html.parser')urls = soup.find_all(name='a',attrs={'data-click':re.compile(('.')),'class':None})for item in urls:try:get_url = requests.get(url=item['href'],headers=head,timeout=5)print(get_url)if get_url.status_code == 200:title = re.findall('<title>(.+)</title>', get_url.text)print("[+] 抓取URL: {} 抓取标题: {}".format(get_url.url,title))with open("save.html","a+") as fp:fp.write("<a href={}>{}</a><br>".format(get_url.url,title))except Exception:passelse:parser.print_help()
运行上述代码,读者可观察输出效果,此时会自动抓取特定页面中的链接,并存储到本地;
相关文章:

21.9 Python 使用Selenium库
Selenium是一个自动化测试框架,主要用于Web应用程序的自动化测试。它可以模拟用户在浏览器中的操作,如打开网页、点击链接、填写表单等,并且可以在代码中实现条件判断、异常处理等功能。Selenium最初是用于测试Web应用程序的,但也…...

C++初阶2
目录 一,auto关键字 1-1,auto的使用 1-2,基于范围auto的for循环 二,nullptr的运用 三,C类的初步学习 3-1,类的引用 3-2,类的访问权限 3-3,类的使用 1,类中函数的…...

网络安全(黑客)—小白自学
1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…...

在win10下,使用torchviz对深度学习网络模型进行可视化
目录 1. 安装 graphviz 和 torchviz 2.安装 graphviz.exe 3.实例测试 4.如果你的电脑还是无法画图,并且出现了下面的报错: 5.参考文章: 1. 安装 graphviz 和 torchviz 首先打开 Anaconda prompt 进入自己的 pytorch 环境(图中 pt 是我自…...

【自然语言处理】【长文本处理】RMT:能处理长度超过一百万token的Transformer
相关博客 【自然语言处理】【长文本处理】RMT:能处理长度超过一百万token的Transformer 【自然语言处理】【大模型】MPT模型结构源码解析(单机版) 【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版) 【自然语言处理】【大模型】BLOOM模型结构源码解析(…...

交叉编译工具链(以STM32MP1为例)
1.什么是交叉编译工具链? 在一个系统上进行编译,在另一个系统上进行执行 2.STM32MP1交叉编译工具链 3.交叉编译器内容 4.两种工具链模式 5.两种链接模式 6.工具使用 注意:OpenSTLinux已经提供了编译框架,不需要命令行手工编译 …...

使用 Pyro 和 PyTorch 的贝叶斯神经网络
一、说明 构建图像分类器已成为新的“hello world”。还记得当你第一次接触 Python 时,你的打印“hello world”感觉很神奇吗?几个月前,当我按照PyTorch 官方教程并为自己构建了一个运行良好的简单分类器时,我也有同样的感觉。 我…...

How to install the console system of i-search rpa on Centos 7
How to install the console system of i-search rpa on Centos 7 1、 准备1.1 、查看磁盘分区状态1.2、上传文件1.2.1、添加上传目录1.2.2、上传安装包1.2.3、解压安装包1.2.4、查看安装包结构 1.3、安装依赖包1.3.1、基础依赖包1.3.2 相关依赖 1.4、关闭防火墙1.5、解除SeLin…...

sql--索引使用 ---覆盖索引
覆盖索引 Select 后接 * 走id索引才是最优,使用二级索引则需要回表(性能稍差) 前缀索引 Create index 索引名 on 表名( 字段名( n ) ) n数字 n代表提取这个字符串的n个构建索引 ??那么 n 为几性能是最好的呢&…...

系统平台同一网络下不同设备及进程的话题通讯--DDS数据分发服务中间件
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言(1)中间件的介绍(2)DDS介绍(3)发布者(4)订阅者(5)idl文件(定义msg结构体)(6)QoS(Quality of Service)策略(7)DDS测试工具介绍(…...

轻量级 IDE 文本编辑器 Geany 发布 2.0
Geany 是功能强大、稳定、轻量的开发者专用文本编辑器,支持 Linux、Windows 和 macOS,内置支持 50 多种编程语言。 2005 年Geany 发布首个版本 0.1。上周四刚好是 Geany 诞生 18 周年纪念日,官方发布了 2.0 正式版以表庆祝。 下载地址&#…...

好用工具分享 | tmux 终端会话分离工具
目录 1 tmux的安装 2 tmux的基本操作 2.1 启动与退出 2.2 分离会话 2.3 查看会话 2.4 重接会话 2.5 杀死会话 2.6 切换会话 tmux是一个 terminal multiplexer(终端复用器),它可以启动一系列终端会话。 我们使用命令行时,…...

计算机网络重点概念整理-第三章 数据链路层【期末复习|考研复习】
计算机网络复习系列文章传送门: 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 前言三、数据链路层3.1 数据链路层的基础概念3.2 帧3.2.1 帧的概念3.2…...

迅速的更改conda 环境的名称!
快速的做法是,复制之前创建的环境 重新命名 然后再删除旧的环境即可!!! 因为之前已经装过环境了,只是名字不叫A而是B,所以现在把B(old_name)改成A(new_name)。 具体方法如下: 1. 复制出来一份…...

基本微信小程序的外卖点餐订餐平台
项目介绍 餐饮行业是一个传统的行业。根据当前发展现状,网络信息时代的全面普及,餐饮行业也在发生着变化,单就点餐这一方面,利用手机点单正在逐步进入人们的生活。传统的点餐方式,不仅会耗费大量的人力、时间…...

十大排序算法(C语言)
参考文献 https://zhuanlan.zhihu.com/p/449501682 https://blog.csdn.net/mwj327720862/article/details/80498455?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169837129516800222848165%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&…...

iTransformer: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING
#论文题目:ITRANSFORMER: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING #论文地址:https://arxiv.org/abs/2310.06625 #论文源码开源地址:https://github.com/thuml/Time-Series-Library #论文所属会议:Mach…...

QT C++ AES字符串加密实现
使用方法:在.h中引入类库。然后在cpp中直接引入使用即可 类库的下载地址https://download.csdn.net/download/u012372365/88478671 具体代码: #include <QCoreApplication> #include <QTest> #ifdef __cplusplus #include "unit_tes…...

关于mysql json字段创建索引
前言: 创建索引的方式分为两种,CREATE index 和 ALTER TABLE; 被创建索引的关键字类型又分两种,数字(UNSIGNED)和字符串(char(128)) 一、给json对象属性param_value(假…...

“探索Linux世界:从CentOS安装到常见命令使用“
目录 引言一、安装CentOS二、Linux的常见命令文件夹和目录操作命令文件编辑命令vi或vim编辑器命令模式编辑模式末行模式 总结 引言 在计算机领域,Linux作为一种强大而灵活的操作系统,在服务器、嵌入式设备和个人电脑等领域广泛应用。本文将引导您了解并…...

SVN出现Cleanup failed to process the following paths...
SVN报错,需要执行SVN的清理命令clean up,但clean up时出现错误Cleanup failed to process the following paths... 解决办法: 1、clean up的窗口,勾选Break locks和Fix time stamps(简单方便);…...

gitee上传项目
目录 首先在gitee新建一个仓库 接下来创建好项目,先找到生成公钥SSH的目录 接下来是生成公钥SSH 仓库创建好后,接着开始链接项目 首先在gitee新建一个仓库 接下来创建好项目,先找到生成公钥SSH的目录 接下来是找目录:C盘&a…...

实现文件上传和下载
文件上传的前端页面: multiple表示支持一次上传多个文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传文件</title> </head> <body> <form action"/ge…...

大数据-Storm流式框架(七)---Storm事务
storm 事务 需求 storm 对于保证消息处理,提供了最少一次的处理保证。最常见的问题是如果元组可以被 重发,可以用于计数吗?不会重复计数吗? strom0.7.0 引入了事务性拓扑的概念,可以保证消息仅被严格的处理一次。因此可…...

Kafka - 3.x Kafka消费者不完全指北
文章目录 Kafka消费模式Kakfa消费者工作流程消费者总体工作流程消费者组原理消费者组初始化流程消费者组详细消费流程 独立消费者案例(订阅主题)消费者重要参数 Kafka消费模式 Kafka的consumer采用pull(拉)模式从broker中读取数据…...

Gerrit | 重磅! 2.x 版本升级到 3.x 版本----转
Gerrit | 重磅! 2.x 版本升级到 3.x 版本 为什么要做版本升级? 2.x known bugs 重大问题不一一列举,这里仅仅是举几个例子: 安全或权限问题:普通用户能看到敏感数据,例如看到其他用户的 hashed api 密码,…...

使用c++编程语言,用递归的方法求第n个斐波那契数,代码如下
#include<iostream> using namespace std;int fib_1(int n) {if (n < 1){return n;}return fib_1(n - 1) fib_1(n - 2); }int main() {cout << fib_1(6);return 0; }...

git config pull.rebase false
git pull 默认使用merge 可以使用 git pull --rebase 命令使用rebase 或者配置 git config pull.rebase true 使 git pull命令执行 git pull --rebase git config pull.rebase false 的作用是设置 Git 在执行 git pull 命令时默认使用 merge 而不是 rebase。 git pull 命…...

Spring面试题:(一)IoC,DI,AOP和BeanFactory,ApplicationContext
IoC,DI,AOP思想 IOC就是控制反转,是指创建对象的控制权的转移。以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系。对象与对…...

RabbitMQ如何保证消息不丢失呢?
RabbitMQ 是一个流行的消息队列系统,用于在分布式应用程序之间传递消息。要确保消息不会丢失,可以采取以下一些措施: 持久化消息: RabbitMQ 允许你将消息标记为持久化的。这意味着消息将被写入磁盘,即使 RabbitMQ 服务…...