selenium自动化介绍

文章目录

  • 一、selenium原理 + 安装
  • 二、selenium使用
    • 1.创建浏览器对象,访问网址
    • 2.消除警告提示
    • 3.不显示浏览器中受控制字样
    • 4.防检测
    • 5.设置延时
      • 5.1强制延时
      • 5.2隐式延时
    • 6.设置浏览器窗口大小
  • 三、案例实战:百度搜索
  • 四、iframe标签
  • 五、案例实战:QQ空间登录
  • 六、获取网页数据两种方式
  • 七、案例实战:艺恩票房信息


一、selenium原理 + 安装

selenium是第三方自动化库,完全用来模拟人对浏览器做任何操作,通常用于爬虫和自动化测试。需要先安装,安装命令是:

pip install selenium

安装好之后暂时还用不了,需要安装谷歌驱动chromedriver,下载驱动的网址如下:

https://googlechromelabs.github.io/chrome-for-testing/#stable

下载好之后解压,可以看到chromedriver.exe,将其配置为环境变量即可。

二、selenium使用

1.创建浏览器对象,访问网址

具体用法代码如下:

# 从selenium库中导入浏览器驱动
from selenium import webdriver

# 创建谷歌浏览器对象
browser = webdriver.Chrome()

# 准备网址
url = 'https://www.baidu.com'

# 对网址发起请求
browser.get(url)

2.消除警告提示

如果有的小伙伴使用时在控制台出现警告字符,想去除警告的话在开头加上如下代码:

import warnings
warnings.filterwarnings('ignore')

3.不显示浏览器中受控制字样

还有的小伙伴有强迫症,不喜欢看到浏览器上方显示的“Chrome正受到自动…”字样,如下图:
在这里插入图片描述

这个也可以去掉,代码如下所示:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 创建ChromeOptions对象
chrome_options = Options()

# 添加启动参数,禁用浏览器自动化控制提示
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 创建Chrome浏览器对象
browser = webdriver.Chrome(options=chrome_options)

4.防检测

当然谷歌浏览器一般都会有检测机制,可以检测出我们是真实的人还是代码,所以也要加上防检测代码,具体代码模版如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 创建ChromeOptions对象
chrome_options = Options()

# 添加启动参数,禁用浏览器自动化控制提示
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 创建Chrome浏览器对象
browser = webdriver.Chrome(options=chrome_options)

# 防检测
browser.execute_cdp_cmd(
            "Page.addScriptToEvaluateOnNewDocument",
            {
                "source": " Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) "
            }
        )

# 准备网址
url = ''

# 对网址发起请求
browser.get(url)

5.设置延时

程序运行的速度很快,但是一般电脑配置都参差不齐,如果电脑配置差会导致程序报错,程序运行到后面而网页还没加载好,针对这种问题,我们要设置延时,设置延时方式有两种

5.1强制延时

强制延时使用time模块,里面的sleep()方法,代码示例如下:

# 导入time模块
import time

# 程序执行到此沉睡5s,而后往下执行
time.sleep(5)

print('ok')

5.2隐式延时

隐式延时又叫隐式等待,比如我去请求某个网站,设置隐式等待20s,但是我1s就访问成功了,那么剩下19s就不会等了,继续往下执行,换句话就是灵活等待。反之,如果20s内都没访问成功,则不再等待,继续往下执行剩余代码。

设置隐式延时代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 创建ChromeOptions对象
chrome_options = Options()

# 添加启动参数,禁用浏览器自动化控制提示
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 创建Chrome浏览器对象
browser = webdriver.Chrome(options=chrome_options)

# 防检测
browser.execute_cdp_cmd(
            "Page.addScriptToEvaluateOnNewDocument",
            {
                "source": " Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) "
            }
        )

# 准备网址
url = 'https://www.baidu.com'

# 对网址发起请求
browser.get(url)

# 设置隐式等待100s
browser.implicitly_wait(100)

print('ok')

运行之后会发现根本没有等100s,网站请求成功之后就执行了打印ok。

6.设置浏览器窗口大小

运行代码之后我们会发现浏览器窗口只有屏幕一半大小,可以设置为全屏,具体代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 创建ChromeOptions对象
chrome_options = Options()

# 添加启动参数,禁用浏览器自动化控制提示
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 创建Chrome浏览器对象
browser = webdriver.Chrome(options=chrome_options)

# 防检测
browser.execute_cdp_cmd(
            "Page.addScriptToEvaluateOnNewDocument",
            {
                "source": " Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) "
            }
        )

# 设置浏览器窗口为最大
browser.maximize_window()

# 准备网址
url = 'https://www.baidu.com'

