python—selenium爬虫
文章目录
- Selenium与Requests对比
- 一、工作原理
- 二、功能特点
- 三、性能表现
- 下载对应驱动
- 1.首先我们需要打开edge浏览器,打开设置,找到“关于Microsoft Edge”,点击进入查看浏览器版本。
- 2.查找版本之后,搜索edge驱动下载,进入下载页面,选择对应的版本下载就可以。
- 使用Selenium爬取脚本实例
- 1.导入必要的库和模块:
- 2.设置Edge浏览器的无头模式:
- 3.初始化Edge WebDriver:
- 4.访问网页:
- 5.等待页面元素加载:
- 6.查找并遍历列表元素:
- 7.关闭浏览器:
Selenium爬虫与Requests在多个方面存在显著差异,这些差异主要体现在它们的工作原理、功能特点、适用场景以及性能表现上。在某些情况下,我们使用Selenium爬取文本内容更好,这里我们先将其与Requests进行对比。
Selenium与Requests对比
一、工作原理
Requests:
- Requests是一个HTTP库,用于发送各种HTTP请求(如GET、POST等)。
- 它直接发送HTTP请求到服务器,并接收服务器的响应,不涉及浏览器环境的模拟。
Selenium: - Selenium是一个自动化测试工具,通过控制浏览器来模拟用户的各种行为,如点击、滚动、填写表单等。
- 它通过浏览器驱动程序与浏览器进行交互。
二、功能特点
Requests:
- 简单、快速、轻量级,易于使用和集成。
- 主要用于发送HTTP请求和接收响应,适用于静态网页内容的抓取。
- 不具备浏览器自动化功能。
Selenium:
- 功能强大,能够模拟用户与浏览器的所有交互行为。
- 适用于动态网页、单页面应用(SPA)以及需要用户交互的网页内容的抓取。
三、性能表现
Requests:
- 由于不加载JavaScript或CSS等资源,响应时间更短,资源消耗更少。
- 在处理静态网页内容时,性能表现优异。
Selenium:
- 需要加载完整的页面资源,因此速度相对较慢。
- 占用更多的CPU和内存资源,特别是在处理多个浏览器实例或并发请求时。
综上所述,Selenium爬虫与Requests在多个方面存在显著差异。选择哪个工具取决于具体的项目需求、网页类型以及性能要求。对于简单的静态网页内容抓取,Requests可能是更合适的选择;而对于复杂的动态网页、需要用户交互的网页或Web应用程序的抓取,Selenium则更具优势。
下载对应驱动
在使用Selenium之前,我们需要先下载对应浏览器的驱动程序(如 Edge 驱动程序)来与浏览器进行交互。下面我们讲解如何安装驱动。
1.首先我们需要打开edge浏览器,打开设置,找到“关于Microsoft Edge”,点击进入查看浏览器版本。
图例:
2.查找版本之后,搜索edge驱动下载,进入下载页面,选择对应的版本下载就可以。
图例:
下载完成之后,将文件放在含有python的文件夹内(注意一定要放在一个文件夹下),这样我们就可以使用Selenium爬取脚本了。
使用Selenium爬取脚本实例
下面我们使用Selenium库和Edge浏览器(通过Edge WebDriver)来自动化访问网页并抓取数据的Python脚本。
1.导入必要的库和模块:
import time# pip install selenium
# 下载对应版本的驱动 放在python文件下from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.edge.options import Options
- time:用于在代码执行过程中添加延时。
- webdriver从selenium包中导入,用于控制浏览器。
- By从selenium.webdriver.common.by中导入,用于指定元素定位的方式(如XPath、CSS选择器等)。
- expected_conditions(别名EC)和WebDriverWait从selenium.webdriver.support和selenium.webdriver.support.ui中导入,用于设置等待条件,以便在元素可用之前暂停执行。
- Options从selenium.webdriver.edge.options中导入,用于配置Edge浏览器的启动选项,如设置为无头模式。
2.设置Edge浏览器的无头模式:
if __name__ == '__main__':# 无头模式opt = Options()opt.add_argument("--headless")
- 创建Options实例,并通过add_argument(“–headless”)设置浏览器在无头模式下运行,即不显示浏览器界面。
3.初始化Edge WebDriver:
driver = webdriver.Edge(options=opt)
- 使用webdriver.Edge(options=opt)创建Edge WebDriver实例,传入之前配置的选项opt。
4.访问网页:
# 请求页面driver.get('https://101.qq.com/#/hero')
- 使用driver.get(‘https://101.qq.com/#/hero’)访问指定的网页地址。
5.等待页面元素加载:
# 强制等待time.sleep(10)# 等待某个元素加载完成WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,"//ul[@class='hero-list']")))
- 使用WebDriverWait和EC.presence_of_element_located等待页面上某个元素(这里是类名为hero-list的ul元素)出现。这是一种比time.sleep()更智能的等待方式,因为它会等待直到条件满足(元素出现)或达到最大等待时间(这里是10秒)。
6.查找并遍历列表元素:
li_list = driver.find_elements(By.XPATH,"//ul[@class='hero-list']/li")for li in li_list:img_url = li.find_element(By.XPATH,"div/div/img").get_attribute("src")hero_name = li.find_element(By.XPATH,"div/p").textprint(img_url,hero_name)
- 使用find_elements方法通过XPath定位到ul[@class=‘hero-list’]下的所有li元素,并将它们存储在li_list列表中。
- 遍历li_list中的每个li元素,对于每个元素:
- 使用find_element和XPath定位到该li元素内的img标签,并获取其src属性(即图片URL)。
- 同样地,定位到该li元素内的p标签,并获取其文本内容(即英雄名称)。
- 打印出图片URL和英雄名称。
7.关闭浏览器:
driver.close()pass
- 使用driver.close()关闭浏览器。
这段代码演示了如何使用Selenium和Edge WebDriver来自动化访问一个网页,等待页面上的特定元素加载完成,然后抓取该页面上特定列表项中的图片URL和文本内容。
相关文章:

python—selenium爬虫
文章目录 Selenium与Requests对比一、工作原理二、功能特点三、性能表现 下载对应驱动1.首先我们需要打开edge浏览器,打开设置,找到“关于Microsoft Edge”,点击进入查看浏览器版本。2.查找版本之后,搜索edge驱动下载,…...

Mysql - 索引
目录 一、存储引擎 二、索引 索引结构 索引分类 索引语法 联合索引 前缀索引 索引使用规则 最左前缀法则 范围查询使索引失效 字段做运算操作索引失效 字符串字段不加单引号索引失效 字段做前模糊查询索引失效 or连接条件索引失效 数据发布情况索引失效 指定使用…...

从课本上面开始学习的51单片机究竟有什么特点,在现在的市场上还有应用吗?
引言 51单片机,作为一种经典的微控制器,被广泛应用于各种嵌入式系统中。尽管如今ARM架构的高性能低成本单片机在市场上占据主导地位,但51单片机凭借其独特的优势依然在某些领域保持着应用价值。本文将深入探讨51单片机的特点、架构、应用以及…...

uniapp中出现Uncaught runtime errors
项目中运行出现上面的错误信息,使用uniapp发现,其实我只是跨域了,控制台报错,但是不想屏幕上显示; 解决办法是在vue.config.js增加如下配置即可 devServer: {client: {overlay: false,errors:true},}, 错误信息也不想…...

数字信号处理基础知识(二)
在介绍完“离散时间序列”基本概念和性质后,实际上就已经踏入了“数字信号处理”这门学科的学习征程,这篇文章里主要去说明“线性时不变系统”的定义概念和探讨“周期采样”的注意细节,相信更加理解这些概念定义和底层逻辑,对于大…...
人生低谷来撸C#--015 C# 属性(Property)
1、概念 在C#中,属性(Property)是一种特殊的成员,它提供了一种灵活的机制来访问和修改对象的状态(即类的字段)。属性结合了字段和方法的特性,使得数据的访问和修改更加安全和便捷。下面我用一个…...
面试题003:面向对象的特征——封装性
Java规定了4种权限修饰,分别是:private、缺省、protected、public。我们可以使用4种权限修饰来修饰类及类的内部成员。当这些成员被调用时,体现可见性的大小。 封装性在程序中的体现: 场景1:私有化(private)类的属性,提供公共(pub…...

森林防火,森林防火智能储水罐_鼎跃安全
森林防火是保护森林的重要措施,每年发生的森林火灾都严重威胁着自然安全,对社会经济和生态造成严重的破坏。为了切实有效地预防并扑灭森林火灾,森林防火智能储水罐已成为现代森林防火体系中的重要装备。 储水罐内置传感器和控制系统ÿ…...

虚幻引擎,体积雾、体积光、镜头泛光
1、体积雾 这里介绍的是用于地面的体积雾效果,效果如图1-1: 图1-1 首先,需要场景中存在指数级高度雾并开启体积雾(如图1-2)。然后创建材质,材质域选择“体积”,混合模式选择“Additive”。材质节…...

Python 机器学习求解 PDE 学习项目——PINN 求解二维 Poisson 方程
本文使用 TensorFlow 1.15 环境搭建深度神经网络(PINN)求解二维 Poisson 方程: 模型问题 − Δ u f in Ω , u g on Γ : ∂ Ω . \begin{align} -\Delta u & f \quad & \text{in } \Omega,\\ u & g \quad & \text{on } \Gamma:\p…...
微信小程序删除滑块 SwiperCell 自动收起 Van weapp van-swipe-cell 滑块自动收起 点击页面也自动收起滑块
在当前页面整个 view 中 给页面绑定 点击事件bindtap"onSwipeCellPage"给 van-swipe-cell 组件设置 id (for循环可以添加 id"swip-cell-{{item.id}}" )van-swipe-cell 组件 添加属性 当用户打开滑块时触发 bind:open"swiperCel…...

【vluhub】log4j注入漏洞 CVE-2021-44228
LOG4介绍 是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布 log4j存在远程代码执行漏洞、受影响版本2.x 部署环境 攻击机环境:192.168.3.180 kail环境:192.168.203.12【NAT…...

Redis核心技术与实战学习笔记
Redis核心技术与实战学习笔记 最近想沉下心来看下redis,买了蒋德钧老师的《Redis 核心技术与实战》,这里记录一些学习笔记 希望能够坚持下去有想一起学习的童鞋,可以点击跳转到文章尾部获取学习资源,仅供学习不要用于任何商业用途!!! redis知识全景图 …...

力扣经典题目之->设计循环队列 的超详细讲解与实现
一:题目 二:思路讲解 前提: a:本文采取数组来实现队列去解决题目 b:开辟k1个空间,front指向队首,rear指向队尾的后一个,rear这样会更好的判空和判满 以下根据pop和push感受满和空…...

【数据结构】排序算法——Lesson2
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...

Ubuntu编译ffmpeg并添加cmake工程
文章目录 前言前提须知为什么要自己编译 FFmpeg前提软件包与工具的安装编译ffmpeg写CMakeList.txt包含ffmpeg到我们项目中 总结 前言 FFmpeg 是一个领先的多媒体框架,能够解码、编码、转码、复用、解复用、流化、过滤和播放几乎所有人类和机器创造的内容。FFmpeg 包…...
Vue.js[组件(Component)]
什么是: 拥有专属的HTML,CSS,数据的,可重用的页面独立区域 一个页面由多个组件聚合而成一个大型的页面 在代码层面上,一个组件就是一个可反复使用的自定义标签。 vs jq插件 vs boot组件 boot插件: 虽然可重用,但仍需…...

基于微信小程序+SpringBoot+Vue的校园自助打印系统(带1w+文档)
基于微信小程序SpringBootVue的校园自助打印系统(带1w文档) 基于微信小程序SpringBootVue的校园自助打印系统(带1w文档) 管理信息可以处理复杂的信息从而提高用户的工作效率,减少失误。所以本基于Vue和微信小程序的校园自助打印系统的开发非常有意义,本系…...
qt设置过滤器
1.创建事件过滤器类,在主窗口中安装事件过滤器 class PasteFilter : public QObject {Q_OBJECTpublic:PasteFilter(QObject *parent nullptr) : QObject(parent) {}protected:bool eventFilter(QObject *obj, QEvent *event) override {if (event->type() QEv…...

线上环境服务器CPU飙升排查
前因 收到线上服务器CPU使用率100%的告警信息。 环境 jdk1.8CentOS Linux ;CentOS Linux 排查 查看服务器CPU使用率 果然cpu已经达到了100%了 命令 top 使用arthas工具 使用方式 arthas 执行命令java -jar arthas-boot.jar 然后执行命令 thread 看到有两个…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...