当前位置: 首页 > news >正文

Python的selenium爬取

1.selenium

1.1.前言

使用python的requests模块还是存在很大的局限性,例如:只发一次请求;针对ajax动态加载的网页则无法获取数据等等问题。特此,本章节将通过selenium模拟浏览器来完成更高级的爬虫抓取任务。

1.2.什么是selenium

Selenium是一个用于自动化Web应用程序测试的开源工具集。它提供了一组API和工具,可以与多种编程语言一起使用,如Java、Python、C#等,用于模拟用户在浏览器中的行为,如点击、填写表单、提交数据等。Selenium可以运行在各种浏览器上,包括Chrome、Firefox、Safari等,它还可以与多个测试框架和开发工具集成,如JUnit、TestNG、Maven等。

1.3.组成

Selenium的核心组件是WebDriver,它可以直接与浏览器进行交互,并模拟用户操作。WebDriver提供了一系列的方法和命令,可以控制浏览器的打开、页面导航、元素查找、交互操作等。使用Selenium,开发人员可以编写自动化测试脚本,以验证Web应用程序的功能和性能,并自动运行这些脚本进行回归测试。

除了WebDriver,Selenium还包含其他辅助工具,如Selenium IDE(集成开发环境)和Selenium Grid(分布式测试工具),它们提供了更多的功能和扩展性,以满足不同的测试需求。

总之,Selenium是一个功能强大的自动化测试工具,可用于模拟用户在浏览器中的行为,以及验证和测试Web应用程序的功能和性能。

1.4.特点

  • 开源、免费

  • 多浏览器支持:FireFox、Chrome、IE、Opera、Edge;

  • 多平台支持:Linux、Windows、MAC;

  • 多语言支持:Java、Python、Ruby、C#、JavaScript、C++;

  • 对Web页面有良好的支持;

  • 简单(API 简单)、灵活(用开发语言驱动);

  • 支持分布式测试用例执行。

2.通过selenium模拟浏览器的抓取

2.1.下载与导入

点击 File -> Settings -> 选择项目:python12中的Python解析器,再点击 + 按钮,输入selenium,选择指定的版本,最后点击安装包(I)即可。

注意:这里下载的selenium 4.0.0,不要下载高版本,怕出问题,与4.0.0一致即可。

新建python文件,导入selenium中的webdriver:

from selenium from webdriver

2.2.下载webDriver

新版本的浏览器请使用此处地址:Chrome for Testing availability

下载对应浏览器的webDriver,例如:Chrome浏览器对应的webDriver

注意:一定要下载浏览器对应版本的webDriver,如果没有完全对应的,可以下载接近版本的webDriver。

将下载chromedriver_win32.zip解压,并将其内的chromedriver.exe复制到Python安装目录下的Scripts目录中。

2.3.基本使用

from selenium import webdriver
​
# 使用Chrome谷歌的webDriver
driver = webdriver.Chrome()
# 模拟get请求抓取jd网站
driver.get("https://www.jd.com")

Firefox:

driver = webdriver.Firefox()

Safari:

driver = webdriver.Safari()

Edge:

driver = webdriver.Edge()

2.4.元素查找

使用find_element方法查找元素。可以使用各种定位方式,例如通过ID、类名、标签名等。

方法说明
find_element_by_name通过ID查找元素
find_element_by_xpath通过XPath查找元素
find_element_by_tag_name通过标签名查找元素
find_element_by_class_name通过类名查找元素
find_element_by_css_selector通过CSS选择器查找元素

注意:多个元素的查找只需要将element改为elements即可。

# 通过ID查找元素
element = driver.find_element_by_id("J_searchbg")
print(element.text)
# 通过标签名查找
element = driver.find_element_by_tag_name("input")
print(element.get_attribute("aria-label"))
# 通过css样式查找
elements = driver.find_element_by_class_name("button")
print(elements.get_attribute("aria-label"))

注意:element.text用于获取元素的文本内容;element.get_attribute()用于获取元素的属性值。

2.5.模拟用户操作

方法说明
clear清楚元素内容
send_keys("值")模拟按键输入
click单击元素,触发元素的点击事情
submit提交表单

案例演示:如何模拟JD商城搜索指定商品信息

