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 Optionsclass 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 Optionsclass 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)# 隐式等待10sself.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 Optionsclass 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_sourceself.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()

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

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

相关文章

第一周 数据结构与算法以及复杂度分析

数据结构与算法 算法定义 算法&#xff08;algorithm&#xff09;是在有限时间内解决特定问题的一组指令或操作步骤&#xff0c;它具有以下特性。 1.问题是明确的&#xff0c;包含清晰的输入和输出定义。 2.具有可行性&#xff0c;能够在有限步骤、时间和内存空间下完成。 3.…

【第五节】C++的多态性与虚函数

目录 前言 一、子类型 二、静态联编和动态联编 三、虚函数 四、纯虚函数和抽象类 五、虚析构函数 六、重载&#xff0c;重定义与重写的异同 前言 面向对象程序设计语言的三大核心特性是封装性、继承性和多态性。封装性奠定了基础&#xff0c;继承性是实现代码重用和扩展…

Linux内网中安装jdk1.8详细教程

本章教程,主要介绍如何在内网环境中配置JDK1.8环境变量 一、下载Linux版压缩包 下载地址:https://www.oracle.com/java/technologies/downloads/#java8 下载完成之后,通过XFTP等工具,将安装包上传到内网服务器 二、安装配置步骤 1、解压压缩包 tar -zxvf /usr/local/jdk-…

根据PDF模版填充数据并生成新的PDF

准备模版 使用 福昕高级PDF编辑器 &#xff08;本人用的这个&#xff0c;其他的也行&#xff0c;能作模版就行&#xff09;打开PDF文件点击 表单 选项&#xff0c;点击 文本域在需要填充数据的位置设计文本域设置 名称、提示名称相当于 属性名&#xff0c;提示就是提示&#x…

基于SSM的“基于Apriori算法的网络书城”的设计与实现(源码+数据库+文档)

基于SSM的“基于Apriori算法的网络书城”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 网站功能展示图 首页 商品分类 热销 新品 我的订单 个…

二位偏序,P3660 [USACO17FEB] Why Did the Cow Cross the Road III G

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 P3660 [USACO17FEB] Why Did the Cow Cross the Road III G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 二、解题报告 1、思路分析 二维偏序问题 我们将坐标按照第一维排序 然后树状数组维护区间内的…

【深度学习】【STWave】时空图预测,车流量预测,Efficient Spectral Graph Attention Network

Spatio-Temporal meets Wavelet: Disentangled Traffic Flow Forecasting via Efficient Spectral Graph Attention Network 代码&#xff1a;https://github.com/LMissher/STWave 论文&#xff1a;https://arxiv.org/abs/2112.02740 帮助&#xff1a; https://docs.qq.com/s…

C++STL---vector模拟实现

通过上篇文章&#xff0c;我们知道vector的接口实际上和string是差不多的&#xff0c;但是他俩的内部结构却大不一样&#xff0c;vector内有三个成员变量&#xff1a;_start、_finish、_endofstorage: _start指向容器的头元素&#xff0c;_finish指向有效元素末尾的元素&#x…

Vue2 + Element UI 封装 Table 递归多层级列表头动态

1、在 components 中创建 HeaderTable 文件夹&#xff0c;在创建 ColumnItem.vue 和 index.vue。 如下&#xff1a; 2、index.vue 代码内容&#xff0c;如下&#xff1a; <template><div><el-table:data"dataTableData"style"width: 100%"…

OSM历史10年(2014-2024)全国数据下载(路网、建筑物、POI、水系、地表覆盖利用······)

点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 零、前沿 这次向大家介绍一下OSM&#xff08;OpenStreetMap&#xff09;十年历史数据&#xff08;2014—2014&#xff09;的下载方法。当然我们也下载好分享给大家&#xff…

JAVA web期末复习总结

C/S结构与B/S结构区别&#xff1a; 在C/S结构中&#xff0c;客户端通常是一个独立的应用程序&#xff0c;需要在用户的计算机上安装和运行。而在BS结构中&#xff0c;客户端是一个Web浏览器&#xff0c;用户只需要通过浏览器打开网页&#xff0c;不需要安装额外的应用程序。 C…

程序员上岸指南

如果你还在996&#xff0c;大小周&#xff0c;感觉身体被掏空&#xff0c;那么你可以看看下面这篇文章&#xff0c;我特意搜集了一些苦逼程序员的上岸教程。 人生真的就是做几道选择题&#xff0c;选错了&#xff0c;忙也是瞎忙。选对了&#xff0c;躺着都能赢。总的来说&#…

良心推荐:什么软件能够监控公司电脑,就这5款软件能监控公司电脑

用软件监控员工电脑在大多数国家是非法的&#xff0c;不过在中国&#xff0c;企业在办公场所安装监控设备以监控员工工作&#xff0c;在遵循一定限制和条件的前提下&#xff0c;是合法的。以下是一些符合这些条件&#xff0c;并且广泛被企业采用的员工电脑监控软件的良心推荐&a…

C++:儿童节快乐呀!

六一快乐&#xff01;~ 今天我来宣布一个 ——————Cookie Maker工作室成立了&#xff01;—————— 目前参与人数&#xff1a;7 人名列单&#xff1a; 真实姓名 联系方式以及用户名 ZINCFFO CSDN&#xff08;ZINCFFO&#xff09; &…

使用 Scapy 库编写 IP 地址欺骗攻击脚本

一、介绍 1.1 概述 IP地址欺骗&#xff08;IP Spoofing&#xff09;是一种网络攻击技术&#xff0c;攻击者伪造其数据包的源IP地址&#xff0c;使其看起来像是从其他合法地址发送的。这种技术常用于各种攻击中&#xff0c;例如DDoS攻击、Man-in-the-Middle&#xff08;MITM&a…

buidldroot musl uclib库 编译

buildroot 修改 编译工具链 原本编译器相关信息&#xff1a; Incorrect selection of the C library buidroot编译 注意相关选项&#xff0c;后续使用CUSTOM TOOLCHAIN 时对应 UCLIB 能将生成IMAGE 从2.9K变为2.3K MUSL 能将生成IMAGE 从2.9K变为2.7K 变大了 arm-linux-…

c++的string一键介绍

前言&#xff1a; 这篇文章旨在帮助读者回忆如何使用string&#xff0c;并提醒注意事项。它不是一篇详细的功能介绍&#xff0c;而是一篇润色文章。 先展示重载函数&#xff0c;如果该函数一笔不可带过&#xff0c;就先展示英文原档&#xff08;附带翻译&#xff09;&#xf…

教你搞一个比较简单的计时和进度条装饰器

教你搞一个比较简单的计时和进度条装饰器 什么是装饰器为啥要用装饰器呢&#xff1f;上代码&#xff01;如何使用装饰器效果 什么是装饰器 装饰器的英文是&#xff1a;Decorator。装修的英文是&#xff1a;Decoration。顾名思义就是我们要用装饰器在函数func()上搞点儿事儿&am…

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

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

htb_BoardLight

信息收集 nmap -sSVC 10.10.11.11开放80端口&#xff0c;将boardlight.htb写入/etc/hosts 同步进行子域名和目录扫描 子域名扫不到 这个目录扫描很奇怪哈&#xff0c;明明访问80端口有页面&#xff0c;就是扫不出来 直接浏览器访问80端口&#xff0c;四处看看&#xff0c;发…