python爬虫10:selenium库

python爬虫10:selenium库

前言

​ python实现网络爬虫非常简单,只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点,方便以后复习。

申明

​ 本系列所涉及的代码仅用于个人研究与讨论,并不会对网站产生不好影响。

目录结构

文章目录

    • python爬虫10:selenium库
      • 1. 概述与安装
        • 1.1 概述
        • 1.2 安装
      • 2. 基本使用
        • 2.1 声明浏览器对象
        • 2.2 访问页面
        • 2.3 关闭访问页面和浏览器:
        • 2.4 查找节点方法:
        • 2.5 节点交互:
        • 2.6 动作链:
        • 2.7 获取网页信息和节点信息:
        • 2.8 执行js代码:
        • 2.9 切换Frame:
        • 2.10 延时等待:
        • 2.11 切换窗口
      • 3. 总结

1. 概述与安装

1.1 概述

​ selenium其实严格来说并不属于爬虫库,而是用于测试的库,不过这里我们就拿来当作爬虫库来用就行。

​ selenium相比于其他的爬虫库而言,更加综合,其既可以请求,也可以解析,并且过程是可视化的,即请求的时候,你可以看见程序打开浏览器,然后按照你设定的步骤进行

1.2 安装

​ selenium的安装以前比较麻烦,需要自己去安装浏览器驱动,但是现在最新版本的selenium已经不需要我们自己装驱动了,当你运行代码的时候,会自动检测安装。

​ 因此,只需要安装:

pip install selenium 

​ 可以用下面代码测试浏览器驱动是否安装(谷歌浏览器):

# 导包
from selenium import webdriver

# 浏览器初始化
driver = webdriver.Chrome()
# 打开百度
driver.get('https://www.baidu.com')
# 打印源码
print(driver.page_source)
# 关闭
driver.quit()

​ 其运行过程就是自动打开浏览器并打开百度搜索页面,然后返回源码。

2. 基本使用

2.1 声明浏览器对象

​ 使用selenium,首先需要声明浏览器对象,除去我之前使用的chrome浏览器,还支持:Firefox、Edge等等,但是一般常用的是chrome浏览器,所以这里我只给出chrome浏览器的声明方法,其他的声明方法都类似,只需要修改浏览器名称即可。

# 导包
from selenium import webdriver

# 声明浏览器对象
driver = webdriver.Chrome()

2.2 访问页面

​ 这里不分什么get或者post,统一的只有get方法。语法如下:

driver.get(url)
# 示例:
driver.get('https://www.baidu.com')

2.3 关闭访问页面和浏览器:

# 关闭访问页面和浏览器
driver.close()
# 关闭驱动
driver.quit()

2.4 查找节点方法:

​ 查找单个节点:

作用:只返回第一个匹配的节点。

​ 方法如下:driver.find_element()

​ 常用参数:

1. by
	需要导入from selenium.webdriver.common.by import By
	指定获取元素的方式,常见的如:By.NAME(标签name属性获取)、By.ID(标签id属性获取)、By.CLASS_NAME(标签class属性获取)、By.TAG_NAME(标签名字获取)、By.XPATH(通过xpath语法获取)、By.CSS_SELECTOR(通过css选择器获取)......

2. value
	配合上面的by参数,填写相应的值即可

查找多个节点

​ 方法名只是多了一个s,变为了driver.find_elements(),参数都是一样的。

2.5 节点交互:

​ 常用的节点交互有两种:输入与点击,这也是我们在浏览器中最常用的两种了。方法分别如下:

# 输入内容
xxx.send_keys('内容')# xxx代表着一个节点
xxx.clear()	#清除输入的内容
# 点击
xxx.click()

​ 下面给大家一个案例: 打开百度,输入python并且点击搜索按钮进行搜索,之后再删除python,搜索java

# 导包
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 浏览器声明
driver = webdriver.Chrome()
# 打开百度
driver.get('https://www.baidu.com')
# 获取输入框节点
input_tag = driver.find_element(by=By.CLASS_NAME,value='s_ipt')
# 获取搜索按钮
search_tag = driver.find_element(by=By.XPATH,value='//input[@id="su"]')
# 输入python
input_tag.send_keys('python')
# 点击按钮
search_tag.click()
# 暂停2秒
time.sleep(2)
# 清楚python
input_tag.clear()
# 输入java
input_tag.send_keys('java')
# 搜索
search_tag.click()
# 暂停2秒
time.sleep(2)
# 退出
driver.close()
driver.quit()

