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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Haproxy负载均衡集群

一、haproxy概念&#xff1a; Haproxy&#xff1a;他也是常用的负载均衡转发 nginx支持四层转发&#xff0c;七层转发 haproxy也可以四层和七层转发 LVS的DR和NAT是基于四层转发 TUN是四层七层 基于四层的转发&#xff1a; LVSnginxhaproxy 基于七层的转发&#xff1a; …

【python与数据结构】(leetcode算法预备知识)

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ python与数据结构 Python 中常见的数据类型数据结构1.数组&#xff08;Array&#xff09;2.链表&#xff08;Linked List&#xff09;3.哈希表&#xff08;Hash Table&#xff09;4.队列&#xff08;Queue&#x…

洛谷 B2029 大象喝水 C++代码

题目描述 AC Code #include<bits/stdc.h> using namespace std; int main() {int h,r;cin>>h>>r;double val;val3.14*r*r*h;int ans20000/val;ans;cout<<ans<<endl;return 0; }

动手学深度学习(李沐)的pytorch版本(包含代码和PDF版本)

目录 网址&#xff08;特别适合自学&#xff09; 说明: 代码与PDF版 网址&#xff08;特别适合自学&#xff09; 传送门 界面一览&#xff1a; 说明: github上一个项目将《动手学深度学习》从mxnet改为了pytorch实现。感谢大佬们的工作。   特别说明该电子版网页是通过do…

JVM调优(10)JVM的运行时数据区

一、概述 对于 C C 来说&#xff0c;在内存管理领域&#xff0c;JVM既拥有最高的权利&#xff0c;但是同时他们又是从事最基础工作的劳动人员&#xff0c;因为他们担负着每一个对象从开始到结束的维护责任。而对于Java来说&#xff0c;再虚拟机自动内存管理的帮助下&#xff0…

2000-2021年三批“智慧城市”试点名单匹配数据

2000-2021年三批“智慧城市”试点名单匹配数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;行政区划代码、地区、所属省份、年份、智慧城市试点、最早试点年份 3、来源&#xff1a;住建部公布的三批“国家智慧城市名单” 4、说明&#xff1a;内含原始文件和匹配结…

Liunx两台服务器实现相互SSH免密登录

一、首先准备两台Linux虚拟机当作此次实验的两台服务器 服务器1&#xff1a;server IPV4&#xff1a;192.168.110.136 服务器2&#xff1a;client IPV4&#xff1a; 192.168.110.134 二、准备阶段 [rootserver ~]# systemctl disable firewalld #关…

Web3 治理实践探讨:如何寻找多元化发展路径?

Web3 领域变革正崭露头角&#xff0c;而社区治理开始成为行业热议话题。Web3 项目如何探寻多元化建设的解困路径&#xff0c;究竟是治理模型的精进成为首要问题&#xff0c;还是吸纳更多资金与组织教育培训&#xff0c;让开发者成为项目建设的中坚力量&#xff1f;本期 TinTinW…

知识分享|分段函数线性化及matlab测试

目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all;gn10;tn1;x_pfsdpvar(1, tn,…

【Python爬虫三天从0到1】Day1:爬虫核心

目录 1.HTTP协议与WEB开发 &#xff08;1&#xff09;简介 &#xff08;2&#xff09;请求协议和响应协议 2. requests&反爬破解 &#xff08;1&#xff09;UA反爬 &#xff08;2&#xff09;referer反爬 &#xff08;3&#xff09;cookie反爬 3.请求参数 &#x…

程序设计语言

编译解释 传参还是传值 编译原理

Centos使用tomcat部署jenkins

jenkins的最新版本已经不在支持jdk8&#xff0c;支持的jdk环境如下&#xff1a; 安装jdk环境 yum -y install java-11-openjdk.x86_64 java-11-openjdk-devel.x86_64安装tomcat tomcat官网 cd /optwget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.82/bin/apache-tomcat…

大数据-Storm流式框架(七)---Storm事务

storm 事务 需求 storm 对于保证消息处理&#xff0c;提供了最少一次的处理保证。最常见的问题是如果元组可以被 重发&#xff0c;可以用于计数吗&#xff1f;不会重复计数吗&#xff1f; strom0.7.0 引入了事务性拓扑的概念&#xff0c;可以保证消息仅被严格的处理一次。因此可…

leetCode 2578. 最小和分割 + 排序 + 贪心 + 奇偶分组(构造最优解)

2578. 最小和分割 - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 num &#xff0c;请你将它分割成两个非负整数 num1 和 num2 &#xff0c;满足&#xff1a; num1 和 num2 直接连起来&#xff0c;得到 num 各数位的一个排列。 换句话说&#xff0c;num1 和 num2 中所…

黑客在Pwn2Own Toronto上以58个零日漏洞赚取超过100万美元

Pwn2Own Toronto 2023黑客大赛已经圆满结束&#xff0c;安全研究人员通过攻击消费类产品的58个零日漏洞&#xff08;以及多个漏洞碰撞&#xff09;赚取了1,038,500美元。此次比赛由趋势科技的零日倡议&#xff08;Zero Day Initiative&#xff0c;简称ZDI&#xff09;组织&…

目标检测及锚框、IoU

文章目录 1. 目标检测2. 锚框3. IoU - 交并比4. 赋予锚框标号5. 使用非极大值抑制&#xff08;NMS&#xff09;输出 1. 目标检测 物体检测&#xff08;目标检测&#xff09;是计算机视觉和数字图像处理的热门方向&#xff0c;意在判断一幅图像上是否存在感兴趣物体&#xff0c…

在pycharm中,远程操作服务器上的jupyter notebook

一、使用场景 现在我们有两台电脑&#xff0c;一台是拥有高算力的服务器&#xff0c;另一台是普通的轻薄笔记本电脑。如何在服务器上运行jupyter notebook&#xff0c;同时映射到笔记本电脑上的pycharm客户端中进行操作呢&#xff1f; 二、软件 pycharm专业版&#xff0c;jupy…

【Python · PyTorch】线性代数 微积分

本文采用Python及PyTorch版本如下&#xff1a; Python&#xff1a;3.9.0 PyTorch&#xff1a;2.0.1cpu 本文为博主自用知识点提纲&#xff0c;无过于具体介绍&#xff0c;详细内容请参考其他文章。 线性代数 & 微积分 1. 线性代数1.1 基础1.1.1 标量1.1.2 向量长度&…

【LeetCode】7. 整数反转

题目链接 文章目录 Python3官方解法 ⟮ O ( ∣ x ∣ ) 、 O ( 1 ) ⟯ \lgroup O(|x|)、O(1)\rgroup ⟮O(∣x∣)、O(1)⟯写法2写法3 C官方解法 ⟮ O ( ∣ x ∣ ) 、 O ( 1 ) ⟯ \lgroup O(|x|)、O(1)\rgroup ⟮O(∣x∣)、O(1)⟯ Python3 官方解法 ⟮ O ( ∣ x ∣ ) 、 O ( 1…

数据库调优(Mysql)

1 索引 索引是帮助数据库高效查询的一种数据结构&#xff1a; 查询语句&#xff1a;select * from t where t.Col2 89; 不加索引进行数据库查询时&#xff0c;每次都需要将所有数据遍历一次&#xff0c;直到找到符合目标的数据。 加上索引之后&#xff0c;可以根据数据结构不同…