# 对网址发起请求
browser.get(url)

三、案例实战:百度搜索

案例实战:使用selenium库实现百度搜索

全部代码如下:

import time
import warnings
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options


class BdssSpider(object):
    def __init__(self):
        '''
            1、初始化部分
        '''
        warnings.filterwarnings('ignore')
        # 创建ChromeOptions对象
        chrome_options = Options()
        # 添加启动参数,禁用浏览器自动化控制提示
        chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
        self.start_url = 'https://www.baidu.com'
        self.driver = webdriver.Chrome(chrome_options)
        self.driver.execute_cdp_cmd(
            "Page.addScriptToEvaluateOnNewDocument",
            {
                "source": " Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) "
            }
        )
        self.driver.maximize_window()

    def requests_start_url(self):
        '''
            2、访问起始网址
        '''
        self.driver.get(self.start_url)
        self.driver.implicitly_wait(10)
        self.find_element()

    def find_element(self):
        '''
            3、输入内容,点击搜索按钮
        '''
        # 通过元素的id值定位,然后发送搜索关键字
        self.driver.find_element(by=By.ID, value='kw').send_keys('风景')
        time.sleep(1)
        # 通过元素的id值定位,然后点击
        self.driver.find_element(by=By.ID, value='su').click()

    def main(self):
        '''
            逻辑控制部分
        '''
        self.requests_start_url()
        input('Press any key to quit...')


if __name__ == '__main__':
    bdss = BdssSpider()
    bdss.main()

四、iframe标签

iframe标签作用其实相当于给网页中套了一个网页,比如下面代码所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title</title>
</head>
<body>
    <input type="text", id="p1">
    <iframe>
        <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>title</title>
            </head>
            <body>
                <input type="text", id="p2">
            </body>
        </html>
    </iframe>
</body>
</html>

如果想直接通过id="p2"定位到里面的input标签是定位不到的,因为只能定位到外面的html中的input标签,不能定位到里面嵌套的另外一个html文件。这时候如果要定位到里面的,就需要用到标签切换,那如何使用iframe标签切换呢?接下来通过一个案例实战来具体实现。

五、案例实战:QQ空间登录

QQ空间登录里面就使用了iframe标签嵌套了一个HTML代码,如下图所示:
在这里插入图片描述

所以正常使用selenium的标签定位是定位不到的,这就是难点,接下来看看如何用iframe标签切换来解决,具体代码如下:

import time
import warnings
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options


class QqdlSpider(object):
    def __init__(self):
        '''
            1、初始化部分
        '''
        # 去除警告
        warnings.filterwarnings('ignore')
        # 创建ChromeOptions对象
        chrome_options = Options()
        # 添加启动参数,禁用浏览器自动化控制提示
        chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
        self.url = 'https://qzone.qq.com'
        # 创建浏览器对象
        self.driver = webdriver.Chrome(chrome_options)
        # 防检测
        self.driver.execute_cdp_cmd(
            "Page.addScriptToEvaluateOnNewDocument",
            {
                "source": " Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) "
            }
        )
        # 浏览器窗口最大化
        self.driver.maximize_window()

    def open_url(self):
        '''
            2、访问QQ空间主页
        '''
        self.driver.get(self.url)
        # 隐式等待10s
        self.driver.implicitly_wait(10)
        self.switch_login()

    def switch_login(self):
        '''
            3、切换登录方式为密码登录
        '''
        # 找到iframe标签
        iframe = self.driver.find_element(by=By.ID, value='login_frame')
        # 切换到iframe里面
        self.driver.switch_to.frame(iframe)
        # 定位到密码登录标签并且点击
        self.driver.find_element(by=By.XPATH, value='//*[@id="switcher_plogin"]').click()
        self.login_account()

    def login_account(self):
        '''
            4、输入用户名密码登录
        '''
        # 输入用户名
        self.driver.find_element(by=By.XPATH, value='//*[@id="u"]').send_keys('QQ账号')
        time.sleep(2)
        # 输入密码
        self.driver.find_element(by=By.XPATH, value='//*[@id="p"]').send_keys('QQ密码')
        time.sleep(2)
        # 点击登录
        self.driver.find_element(by=By.XPATH, value='//*[@id="login_button"]').click()

    def main(self):
        '''
            逻辑控制部分
        '''
        self.open_url()
        input('Press any key to quit...')


if __name__ == '__main__':
    qqdl = QqdlSpider()
    qqdl.main()

六、获取网页数据两种方式

  1. 查找元素(find_element())→ 定位到具体标签元素
  2. 获取页面源码(page_source)→ 获取的是当前页面的所有数据,包含静态和动态数据都有

