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

python:selenium爬取网站信息

关注我,精彩不错过!

前言

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

什么是selenium

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

组成

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

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

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

特点

  • 开源、免费

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

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

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

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

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

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

通过selenium模拟浏览器的抓取

下载与导入

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

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

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

from selenium import webdriver

下载webDriver

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

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

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

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

基本使用

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()

元素查找

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

方法说明
find_element_by_id通过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()用于获取元素的属性值。

模拟用户操作

方法说明
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)

优化操作

无头模式:不打开浏览器

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 time
​
from selenium import webdriver
​
driver = 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爬取网站信息

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

Nginx版本平滑迁移方案

Nginx版本平滑迁移方案 最可靠方案:make install后,先-s stop再重启,100%确保版本切换特殊情况:当发现nginx.pid.oldbin文件时,才考虑使用USR2信号无损升级避坑重点:make install只是替换文件,…...

WPF 按钮悬停动画效果实现

WPF 按钮悬停动画效果实现 下面我将实现一个专业的按钮悬停动画效果&#xff1a;当鼠标悬停在按钮上时&#xff0c;按钮上的文字由黑色变为白色&#xff0c;同时加粗并变大。 完整实现方案 MainWindow.xaml <Window x:Class"ButtonHoverEffect.MainWindow"xml…...

满天星之canvas实现【canvas】

展示 文章目录 展示Canvas 介绍【基础】简介兼容性关键特性注意事项应用场景&#xff1a;基本示例 满天星代码实现【重点】代码解释 全量代码【来吧&#xff0c;尽情复制吧少年】html引入JS代码 参考资源 Canvas 介绍【基础】 简介 Canvas是一个基于HTML5的绘图技术&#xff0…...

我在架构师面前谈 Spring Inner Beans,他直接点头说:这人有料!

“你听说了吗?阿里、字节最近的Java面试题又加难了!” “嗯?咋了?” “Spring又被拿出来问了,这次居然问到了Inner Beans!” “这不是冷门题吗?” “是啊,我一开始还真没答上来……” 是的!今天要跟大家唠嗑的,就是这个在面试中悄悄冒头,但平时开发中却经常被我们忽…...

Java无序数组 vs 有序数组:性能对比与选型指南

在Java中选择使用无序数组还是有序数组&#xff0c;需根据具体的应用需求和操作特性进行权衡。以下是从不同维度分析的详细对比及建议&#xff1a; 一、核心操作的性能对比 操作无序数组有序数组插入/追加O(1)&#xff08;直接尾部插入&#xff09;O(n)&#xff08;需移动元素…...

【Linux 基础知识系列】第二篇-Linux 发行版概述

一、什么是 Linux 发行版&#xff1f; Linux 发行版是指将 Linux 内核和应用程序、工具、库等有机组合在一起&#xff0c;形成一个完整的操作系统。由于 Linux 的开源特性&#xff0c;任何人都可以在 Linux 内核的基础上进行修改和定制&#xff0c;因此产生了许多不同的发行版…...

【开源解析】基于PyQt5+Folium的谷歌地图应用开发:从入门到实战

&#x1f310;【开源解析】基于PyQt5Folium的谷歌地图应用开发&#xff1a;从入门到实战 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热情源自每…...

在 Ubuntu 22.04 LTS 上离线安装 Docker

在 Ubuntu 22.04 LTS 上离线安装 Docker 一、准备工作 1.1 获取目标系统信息 在目标 Ubuntu 22.04 LTS 系统上&#xff0c;先执行以下命令确认架构信息&#xff1a; uname -m lsb_release -a一般返回如下信息&#xff1a; 1.2 需要一台可联网的机器 准备一台可以连接互联网…...

python调用langchain实现RAG

一、安装langchain 安装依赖 python -m venv env.\env\Scripts\activatepip3 install langchainpip3 install langchain-corepip3 install langchain-openaipip3 install langchain-communitypip3 install dashscopepip3 install langchain_postgrespip3 install "psyc…...

Qt 中的 d-pointer 与 p-pointer小结