​ 运行结果如下动图所示:

在这里插入图片描述

2.6 动作链:

​ 有些动作,如:拖拽、键盘按键等,没有具体的某个节点,这种方式就需要动作链来执行,你可以这样理解:你首先声明一个动作链对象,然后这个对象将一条一条的执行你写的代码。

​ 这个方面需要大家自行查找官方文档,因为这个我日常用的不多,对于自己来说,也许只有破解验证码的时候才用得上,但是现在的验证码破解越来越难了,所以我基本上用不到这块。

2.7 获取网页信息和节点信息:

网页信息

网页源码:

方法: driver.page_source
作用:获取网页源码

网页标题:

方法:driver.title
作用:获取网页标题

节点信息:下面的xxx指的是的某个节点标签

获取属性:

方法: xxx.get_attribute('属性名字')
作用: 获取属性值
说明: xxx代表着节点

获取文本:

方法: xxx.text
作用: 获取文本值

获取其他信息:

​ 获取id:

xxx.id

​ 获取节点名称:

xxx.tag_name

​ 获取节点在页面中的位置:

xxx.location	(这个还是很有用的,对于滑动验证的验证码可以使用)

​ 获取节点大小(宽和高):

xxx.size

2.8 执行js代码:

​ 之前的功能,如:输入内容,点击按钮等,其他库可以使用其他方式实现,但是执行js代码确实selenium一个强大的功能。

​ 比如:我们有时候爬取动态渲染的网页,如:百度图片,我们鼠标向下滑动,越来越多的图片加载出来,这就是动态渲染,或者我们有时候看见的“更多”(有些内容显示不全,点更多可以在当前页面查看全部内容)都是动态渲染,我们可以使用js代码模拟实现。

​ 这个方面考察大家的js功底,如果不会的朋友也不用紧张,如果你需要啥功能可以在网上搜索,将网页的js代码拷贝下来即可。

​ 语法如下:

driver.execute_script('js代码')

​ 代码演示;(效果:直接滑动到网页底部)

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 浏览器声明
driver = webdriver.Chrome()
# 打开一个网页
driver.get('https://tieba.baidu.com/f?kw=%B6%B7%CD%BC&fr=ala0&tpl=5')
# 执行js代码
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(5)
# 关闭
driver.close()
driver.quit()

​ 结果演示:

在这里插入图片描述

2.9 切换Frame:

​ 网页标签中有一个标签叫做frame标签,相当于一个子网页,而使用selenium打开网页默认在父级frame里面,因此想要获取子frame中的内容需要切换frame,方法如下:

driver.switch_to.frame(frame_reference=id或者name)

2.10 延时等待:

​ selenium打开网页,有时候需要注意网速是否良好,因为有时候你没有获取想要获取的信息就是因为网速不好。

​ 除去使用time模块中的等待外,我们还可以使用selenium自带的延时等待。

隐式等待:

​ 当查找的节点没有第一时间出现时,会等待指定时间后再来获取。

​ 方法如下:

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 浏览器声明
driver = webdriver.Chrome()
# 延时等待
driver.implicitly_wait(10)  # 如果没有找到元素,等待10秒中
# 找元素
driver.find_element(by=By.TAG_NAME,value='div')

显示等待::

​ 隐式等待效果并不好,因为如果在等待过程中加载出来了我们需要的标签,但是我们仍然得等待一定的时间。因此,我们需要更好的等待方式----显示等待。

​ 作用:它指定最长等待时间,如果在这个时间内加载出来了节点,则直接获取节点,或则抛出超时异常。

​ 方法如下:

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 浏览器声明
driver = webdriver.Chrome()
# 显示等待
# 创建等待对象
wait = WebDriverWait(driver,10) #第二个参数是最大等待时间
tag = wait.until(EC.presence_of_element_located((By.ID,'q'))) # 这个作用:直到获取到id为q的节点