import time
from selenium import webdriver
​
driver = webdriver.Chrome();
driver.get("https://search.jd.com/Search?keyword=手机")
​
# 获取输入框
val = driver.find_element_by_id("key")
# 清空输入框的条件
val.clear()
# 重新设置查询条件
val.send_keys("电脑")
# 获取查询按钮并触发点击事件
btn = val.parent.find_element_by_css_selector("button.button.cw-icon")
btn.click()
# 睡眠3秒
time.sleep(3)
# 滚动到页面底部
# driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 睡眠3秒
# time.sleep(3)
# 循环获取网页中电脑的名称
names = driver.find_elements_by_css_selector("#J_goodsList > ul > li > div > div.p-name.p-name-type-2 > a > em")
for name in names:print("【电脑】--",name.text)

2.6.优化操作

无头模式:不打开浏览器

import time
​
from selenium import webdriver
​
options = webdriver.ChromeOptions()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)
driver.get("https://search.jd.com/Search?keyword=手机")

案例演示:模拟点击frame窗口中的按钮

import timefrom selenium import webdriverdriver = webdriver.Chrome()
driver.get("https://search.jd.com/Search?keyword=手机")# 点击用户图标
user = driver.find_element_by_class_name("tab-ico")
user.click()
# 睡眠2秒
time.sleep(2)
# 先要获取弹开的子窗口frame
frame = driver.find_element_by_id("dialogIframe")
# 切换到子窗口
driver.switch_to.frame(frame)
# 在获取子窗口中的QQ登录按钮
driver.find_element_by_css_selector("a.pdl").click()

相关文章:

Python的selenium爬取

1.selenium 1.1.前言 使用python的requests模块还是存在很大的局限性,例如:只发一次请求;针对ajax动态加载的网页则无法获取数据等等问题。特此,本章节将通过selenium模拟浏览器来完成更高级的爬虫抓取任务。 1.2.什么是seleniu…...

Linux--进程间通信(1)(匿名管道)

目录 1.了解进程通信 1.1进程为什么要通信 1.2 进程如何通信 1.3进程间通信的方式 2.管道 2.1管道的初步理解 2.2站在文件描述符的角度-进一步理解管道 2.3 管道的系统调用接口(匿名管道) 2.3.1介绍接口函数: 2.3.2编写一个管道的代…...

Hive环境搭建

1 安装Hive 下载文件 # wget -P /opt/ https://mirrors.huaweicloud.com/apache/hive/hive-2.3.8/apache-hive-2.3.8-bin.tar.gz 解压缩 # tar -zxvf /opt/apache-hive-2.3.8-bin.tar.gz -C /opt/ 修改hive文件夹名字 # mv /opt/apache-hive-2.3.8-bin /opt/hive 配置环境变量 …...

网络编程基础(四)

目录 前言 二、多点通信 2.1 单播 2.2 广播 2.2.1 广播得发送端实现--》类似与UDP的客户端 2.3 组播 2.3.1 组播发送端流程--》类似于UDP的客户端流程 2.3.2 组播的接收端流程---》类似于UDP的服务器端流程 前言 多点通信 一、套接字选项得获取和设置 int getsockopt(int…...

将C++ cv:mat 通过JNI 转换为jbtyearray,传到android端

cv::Mat result ; //此处为C获取到的cv::mat结果对象// 编码为JPEG格式std::vector<uchar> buf;cv::imencode(".jpg", result, buf);// 创建一个新的jbyteArray并设置其大小jbyteArray array env->NewByteArray(buf.size());if (array NULL) {// 处理内存…...

WannaCry勒索软件(CVE-2017-0144)

WannaCry 永恒之蓝 在2017年5月&#xff0c;WannaCry勒索软件爆发了一场全球性的网络安全危机&#xff0c;迅速感染了超过200,000台计算机&#xff0c;波及150多个国家。从医疗保健系统到政府机构&#xff0c;无数组织面临数据被加密和赎金要求的双重威胁。本文将提供关于Wann…...

JavaScript(ES5) 入门

01-简介 1)JavaScript 发展史 [1] 1995年,navigator(导航者),netscape(网景);用户体验性特别好 [2] 表单验证难题,表单验证都是在后台处理.当时处在网速特别慢的时代,发送一个请求,接收响应 需要5分钟左右的时候提高表单验证的速度,想开发一种语言在前端进行表单验证. [3] 1995…...

趣店集团golang一面要个20K,Channel什么情况下会出现死锁,有遇到过吗?

结束后面试官加了VX&#xff0c;并询问方便二面的时间&#xff0c;一直还没回复&#xff0c;拖着拖着给忘啦... 面试题 1、自我介绍 2、你在团队里头负责哪一块&#xff0c;这个物流开放平台流量多大 3、为什么今年3月份被从物流开放团队转到了finance财务部门&#xff0c;感…...