Qt 中的 d-pointer 与 p-pointer&#xff1a; PIMPL 惯用法解析 在 Qt 库中&#xff0c;尤其是在其核心类和模块中&#xff0c;广泛使用了 PIMPL (Pointer to IMPLementation&#xff0c;指向实现的指针) 的编程惯用法。这种模式通过一对指针来实现&#xff1a;d-pointer (d_p…...

冷库耗电高的一种重要原因分析,以及一种降低冷库电费≥20%的方法

1.冷库耗电高的原因分析 1.1化霜不及时 固定周期化霜&#xff1a;传统定时化霜模式&#xff08;如每日2次&#xff09;未考虑实际结霜量&#xff0c;导致无效化霜&#xff08;霜层薄时仍启动化霜&#xff09;&#xff0c;浪费大量电能。 化霜时间过长&#xff1a;化霜加热器…...

理解 Redis 事务-21(使用事务实现原子操)

使用事务实现原子操作 Redis 事务是一种在单个步骤中执行一组命令的机制。"要么全部&#xff0c;要么全部不"的方法确保了数据的一致性和完整性&#xff0c;尤其是在需要对相关数据进行多个操作时。没有事务&#xff0c;并发操作可能会导致竞争条件和不一致的数据状…...

神经网络加上注意力机制,精度反而下降,为什么会这样呢?注意力机制的本质是什么?如何正确使用注意力机制?注意力机制 | 深度学习

在深度学习的发展中,注意力机制的引入曾被誉为一次划时代的技术飞跃。无论是在自然语言处理领域产生Transformer架构,还是在图像识别、语音识别和推荐系统等多个方向取得显著成效,注意力机制的价值似乎毋庸置疑。然而,在一些实际应用场景中,研究人员和工程师却发现:在传统…...

触控精灵 ADB运行模式填写电脑端IP教程

•ADB模式&#xff0c;如果你手机已经root则可以直接运行&#xff0c;无需安装电脑端。 •ADB模式&#xff0c;如果你手机没有root&#xff0c;那你可以windows电脑下载【极限投屏】软件&#xff0c;然后你的手机和电脑的网络要同一个wifi&#xff0c;然后把你电脑的ip地址填写…...

uniapp|实现多端图片上传、拍照上传自定义插入水印内容及拖拽自定义水印位置,实现水印相机、图片下载保存等功能

