21.9 Python 使用Selenium库

news2024/11/16 13:29:28

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 By

WebPath = "C:/Users/admin/AppData/Local/Google/Chrome/Application/chromedriver.exe"

if __name__ == "__main__":
    driver = webdriver.Chrome(executable_path=WebPath)

    # 设置窗口大小为1275*765
    driver.set_window_size(1275, 765)

    # 设置窗体为全屏
    driver.maximize_window()

    # 获得窗口大小
    get_size = driver.get_window_size()
    print("获取窗口大小: {}".format(get_size))

    # 获取当前窗体句柄
    handle = driver.current_window_handle
    print("当前句柄: {}".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_handles
    print("当前所有窗体句柄: {}".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 By

WebPath = "C:/Users/admin/AppData/Local/Google/Chrome/Application/chromedriver.exe"

if __name__ == "__main__":
    driver = webdriver.Chrome(executable_path=WebPath)

    # 设置窗口大小为1275*765
    driver.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_handles
    print("当前所有窗体句柄: {}".format(all_handles))

    # 从所有句柄的集合中,获取最后那个,也就是最新的
    new_handle_tieba = all_handles[-1]

    # 执行切换操作
    driver.switch_to.window(new_handle_tieba)

    # 切换后查看现在的句柄
    now_handles = driver.current_window_handle
    print("贴吧窗体句柄: {}".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 By

WebPath = "C:/Users/admin/AppData/Local/Google/Chrome/Application/chromedriver.exe"

if __name__ == "__main__":
    driver = webdriver.Chrome(executable_path=WebPath)

    # 设置窗口大小为1275*765
    driver.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_handle
    driver.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 Queue

WebPath = "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:
                    pass
    else:
        parser.print_help()

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

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/6fa05047.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

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

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

相关文章

SQL查询优化---子查询优化、排序分组优化、覆盖索引优化

1、子查询优化 1、尽量不要使用not in 或者 not exists 取所有不为掌门人的员工&#xff0c;按年龄分组 &#xff0c;每个年龄段多少人 SELECT SQL_NO_CACHE age,count(*) FROM emp a WHERE id NOT IN(SELECT ceo FROM dept b2 WHERE ceo IS NOT NULL)group by age having…

NFC读卡器ST25R3911B-AQWT、ST25R3917B-AQET、ST25R3919B-AQET产品描述、功能框图

一、ST25R3911B 1.4 W功耗可支持VHBR和AAT的高性能HF读卡器 / NFC发起设备 ST25R3911B 是高度集成的NFC发起设备 / HF读卡器IC&#xff0c;包括模拟前端&#xff08;analog front end&#xff0c;AFE&#xff09;和一个高度集成的数据帧系统&#xff0c;可用于ISO 18092&#…

房产网源码 房产中介小程序源码 房产门户网站源码

房产网源码 房产中介小程序源码 房产门户网站源码 功能介绍&#xff1a; 一、付费发布信息 支持付费发布、刷新、置顶房源信息&#xff1b;二、个人发布信息 支持个人和房产经纪人发布房源信息&#xff1b;三、新房楼盘模块 支持新房楼盘功能&#xff0c;后台添加…

数字调制与星座图

文章目录 数字调制什么是调制&#xff1f;为什么调制&#xff1f;数字调制幅移键控 (ASK)频移键控 (FSK)相移键控 (PSK)二相相移键控(BPSK)正交相移键控(QPSK)补充&#xff1a;什么是相位 星座图IQ调制与解调IQ调制IQ解调IQ调制与解调的原理与过程IQ调制的应用举例 正交幅度调制…

ICC2:分段长tree的流程

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 分段长tree操作起来方法很多,这里提供两种ICC2分段长tree的方法。有需要的可以试试。 1.用原始sdc长一遍tree,找得到要做subtree部分,并预估latency值。 2.把sdc中添加subtree clock,subtree是…

使用Intersection Observer API 检测元素是否出现在可视窗口

使用Intersection Observer API 检测元素是否出现在可视窗口 API解读&#xff1a; Intersection Observer API提供了一种异步检测目标元素与祖先元素或视口(可统称为根元素)相交情况变化的方法。 注意点&#xff1a;因为该 API 是异步的&#xff0c;它不会随着目标元素的滚动…

基于springboot实现校园交友网站管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园交友网站管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生…

COSCon'23媒体和社区合作伙伴正式公布!百川相聚,潮汇大海,邀您天府之城共话开源!...

一年一度的开源盛会&#xff0c;COSCon23 第八届中国开源年会&#xff0c;将于10月28~29日&#xff0c;在四川成都市高新区菁蓉汇召开&#xff01;本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01; 如往年一样&#xff0c;作为中国最大的非营利…

独创变频杀毒(血影内核) 瑞星杀毒软件V16保驾护航

下载地址&#xff1a;https://user.qzone.qq.com/512526231/main

MySQL知识总结(内附超详细知识框架图)

MySQL知识总结 博友们&#xff0c;你们好&#xff01;博主最近对MySQL相关的知识进行了复盘&#xff0c;并通过思维导图的方式提取出了MySQL的核心知识点&#xff0c;现将复盘结果分享给大家&#xff0c;希望能够对大家学习MySQL有所帮助。 下面博主将MySQL各大模块的思维导图…

CDN是如何一步步壮大到现在这样的

当我们浏览网页、观看在线视频或下载文件时&#xff0c;CDN&#xff08;内容分发网络&#xff09;已经成为网络世界中不可或缺的一部分。本文将探讨CDN的发展历程&#xff0c;其工作原理&#xff0c;以及它如何利用不同地区来提供更快速、可靠的内容交付服务。 CDN的发展历程 过…

HTML5+CSS3+JS小实例:带密码灯照射的登录界面

实例:带密码灯照射的登录界面 技术栈:HTML+CSS+JS 字体图标库:Font Awesome 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name=&…

SOLIDWORKS® 2024 新功能 - SIMULATION

1、增强型轴承接头 • 通过指定压缩、拉伸和弯曲的刚度&#xff0c;轻松创建自定义轴承接头。 • 通过向非线性和大型位移算例添加自定义条件&#xff0c;提高模拟精度。 优点 使用功能强大的接口&#xff0c;更轻松、更准确地设置模拟过程&#xff0c;并加快模拟速度。 2、…

计算机行业已经进入寒冬?云计算帮你解决就业难题!

近几年国内外互联网行业都有大动作&#xff0c;国内外互联网企业都开始了裁员。 “谷歌宣布解雇1.2万名员工&#xff0c;占总员工数的6%” “微软宣布计划在第三财季裁员1万人” “Meta开启两轮万人裁员&#xff0c;总计裁员约2.1万” “据传阿里即将裁员25%” “OPPO宣布哲库…

SpringBoot整合阿里云OSS对象存储

文章目录 1、OSS介绍及开通1.1、阿里云OSS简介1.2、开通OSS 2、创建存储空间bucket及密钥获取2.1、创建存储空间2.2、获取密钥 3、OSS快速入门案例4、在springboot项目中整合4.1、将oss配置放到yml文件中4.2、创建Oss属性类&#xff0c;接收yml文件中的属性4.3、封装文件上传功…

Redis 主从复制和哨兵监控,实现Redis高可用配置

文章目录 一、概述二、主从复制模拟说明三、准备配置文件四、启动Redis实例五、主从复制配置5.1 命令方式启用和取消主从复制5.2 配置文件方式启用和取消主从复制5.3 测试主从复制5.4 有其主从复制的其他参数配置 六、Sentinel 配置6.1 Sentinel 的作用6.2 Sentinel 监控说明6.…

现货白银指标分析根本没用!?

在现货白银市场上&#xff0c;RSI、PAR、抛物线、动力指标MOM等的分析工具大行其道&#xff0c;受到不少投资者的欢迎&#xff0c;其实这些指标都是由于美国人威尔斯威尔德发明&#xff0c;但它后来有发表文章推翻了这些分析工具的好处&#xff0c;并推出了另一套崭新理论去取代…

虹科直播 | CDS网络与数据安全专题技术直播重磅来袭,11.2起与您精彩相约

文章来源&#xff1a;虹科网络安全 阅读原文&#xff1a;https://mp.weixin.qq.com/s/T-CgU28hmYy4YV5SV9QGhg 虹科数据加密解决方案 虹科终端安全防护方案 虹科是在各细分专业技术领域内的资源整合及技术服务落地供应商&#xff0c;虹科网络安全事业部的宗旨是&#xff1a;让…

【牛牛送书 | 第二期】《ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践》

目录 前言&#xff1a; 本书目录&#xff1a; 内容简介&#xff1a; 专家评价&#xff1a; 适合对象&#xff1a; 送书规则&#xff1a; 前言&#xff1a; 现如今&#xff0c;随着计算机技术的不断发展和互联网的普及&#xff0c;我们已经迈入了一个高效的信息处理和传…

批量管理文件,轻松实现翻译与重命名,一键操作高效便捷!

在工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;而文件的翻译和重命名是常见的需求。为了帮助您更高效地管理文件&#xff0c;我们特别推出一款全新的批量文件管理工具&#xff0c;让您轻松实现文件的翻译和重命名&#xff0c;提高工作效率&#xff01; 首先第一步…