21.9 Python 使用Selenium库

简介: Selenium是一个自动化测试框架,主要用于Web应用程序的自动化测试。它可以模拟用户在浏览器中的操作,如打开网页、点击链接、填写表单等,并且可以在代码中实现条件判断、异常处理等功能。Selenium最初是用于测试Web应用程序的,但也可以用于其他用途,如爬取网站数据、自动化提交表单等。Selenium支持多种编程语言,如Java、Python、C#等,同时也支持多种浏览器,如Chrome、Firefox、Safari等。

Selenium是一个自动化测试框架,主要用于Web应用程序的自动化测试。它可以模拟用户在浏览器中的操作,如打开网页、点击链接、填写表单等,并且可以在代码中实现条件判断、异常处理等功能。Selenium最初是用于测试Web应用程序的,但也可以用于其他用途,如爬取网站数据、自动化提交表单等。Selenium支持多种编程语言,如Java、Python、C#等,同时也支持多种浏览器,如Chrome、Firefox、Safari等。

该工具在使用时需要安装两个模块,首先读者需要自行安装selenium包,并且需下载与对应浏览器匹配的驱动程序。

我们以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 许可协议。转载请注明出处!

目录
相关文章
|
18小时前
|
XML 前端开发 数据格式
BeautifulSoup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据
BeautifulSoup 是 Python 的一个库,用于解析 HTML 和 XML 文件,即使在格式不规范的情况下也能有效工作。通过创建 BeautifulSoup 对象并使用方法如 find_all 和 get,可以方便地提取和查找文档中的信息。以下是一段示例代码,展示如何安装库、解析 HTML 数据以及打印段落、链接和特定类名的元素。BeautifulSoup 还支持更复杂的查询和文档修改功能。
5 1
|
1天前
|
机器学习/深度学习 自然语言处理 算法
Gensim详细介绍和使用:一个Python文本建模库
Gensim详细介绍和使用:一个Python文本建模库
10 1
|
1天前
|
JSON 数据格式 Python
Python 的 requests 库是一个强大的 HTTP 客户端库,用于发送各种类型的 HTTP 请求
`requests` 库是 Python 中用于HTTP请求的强大工具。要开始使用,需通过 `pip install requests` 进行安装。发送GET请求可使用 `requests.get(url)`,而POST请求则需结合 `json.dumps(data)` 以JSON格式发送数据。PUT和DELETE请求类似,分别调用 `requests.put()` 和 `requests.delete()`。
11 2
|
2天前
|
JSON 数据格式 索引
python之JMESPath:JSON 查询语法库示例详解
python之JMESPath:JSON 查询语法库示例详解
13 0
|
9天前
|
Python
在Python中绘制K线图,可以使用matplotlib和mplfinance库
使用Python的matplotlib和mplfinance库可绘制金融K线图。mplfinance提供便利的绘图功能,示例代码显示如何加载CSV数据(含开盘、最高、最低、收盘价及成交量),并用`mpf.plot()`绘制K线图,设置类型为&#39;candle&#39;,显示移动平均线(mav)和成交量信息。可通过调整参数自定义图表样式,详情参考mplfinance文档。
29 2
|
10天前
|
机器学习/深度学习 边缘计算 TensorFlow
【Python机器学习专栏】Python机器学习工具与库的未来展望
【4月更文挑战第30天】本文探讨了Python在机器学习中的关键角色,重点介绍了Scikit-learn、TensorFlow和PyTorch等流行库。随着技术进步,未来Python机器学习工具将聚焦自动化、智能化、可解释性和可信赖性,并促进跨领域创新,结合云端与边缘计算,为各领域应用带来更高效、可靠的解决方案。
|
10天前
|
Serverless Python
使用Python的pandas和matplotlib库绘制移动平均线(MA)示例
使用Python的pandas和matplotlib库绘制移动平均线(MA)示例:加载CSV数据,计算5日、10日和20日MA,然后在K线图上绘制。通过`rolling()`计算平均值,`plot()`函数展示图表,`legend()`添加图例。可利用matplotlib参数自定义样式。查阅matplotlib文档以获取更多定制选项。
25 1
|
10天前
|
数据采集 SQL 数据挖掘
Python数据分析中的Pandas库应用指南
在数据科学和分析领域,Python语言已经成为了一种非常流行的工具。本文将介绍Python中的Pandas库,该库提供了强大的数据结构和数据分析工具,使得数据处理变得更加简单高效。通过详细的示例和应用指南,读者将了解到如何使用Pandas库进行数据加载、清洗、转换和分析,从而提升数据处理的效率和准确性。
|
10天前
|
SQL 关系型数据库 MySQL
使用Python的pymysql库连接MySQL,执行CRUD操作
使用Python的pymysql库连接MySQL,执行CRUD操作:安装pymysql,然后连接(host=&#39;localhost&#39;,user=&#39;root&#39;,password=&#39;yourpassword&#39;,database=&#39;yourdatabase&#39;),创建游标。查询数据示例:`SELECT * FROM yourtable`;插入数据:`INSERT INTO yourtable...`;更新数据:`UPDATE yourtable SET...`;删除数据:`DELETE FROM yourtable WHERE...`。
25 0
|
11天前
|
机器学习/深度学习 算法 数据挖掘
机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧
机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧

热门文章

最新文章