七、案例实战:艺恩票房信息

案例实战:使用selenium库爬取艺恩票房信息

效果如下图所示:
在这里插入图片描述

全部代码如下:

import time
import warnings
from lxml import etree
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


class YepfSpider(object):
    def __init__(self):
        '''
            1、初始化部分
        '''
        # 去除警告
        warnings.filterwarnings('ignore')
        # 创建ChromeOptions对象
        chrome_options = Options()
        # 添加启动参数,禁用浏览器自动化控制提示
        chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
        self.url = 'https://www.endata.com.cn/BoxOffice/BO/Year/index.html'
        # 创建浏览器对象
        self.driver = webdriver.Chrome(chrome_options)
        # 防检测
        self.driver.execute_cdp_cmd(
            "Page.addScriptToEvaluateOnNewDocument",
            {
                "source": " Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) "
            }
        )
        # 浏览器窗口最大化
        self.driver.maximize_window()

    def open_url(self):
        '''
            2、打开网址
        '''
        self.driver.get(self.url)
        time.sleep(3)
        self.get_response()

    def get_response(self):
        '''
            3、获取网页源码
        '''
        # 获取网页源码
        response = self.driver.page_source
        self.parse_response(response)

    def parse_response(self, response):
        '''
            4、xpath解析响应
        '''
        html_xpath = etree.HTML(response)
        # 1、影片名称
        movie_names = html_xpath.xpath('//td[@class="movie-name"]/a/p/text()')
        # 2、类型
        movie_types = html_xpath.xpath('//*[@id="TableList"]/table/tbody/tr/td[3]/text()')
        # 3、总票房(万)
        movie_boxes = [i.replace(',', '')+'万' for i in html_xpath.xpath('//*[@id="TableList"]/table/tbody/tr/td[4]/text()')]
        # 4、国家及地区
        movie_countries = html_xpath.xpath('//*[@id="TableList"]/table/tbody/tr/td[7]/text()')
        # 5、上映日期
        launch_dates = html_xpath.xpath('//*[@id="TableList"]/table/tbody/tr/td[8]/text()')
        for movie_name, movie_type, movie_box, movie_country, launch_date in zip(movie_names, movie_types, movie_boxes, movie_countries, launch_dates):
            print(movie_name, movie_type, movie_box, movie_country, launch_date, sep=' | ')

    def main(self):
        '''
            逻辑控制部分
        '''
        self.open_url()
        input('Press any key to quit...')


if __name__ == '__main__':
    yepf = YepfSpider()
    yepf.main()

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

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

相关文章

SpringBoot+百度地图+Mysql实现中国地图可视化

通过SpringBoot百度地图Mysql实现中国地图可视化 一、申请百度地图的ak值 进入百度开发者平台 编辑以下内容 然后申请成功 二、Springboot写一个接口 确保数据库里有数据 文件目录如下 1、配置application.properties文件 #访问端口号 server.port9090 # 数据库连接信息 spr…

【Vue】响应式特性

响应式&#xff1a;简单理解就是数据改变&#xff0c;视图会自动更新。 如何访问 和 修改 data中的数据&#xff08;响应式演示&#xff09; data中的数据, 最终会被添加到实例上 例如这里&#xff0c;app身上就会拥有msg属性&#xff0c;修改msg的值&#xff0c;界面的值也会…

原生APP开发和Flutter开发的比较

原生APP开发和Flutter开发各有优缺点&#xff0c;适用于不同的场景和需求。下面是两者的详细比较&#xff0c;从开发语言、性能、开发效率、维护和更新、社区和支持等多个方面进行分析。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。…

成功解决“IndexError: queue index out of range”错误的全面指南

成功解决“IndexError: queue index out of range”错误的全面指南 引言 在Python编程中&#xff0c;queue模块提供了同步队列类&#xff0c;包括FIFO&#xff08;先进先出&#xff09;队列Queue&#xff0c;LIFO&#xff08;后进先出&#xff09;队列LifoQueue&#xff0c;以…

uniapp登录成功后跳回原有页面+无感刷新token

uniapp登录成功后跳回原有页面 引言 在C端的页面场景中&#xff0c;我们经常会有几种情况到登录页&#xff1a; 区分需要登录和不用登录的页面&#xff0c;点击需要登录才能查看的页面 已经登录但是超时&#xff0c;用户凭证失效等原因 以上情况可以细分为两种&#xff0c;一…

2023年全国青少信息素养大赛智能算法C++挑战赛复赛初中组真题,包含答案解析分享