​ EC除去presence_of_element_located外,还有很多条件,具体的可以见官方库,但是使用方法都是这样。

2.11 切换窗口

​ 有时候,我们用selenium请求了第一个网页后,又再次请求一个新的网页(或者你在第一个网页点击了某个按钮跳转到新网页),此时selenium权柄还停留在第一个网页,而我们想要获取第二个网页的信息,就需要切换权柄。

​ 方法如下:

driver.window_handles   # 查看所有的窗口权柄,返回一个列表,按照先后顺序出值
driver.current_window_handle	# 当前的窗口权柄,和上面的可以对应看
driver.switch_to.window(xxx)	# 切换窗口权柄,里面的xxx可以这么写 driver.window_handles[x](其中x为索引),具体的代码演示可以看下一篇的案例

3. 总结

​ 本篇讲解了selenium的基础操作,由于selenium并不单单可以用于爬虫,还可以用于测试这个工作,因此其内容还有很多我们并没有涉及,这一点就需要靠大家根据自己的实际需求进行学习了。

​ 下一篇进行实战讲解。

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

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

相关文章

【Linux】多线程概念线程控制

文章目录 多线程概念Linux下进程和线程的关系pid本质上是轻量级进程id,换句话说,就是线程IDLinux内核是如何创建一个线程的线程的共享和独有线程的优缺点 线程控制POSIX线程库线程创建线程终止线程等待线程分离 多线程概念 Linux下进程和线程的关系 在…

adb使用总结

adb连接到模拟器 adb devices 打开模拟器,找到设置。 多次点击版本号,切换到开发者模式 搜索进入开发者选项 开启USB调试 此时在终端输入adb devices就连接上了 使用adb查看安卓手机架构 adb shell getprop ro.product.cpu.abi 进入安卓手机的shell …

流处理详解

【今日】 目录 一 Stream接口简介 Optional类 Collectors类 二 数据过滤 1. filter()方法 2.distinct()方法 3.limit()方法 4.skip()方法 三 数据映射 四 数据查找 1. allMatch()方法 2. anyMatch()方法 3. noneMatch()方法 4. findFirst()方法 五 数据收集…

一分钟学会用pygame制作棋盘背景

一分钟一个Pygame案例,这一集我们来学习一下如何生成一个视频中的棋盘背景效果,非常非常简单。 视频教程链接:https://www.bilibili.com/video/BV17G411d7Ah/ 当然我们这里是用来做页面的背景,你也可以拿来做别的效果&#xff0…

origin导出pdf曲线超出边框

软件版本 软件版本Word2021Origin2021Adobe Acrobat Pro2023 问题描述 Origin导出的emf格式矢量图片,插入到Word中,显示正常,但是在使用Word导出→创建Adobe PDF→创建Adobe PDF导出PDF文件后,图片曲线就会超出边框&#xff0c…

5G NR:RACH流程-- Msg1之生成PRACH Preamble

随机接入流程中的Msg1,即在PRACH信道上发送random access preamble。涉及到两个问题: 一个是如何产生preamble?一个是如何选择正确的PRACH时频资源发送所选的preamble? 一、PRACH Preamble是什么 PRACH Preamble从数学上来讲是一个长度为…

考研408 | 【操作系统】 内存管理

内存的基础 内存和内存的作用: 几个常用的数量单位: 指令的工作原理: 问题:如何将指令中的逻辑地址转换为物理地址? 解决办法:装入的三种方式 1.绝对装入 2.可重定位装入 3.动态重定位 从写程序到程…

TabBar组件如何跳转页面?