智能化乙级资质延期,行业标准的坚守

智能化乙级资质延期&#xff1a;行业标准的坚守 一、引言 智能化乙级资质是企业在智能化工程设计与施工领域的重要认证&#xff0c;它代表了企业的技术实力和专业水平。为确保企业能够持续满足行业标准&#xff0c;保持竞争力&#xff0c;智能化乙级资质的延期管理显得尤为重要…...

d20(184-190)-勇敢开始Java,咖啡拯救人生

目录 网络通信 网络通信三要素&#xff08;IP地址&#xff0c;端口号&#xff0c;协议 IP地址 InetAddress 端口号 协议 传输层的两个通信协议 UDP通信 java.net.Datagramsocket类 客户端 服务端 UDP通信多收多发 客户端 服务端 TCP通信 java.net.Socket类 客…...

Python 登录表单处理

分析&#xff1a; 处理登录表单以便爬⾍能够抓取需要认证的⽹⻚数据&#xff0c;通常需要模拟登录过程。这可以通过发送带有⽤⼾凭证的POST请求到登录表单的URL来实现。为了保持登录状态&#xff0c;需要处理和保存会话中的 cookies。Python的 requests 库可以⽅便地处理这些任…...

2024.05.27学习记录

1、面经复习&#xff1a; 实际工作经验章节 2、代码随想录刷题&#xff1a;动态规划剩下部分和单调栈 3、rosebush 组件库完成Input 和 AutoComplete部分内容...

BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上

BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上 引言 在跟进hwc_layer是如何产生的&#xff0c;并如何被填充上GraphicBuffer的&#xff0c;怎么也找不到被填充的GraphicBuffer的来源&#xff0c;最终找到了&#xff0c;它的来源是客户端的…...

48、spfa求最短路

spfa求最短路 题目描述 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出1号点到n号点的最短距离&#xff0c;如果无法从1号点走到n号点&#xff0c;则输出impossible。 数据保证不存在负权回路。 输入格式 第一行包…...

安装PyTorch详细步骤

&#x1f4a5;注意事项&#xff1a; CPU版和GPU版选一个进行安装即可 如果有Nvidia显卡&#xff0c;则安装cuda版本的PyTorch&#xff0c;如没有nvidia显卡&#xff0c;则安装cpu版。 目前常见的深度学习框架有很多&#xff0c;最出名的是&#xff1a;PyTorch&#xff08;faceb…...

linux线程,线程控制与线程相关概念

线程概念 线程这个词或多或少大家都听过&#xff0c;今天我们正式的来谈一下线程&#xff1b; 在我一开始的概念中线程就是进程的一部分&#xff0c;一个进程中有很多个线程&#xff0c;这个想法基本是正确的&#xff0c;但细节部分呢我们需要细细讲解一下&#xff1b; 什么…...

第八大奇迹

目录 题目描述 输入描述 输出描述 输入输出样例 示例 输入 输出 运行限制 原题链接 代码思路 题目描述 在一条 R 河流域&#xff0c;繁衍着一个古老的名族 Z。他们世代沿河而居&#xff0c;也在河边发展出了璀璨的文明。 Z 族在 R 河沿岸修建了很多建筑&#xff0c…...

MySQL:CRUD初阶(有图有实操)

文章目录 &#x1f4d1;1. 数据库的操作&#x1f324;️1.1 显示当前的数据库&#x1f324;️1.2 创建数据库&#x1f324;️1.3 选中数据库&#x1f324;️1.4 删除数据库 &#x1f4d1;2. 表的操作&#x1f324;️2.1 查看表结构&#x1f324;️2.2 创建表&#x1f324;️2.3…...

『大模型笔记』使用 vLLM 和 PagedAttention 快速提供 LLM 服务!

使用 vLLM 和 PagedAttention 快速提供 LLM 服务! 文章目录 一. 使用 vLLM 和 PagedAttention 快速提供 LLM 服务!1.1. PagedAttention二. 参考文献小红书中文字幕视频:https://www.xiaohongshu.com/explore/66502b60000000000500433e官网文档(推荐,里面有动图解释):vLLM:…...

简述vue-loader是什么?使用它的用途有哪些

vue-loader是一个webpack的加载器(loader)&#xff0c;主要用于将Vue组件的单文件(.vue文件)转换为JavaScript模块。使用vue-loader的主要用途包括&#xff1a; 解析.vue文件&#xff1a;vue-loader能够解析.vue文件中的模板、样式和脚本&#xff0c;并将它们分离出来进行处理…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...