当前位置: 首页 > news >正文

21.9 Python 使用Selenium库

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()

运行上述代码,读者可观察输出效果,此时会自动抓取特定页面中的链接,并存储到本地;

相关文章:

  • 竞赛选题 深度学习图像修复算法 - opencv python 机器视觉
  • k8s异常Too many requests: Too many requests, please try again later.
  • Flask 上传文件,requests通过接口上传文件
  • 【Maven教程】(九):使用 Maven 进行测试 ~
  • C++之C++11字符串字面量后缀总结(二百四十八)
  • 分享从零开始学习网络设备配置--任务4.2 使用IPv6静态及默认路由实现网络连通
  • SpringCore完整学习教程5,入门级别
  • 软考系列(系统架构师)- 2012年系统架构师软考案例分析考点
  • 应用案例|基于三维机器视觉的曲轴自动化上下料应用方案
  • Nginx的进程结构实例演示
  • 方案聚焦:高可用的F5分布式云DNS负载均衡
  • 模数转换器-ADC基础
  • Harmony 个人中心(页面交互、跳转、导航、容器组件)
  • How to install mongodb-7.0 as systemd service with podman
  • 【AD9361 数字接口CMOS LVDSSPI】B 并行数据之CMOS
  • DOM的那些事
  • Intervention/image 图片处理扩展包的安装和使用
  • JS变量作用域
  • Linux CTF 逆向入门
  • Magento 1.x 中文订单打印乱码
  • nginx 负载服务器优化
  • PHP 小技巧
  • SOFAMosn配置模型
  • webgl (原生)基础入门指南【一】
  • 关于Flux,Vuex,Redux的思考
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 小程序开发之路(一)
  • 7行Python代码的人脸识别
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (07)Hive——窗口函数详解
  • (二)PySpark3:SparkSQL编程
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (一)RocketMQ初步认识
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)程序员技术练级攻略
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .net core开源商城系统源码,支持可视化布局小程序
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NetCore项目nginx发布
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • [ACM] hdu 1201 18岁生日
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [Android]使用Retrofit进行网络请求
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [hive小技巧]同一份数据多种处理
  • [Jquery] 实现鼠标移到某个对象,在旁边显示层。