1、先引入 2、假数据 const tabs [{key: home,title: 首页,icon: <AppOutline />,badge: Badge.dot,},{key: todo,title: 待办,icon: <UnorderedListOutline />,badge: 5,},{key: message,title: 消息,icon: (active: boolean) >active ? <MessageFill /&…

Django基础5——ORM中间程序

文章目录 一、基本了解二、ORM基本操作2.1 连接数据库2.1.1 使用sqlite数据库2.1.2 使用MySQL数据库 2.2 对数据库操作2.2.1 增&#xff08;前端数据——>数据库&#xff09;2.2.2 查&#xff08;数据库——>前端展示&#xff09;2.2.3 改&#xff08;修改数据&#xff0…

如何评估分类模型的好坏

如何评估分类模型的好坏 评估分类预测模型的质量&#xff0c;常用一个矩阵、三条曲线和六个指标。 一个矩阵&#xff1a;混淆矩阵&#xff1b;三条曲线&#xff1a;ROC曲线、PR曲线、KS曲线&#xff1b;六个指标&#xff1a;正确率Acc、查全率R、查准率P、F值、AUC、BEP值、KS…

行业报告 | 2023人工智能发展白皮书

原创 | 文 BFT机器人 在科技日新月异的今天&#xff0c;人工智能已成为最具革命性的技术之一&#xff0c;有望对人类社会生活产生显著的影响。过去几年&#xff0c;人工智能相关理论研究技术创新、软硬件升级等整体推进&#xff0c;极大地促进了人工智能行业的发展。 进入2022…

盖雅工场获评2023年度苏州市服务型制造示范企业(平台)

苏州市工信局公布 2023年度苏州市服务型制造示范企业&#xff08;平台&#xff09;名单 遴选出服务型制造示范企业34家 服务型制造示范平台19个 苏州盖雅信息技术有限公司 “劳动力管理SaaS云平台服务” 获评2023年度苏州市服务型制造示范平台 全市唯一获评的人力资源服务…

【rust/egui】(五)看看template的app.rs:SidePanel、CentralPanel以及heading

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 SidePanel 侧边栏&#xff0c;如下图 …

UG\NX二次开发 使用BlockUI设计对话框时,如何设置默认的开发语言?

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C++,Qt-CSDN博客 简介: NX二次开发使用BlockUI设计对话框时,如何设置默认的代码语言? 效果: 方法: 依次打开“文件”->“实用工具”->“用户默认设置”->“用户界面”->“操作记录”->“…

Java接口(interface)

接口&#xff08;interface&#xff09;明确了描述类被授权了哪些能力&#xff0c;但不会指定具体的方式。实现类&#xff08;implement&#xff09;一个或多个接口。–>使类完成了实现&#xff0c;是一种对于行为规范的准则的抽象。 个体的方法可以在子类中自写展现&#…

ES6中promise的使用

ES6中promise的使用 本文目录 ES6中promise的使用基础介绍箭头函数function函数状态 原型方法Promise.prototype.then()Promise.prototype.catch() 静态方法Promise.all()Promise.race()Promise.any() 链式回调 基础介绍 官网&#xff1a;https://promisesaplus.com/ window.…

k8s 安装istio (一)

前置条件 已经完成 K8S安装过程十&#xff1a;Kubernetes CNI插件与CoreDNS服务部署 部署 istio 服务网格与 Ingress 服务用到了 helm 与 kubectl 这两个命令行工具&#xff0c;这个命令行工具依赖 ~/.kube/config 这个配置文件&#xff0c;目前只在 kubernetes master 节点中…

【IO进程线程】使用标准IO函数完成用户的登录和注册

1 实现登录功能 自定义一个usr.txt&#xff0c;先手动输入其账户密码。 格式&#xff1a;账户 密码 例&#xff1a; zhangsan 12345 lisi abcde wangwu abc123 需求如下&#xff1a; 1. 从终端获取账户密码&#xff0c;与文件中的账户密码比较&#xff1b; 2. 若终端输入的账户…

SpeedBI数据可视化工具:丰富图表,提高报表易读性

数据可视化工具一大作用就是能把复杂数据可视化、直观化&#xff0c;更容易看懂&#xff0c;也就更容易实现以数据驱动业务管理升级&#xff0c;因此一般的数据可视化工具都会提供大量图形化的数据可视化图表&#xff0c;以提高报表的易懂性&#xff0c;更好地服务企业运营决策…

websocket和uni-app里使用websocket

一、HTTP是无状态协议 特点&#xff1a; 1、浏览器发送请求时&#xff0c;浏览器和服务器会建立一个连接。完成请求和响应。在http1.0之前&#xff0c;每次请求响应完毕后&#xff0c;会立即断开连接。在http1.1之后&#xff0c;当前网页的所有请求响应完毕后&#xff0c;才断…