本文以基础视角,详细讲解如何在uni-app中实现图片上传→水印动态编辑→图片下载的全流程功能。 目录 引言应用场景分析(社交媒体、内容保护、企业素材管理等)uniapp跨平台开发优势核心功能实现​图片上传模块多来源支持:相册选择(`uni.chooseImage`)与拍照(`sourceType:…...

linux有效裁剪视频的方式(基于ffmpeg,不改变分辨率,帧率,视频质量,不需要三方软件)

就是在Linux上使用OBS Studio录制一个讲座或者其他视频&#xff0c;可能总有些时候会多录制一段时间&#xff0c;但是如果使用剪映或者PR这样的工具在导出的时候总需要烦恼导出的格式和参数&#xff0c;比如剪映就不支持mkv格式的导出&#xff0c;导出成mp4格式的视频就会变得很…...

服务器密码安全运维解决新思路:凭据管理SMS+双因素SLA认证结合的方案

引言&#xff1a;云服务器安全成本困局 在云计算渗透率突破60%的今天&#xff0c;中小企业正面临严峻的安全悖论&#xff1a;某权威机构数据显示&#xff0c;72%的云上数据泄露事件源于凭据管理不当&#xff0c;而传统安全解决方案的采购成本往往超过中小企业年利润的8%。这种…...

论文阅读笔记——In-Context Edit

ICEdit 论文阅读笔记 指令图像编辑现有方法的局限&#xff1a; 微调类方法&#xff08;InstructPix2Pix、Emu Edit、 Ultra Edit&#xff09;&#xff1a;需要大规模数据和算力、精度高但效率低且泛化性低&#xff1b;免训练方法&#xff08;Prompt-to-Prompt、 StableFlow&am…...

Debian 系统 Python 开发全解析:从环境搭建到项目实战

Debian 系统 Python 开发全解析:从环境搭建到项目实战 在当今数字化时代,Python 凭借其简洁易读的语法和强大的功能,成为了最受欢迎的编程语言之一。Debian 作为一款稳定、安全且开源的 Linux 操作系统,为 Python 开发提供了理想的环境。本文将详细介绍在 Debian 系统上进…...

Next.js 15 与 Apollo Client 的现代集成及性能优化

Next.js 15 与 Apollo Client 的现代集成及性能优化 目录 技术演进集成实践性能优化应用案例未来趋势 技术演进 Next.js 15 核心特性对开发模式的革新 Next.js 15 通过引入 App Router、服务器组件&#xff08;Server Components&#xff09;和客户端组件&#xff08;Clie…...

【后端高阶面经:MongoDB篇】41、MongoDB 是怎么做到高可用的?

一、MongoDB高可用核心架构&#xff1a;副本集&#xff08;Replica Set&#xff09;设计 &#xff08;一&#xff09;副本集角色与拓扑结构 1. 三大核心角色 角色职责描述资源占用选举权重数据存储Primary唯一接收写请求的节点&#xff0c;将操作日志&#xff08;Oplog&…...

IO Vs NIO

一、IO(传统阻塞式) 全称‌&#xff1a;Input/Output(输入/输出) 定义‌&#xff1a;Java 1.0 引入的基础 I/O 模型&#xff0c;基于流&#xff08;Stream&#xff09;的同步阻塞操作&#xff0c;线程在读写数据时会阻塞直到操作完成。 二、NIO(新式非阻塞式) ‌全…...

offset 家族和 client 家族

在前端开发中&#xff0c;offset 家族和 client 家族是用于获取元素尺寸和位置的重要属性集合。以下是对这两个家族相关知识点的系统总结&#xff1a; 一、offset 家族 核心属性 offsetWidth / offsetHeight 含义&#xff1a;元素的总尺寸&#xff0c;包含内容区、内边距、边…...

DMBOK对比知识点整理(4)

1.常见数据质量维度 常见数据质量维度(DMBOK-P353)质量维度...

day12 leetcode-hot100-21(矩阵4)

240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; 1.暴力法O(m*n) 思路&#xff1a;两层for循环即可。 2.二分查找O(m*logn) 思路&#xff1a;每行都用二分查找,因为每行都是排好序的 class Solution {public boolean searchMatrix(int[][] matrix, int targe…...

Java基础 Day24

一、进程和线程 1、进程 &#xff08;1&#xff09;概念 进程 (Process) 是计算机中的程序关于某数据集合上的一次运行活动 是系统进行资源分配的基本单位 简单理解&#xff1a;程序的执行过程&#xff08;正在运行的应用程序&#xff09; &#xff08;2&#xff09;特性…...

提问:鲜羊奶是解决育儿Bug的补丁吗?

在育儿这个"系统工程"中&#xff0c;过度提醒就像冗余代码&#xff1a;"快写作业"&#xff08;重复调用&#xff09;、"多穿衣服"&#xff08;异常捕获&#xff09;、"别玩手机"&#xff08;进程阻断&#xff09;。羊大师技术育儿实验…...

关于数据仓库、数据湖、数据平台、数据中台和湖仓一体的概念和区别

我们谈论数据中台之前&#xff0c; 我们也听到过数据平台、数据仓库、数据湖、湖仓一体的相关概念&#xff0c;它们都与数据有关系&#xff0c;但他们和数据中台有什么样的区别&#xff0c; 下面我们将围绕数据平台、数据仓库、数据湖和数据中台的区别进行介绍。 一、相关概念…...

Hive 分桶(Bucketing)深度解析:原理、实战与核心概念对比

一、分桶的意义&#xff1a;比分区更细的粒度管理 1.1 解决分区数据不均匀问题 分区的局限性&#xff1a;分区基于表外字段&#xff08;如时间字段&#xff09;划分数据&#xff0c;但可能导致部分分区数据量过大&#xff0c;部分过小&#xff0c;无法进一步细化。 分桶的定…...