【读前注意】:此卷是真题,答案解析辛苦整理,大家多多点赞并转发支持,需要下载空白文档题目版本(包含2023年小学组和初中组的题目pdf文件),可以在留言区的第一条留言的链接中进行复制,然后再浏览器中下载即可。 智能算法挑战复赛初中组 (总共

AngularJS基础语法(2009版本)

jquery和AngularJS 数据绑定和获取对比&#xff1a; jquery&#xff0c;要操作DOM&#xff1a; angularJS&#xff0c;无需操作DOM就可以进行动态数据变化&#xff1a; 要使用Angularjs就需要在html页面先引入&#xff1a; ng-app&#xff1a; html页面中&#xff0c;需要给…

操作系统的体系结构:宏内核和微内核

操作系统的体系结构是一个开放的问题。操作系统在核心态为应用程序提供公共的服务&#xff0c;那么操作系统在核心态应该提供什么服务、怎样提供服务&#xff1f;有关这个问题的回答形成了两种主要的体系结构&#xff1a;宏内核和微内核。 宏内核&#xff1a;大而全 宏内核系统…

【面试题-004】ArrayList 和 LinkList区别

ArrayList 和 LinkedList 都是 Java 中常用的动态数组实现&#xff0c;都实现了 List 接口&#xff0c;但它们在内部数据结构和性能方面有所不同&#xff1a; 内部数据结构&#xff1a; ArrayList 是基于动态数组的数据结构&#xff0c;它允许快速随机访问。数组的大小在创建时…

simCSE句子向量表示(1)-使用transformers API

SimCSE SimCSE: Simple Contrastive Learning of Sentence Embeddings. Gao, T., Yao, X., & Chen, D. (2021). SimCSE: Simple Contrastive Learning of Sentence Embeddings. arXiv preprint arXiv:2104.08821. 1、huggingface官网下载模型 官网手动下载&#xff1a;pri…

【Self-Attention——Transform—Bert】相关的基础理论

1.Self-Attention模型图解 传统的循环神经网络&#xff0c;如上左图1&#xff0c;并不能解决并行化的问题&#xff0c;右图就是一个self-Attention可以实现并行化&#xff0c;并且能解决对于所有信息的读取利用。 将self—Attention替换相应的GRU或者RNN&#xff0c;就能实现从…

C#WPF数字大屏项目实战09--机器产量统计

1、区域布局 2、柱状图 Live chart 是一个跨平台的图表库 .Net&#xff0c;这是一个简单、灵活、交互式、强大的跨平台图表库&#xff0c;支持Maui、Uno Platform、Blazor-wasm、WPF、WinForms、Xamarin、Avalonia、WinUI、UWP。提供超过60多种图表类型&#xff0c;包括&#…

NumPy应用(一)

NumPy学习篇1 NumPy是一个强大的Python库&#xff0c;它提供了高效的多维数组对象和各种用于数组操作的函数。以下是NumPy学习大纲&#xff0c;详细介绍了NumPy的核心功能和概念。 1. NumPy 简介 NumPy是一个用于处理多维数组的Python库&#xff0c;它提供了一个强大的数组对…

【启程Golang之旅】从结构到接口揭秘Go的“面向对象”面纱

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

基于ssm校园自行车租赁系统-计算机毕业设计源码82064

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;学校当然也不例外。基于ssm的校园自行车租赁系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#…

《已解决》F12显示已在程序中暂停

首先打开F12-->源代码 最后一步&#xff1a;

C#WPF数字大屏项目实战08--生产量/良品统计

1、区域划分 生产量/良品统计这部分位于第二列的第二行 2、livechart拆线图 定义折线图,如下: <lvc:CartesianChart> <lvc:CartesianChart.Series> <!--设置Series的类型为 Line 类型, 该类型提供了一些折线图的实现--> <lvc:LineSeries/>…

【安装】VMware虚拟机安装windows操作系统,VM的相关操作

目录 引出报错&#xff1a;press any key to boot form cd激活调整显示 在VMware上新建虚拟机&#xff0c;并安装Windows1、新建虚拟机2、装载 ISO 镜像3、安装Windows server 20164、开机初始化 虚拟机操作1、虚拟机基本操作2、虚拟机快照3、虚拟机克隆4、VMware Tools 总结 引…

vue-标签选择

效果 选中后 代码 <span :class"[item.bealtrue?p_yx_span span_active :span p_yx]" click"onTagSelect(index)" v-for"(item,index) in tagList" :key"index" >{{item.name}} </span> // 列表值 tagList:[ {id: 1, na…

设计模式(九)结构型模式---外观模式

文章目录 外观模式简介结构优缺点UML图具体实现UML图代码实现 外观模式简介 外观模式 &#xff08;Facade Pattern&#xff09;也叫门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。MyBatis的Configurat…