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

【selenium】

selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的。Selenium可以直接调用浏览器,它支持所有主流的浏览器。其本质是通过驱动浏览器,完成模拟浏览器操作,比如挑战,输入,点击等。

下载与打开

下载链接:CNPM Binaries Mirror

找到与自己的谷歌浏览器版本最接近的。

然后点击下载里面win32.zip即可

05b8cd85179248da9c1f2f33f944662a.png下载的压缩包解压完成后的内容放到python的安装路径。

python安装路径:可以运行一个空的py文件,第一行的第一个路径就是你的python解释器安装路径

cmd命令提示符中:pip install selenium==3.141.0

卸载:pip uninstall 模块名

from selenium import webdriver
# 导入其中的webdriver来驱动浏览器
url = "https://www.baidu.com/"
# 启动谷歌浏览器
driver = webdriver.Chrome()
# 在地址栏输入网址
driver.get(url)

可以打开网页了。

不过可能会报错。根据报错内容查看是哪里出现了问题:

  • 问题一:下载的selenium与urllib3不兼容
    • 解决方式:cmd中输入pip install selenium==3.141.0pip install urllib3==1.26.2
  • 问题二:谷歌浏览器与下载的chromedriver驱动版本不一致
    • 解决方式:右上角三个点--帮助--关于--找到自己浏览器的版本,再对应下载驱动

浏览器对象

get(url=url):地址栏--输入url地址并确认

page_source:HTML结构源码

maxmize_window:浏览器窗口最大化

quit():关闭浏览器窗口

from selenium import webdriver
# 导入其中的webdriver来驱动浏览器
url = "https://www.baidu.com/"
# 启动谷歌浏览器
driver = webdriver.Chrome()
# 在地址栏输入网址
driver.get(url)
driver.maximize_window()    # 将浏览器窗口最大化
print(driver.page_source)    # 打印请求头
driver.quit()      # 关掉浏览器

Selenium定位元素

from selenium.webdriver.common.by import By

  • find_element(By.ID, '根据标签id属性进行定位')
  • find_element(By.NAME, '根据标签name属性进行定位')
  • find_element(By.CLASS_NAME, '根据标签class属性进行定位')
  • find_element(By.XPATH, '根据xpath语法进行定位')
  • find_element(By.CSS_SELECTOR, '根据css语法进行定位')
  • find_element(By.LINK_TEXT, '根据标签文本内容进行定位')
from selenium import webdriver
from selenium.webdriver.common.by import Byurl = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()driver.find_element(By.ID, "kw").send_keys("CSDN")    # 在搜索框上输入CSDN
driver.find_element(By.ID, 'su').click()     # 点击搜索

无界面模式

from selenium import webdriver

options = webdriver.ChromeOptions()

# 添加无界面参数

options.add_argument('--headless')

browser = webdriver.Chrome(options=options)

import timefrom selenium import webdriver
from selenium.webdriver.common.by import Byurl = "https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_4f2b917133dd438ab114acdc46cd0f2c"options = webdriver.ChromeOptions()
# 添加无界面参数
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)driver.get(url)
driver.execute_script("window.scrollTo(500, document.body.scrollHeight)"
)
time.sleep(2)
li_list = driver.find_elements(By.XPATH, '//div[@id="J_feeds"]/ul/li')i = 0
for li in li_list:print(li.text)print('*'*30)i += 1
print(i)     # *

 打开新窗口和切换页面

通过excute_script()来执行js脚本的形式来打开新窗口。

window.excute_script("window.open('https://www.douban.com')")

打开新窗口后driver当前的页面依然是之前的。

如果想获取新窗口的源代码,就必须先切换过去 :

window.switch_to.window(driver.window_handles[1])

from selenium import webdriver
url = 'https://www.baidu.com/'
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()js = 'open("https://www.douban.com/")'
driver.execute_script(js)print(driver.page_source)     # 获取到的是百度页面的信息
driver.quit()

切换:

from selenium import webdriver
url = 'https://www.baidu.com/'
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()js = 'open("https://www.douban.com/")'
driver.execute_script(js)driver.switch_to_window(js)
# print(driver.window_handles)
print(driver.page_source)
driver.quit()
import time
from selenium import webdriver
from selenium.webdriver.common.by import Byclass JdSpider():def __init__(self):self.url = 'https://search.jd.com/Search?keyword=%E6%95%B0%E7%A0%81&enc=utf-8&wq=%E6%95%B0%E7%A0%81&pvid=34b0fcf7ed434840a74c057bc97be346'self.driver = webdriver.Chrome()def get_url(self):self.driver.get(self.url)self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")time.sleep(2)li_list = self.driver.find_elements(By.XPATH, '//div[@id="J_goodsList"]/ul/li')detail_urls = []for li in li_list:a = li.find_element(By.XPATH, './/a')detail_urls.append(a.get_attribute('href'))for detail_url in detail_urls:js = f'open("{detail_url}")'self.driver.execute_script(js)self.driver.switch_to_window(self.driver.window_handles[1])time.sleep(2)self.get_detail()self.driver.close()self.driver.switch_to_window(self.driver.window_handles[0])def get_detail(self):print('获取详情')name = self.driver.find_element(By.CSS_SELECTOR, 'body > div:nth-child(10) > div > div.itemInfo-wrap > div.sku-name').textprint(name)if __name__ == '__main__':spider = JdSpider()spider.get_url()       # *

selenium-iframe

网页中嵌套了网页,先切换到iframe,再执行其他操作

切换到要处理的iframe

browaer.switch_to.frame(frame节点对象)

from selenium import webdriver
from selenium.webdriver.common.by import By
import infosurl = 'https://douban.com/'driver = webdriver.Chrome()
driver.get(url)iframe = driver.find_element(By.XPATH, '//div[@class="login"]/iframe')
# print(iframe)driver.switch_to.frame(iframe)    # 切进来
# 点击密码登录
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/ul[1]/li[2]').click()
# 输入账号密码
driver.find_element(By.XPATH, '//*[@id="username"]').send_keys(infos.username)
driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(infos.username)
# 点击登录
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div[5]/a').click()

验证码处理

数字验证码:

img = driver.find_element(By.XPATH, '复制验证码所在代码段的XPATH(右击--copy)')

img.screenshot("1.png")     # 将图片截取下来

【网站:www.ttshitu.com---登录--开发文档--python--可以找到相应代码】

def base64_api(uname, pwd, img, typeid):with open(img, 'rb') as f:base64_data = base64.b64encode(f.read())b64 = base64_data.decode()data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)if result['success']:return result["data"]["result"]else:return result["message"]
img_path = "1.jpg"
result = base64_api(uname='你的账号', pwd='你的密码', img=img_path, typeid=3)
print(result)     # 记得导包

滑动验证码: 

button = driver.find_element(By.CSS_SELECTOR, '复制验证码所在代码的CSS路径')action = ActionChains(driver)
action.click_and_hold(button).perform()    # 点击且不松开action.move_by_offset(int(result) - 30, 0)     # 滑块与左边框距离30
action.release().perform()

selenium翻页操作

取到第一页数据:

from selenium import webdriver
from selenium.webdriver.common.by import Byurl = 'https://www.maoyan.com/board/4?offset=0'driver = webdriver.Chrome()
driver.get(url)driver.maximize_window()dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')for dd in dds:print(dd.text.split('\n'))print('-'*30)

翻页爬取:

from selenium import webdriver
from selenium.webdriver.common.by import Byurl = 'https://www.maoyan.com/board/4?offset=0'option = webdriver.ChromeOptions()
option.add_argument('--headless')    # 加上这两句就不会弹出页面了(无头模式),,当然也可以不添加driver = webdriver.Chrome()
driver.get(url)driver.maximize_window()dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')def get_data():"""一页的数据"""dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')for dd in dds:print(dd.text.split('\n'))print('-' * 30)while True:get_data()try:driver.find_element(By.LINK_TEXT, '下一页').click()    # 点击下一页的文本except Exception as e:    # 做异常处理,数据爬取100个后就没有下一页,会报错的print(e)print('数据爬取完成')    # 没有下一页代表完成driver.quit()break

 操作cookie

获取cookie:driver.get_cookies()

根据cookie的key获取value:value=driver.get_cookie(key)

删除所有的cookie:driver.delete_all_cookies()

删除某个cookie:driver.delete_cookie(key)

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import infosurl = 'https://douban.com/'driver = webdriver.Chrome()
driver.get(url)iframe = driver.find_element(By.XPATH, '//div[@class="login"]/iframe')
# print(iframe)driver.switch_to.frame(iframe)    # 切进来
# 点击密码登录
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/ul[1]/li[2]').click()
# 输入账号密码
driver.find_element(By.XPATH, '//*[@id="username"]').send_keys(infos.username)
driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(infos.password)
# 点击登录
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div[5]/a').click()time.sleep(20)
cookies = driver.get_cookies()cookies_dict = {}
for cookie in cookies:name = cookie['name']value = cookie['value']cookies_dict[name] = valueurl = 'https://douban.com/'import requestsheaders = {'User-Agent': '# 将User-Agent复制过来' 
}
print(requests.get(url, cookies=cookies_dict, headers=headers).text)    # 获取到登陆后的数据

隐式等待和显式等待 

隐式等待:指定一个时间,在这个时间内会一直处于等待状态。使用:driver.implicitly_wait

显式等待:指定在某个时间内,如果某个条件满足了,就不会在等待。使用:from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 隐式等待:后续的标签定位都会建立在5秒之内
# 后续的某个标签在5秒内加载出来就进行爬取,否则继续下一页
driver.implicitly_wait(5)# 显式等待:针对某一个标签定位
WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.LINK_TEXT, "地图"))
).click()

 

 

相关文章:

【selenium】

selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的。Selenium可以直接调用浏览器,它支持所有主流的浏览器。其本质是通过驱动浏览器,完成模拟浏览器操作,比如挑战,输入,点击等。 下载与打…...

HX711压力传感器学习一(STM32)

目录 原理图:​ 引脚介绍: HX711介绍工作原理: 程序讲解: 整套工程: 发送的代码工程,与博客的不一致,如果编译有报错请按照报错和博客进行修改 原理图: 引脚介绍: VCC和GND引…...

作业2.13

1、选择题 1.1、若有定义语句:int a[3][6]; ,按在内存中的存放顺序,a 数组的第10个元素是 D A)a[0][4] B) a[1][3] C)a[0][3] D)a[1][4] 1.2、有数组 int a[5] {10,20,30,40,50},…...

ArcGIS学习(七)图片数据矢量化

ArcGIS学习(七)图片数据矢量化 通过上面几个任务的学习,大家应该已经掌握了ArcGIS的基础操作,并且学习了坐标系和地理数据库这两个非常重要且稍微难一些的专题。从这一任务开始,让我们进入到实战案例板块。 首先进入第一个案例一一图片数据矢量化。 我们在平时的工作学…...

G口大流量服务器选择的关键点有哪些?

G口服务器指的是接入互联网的带宽达到1Gbps以上的服务器,那么选择使用G口大流量服务器的用户需要注意哪些选择 关键点呢?小编为您整理关于G口大流量服务器的关键点。 G口服务器通常被用于需要大带宽支持的业务场景,比如视频流媒体、金融交易平台、电子商…...

MongoDB聚合:$unset

使用$unset阶段可移除文档中的某些字段。从版本4.2开始支持。 语法 移除单个字段&#xff0c;可以直接指定要移除的字段名&#xff1a; { $unset: "<field>" }移除多个字段&#xff0c;可以指定一个要移除字段名的数组&#xff1a; { $unset: [ "<…...

DS Wannabe之5-AM Project: DS 30day int prep day14

Q1. What is Alexnet? Q2. What is VGGNet? Q3. What is VGG16? Q4. What is ResNet? At the ILSVRC 2015, so-called Residual Neural Network (ResNet) by the Kaiming He et al introduced the anovel architecture with “skip connections” and features heavy b…...

【程序设计竞赛】C++与Java的细节优化

必须强调下&#xff0c;以下的任意一种优化&#xff0c;都应该是在本身采用的算法没有任何问题情况下的“锦上添花”&#xff0c;而不是“雪中送炭”。 如果下面的说法存在误导&#xff0c;请专业大佬评论指正 读写优化 C读写优化——解除流绑定 在ACM里&#xff0c;经常出现…...

Java缓冲流——效率提升深度解析

前言 大家好&#xff0c;我是chowley&#xff0c;在我之前的项目中&#xff0c;用到了缓冲流来提高字符流之间的比较速度&#xff0c;缓冲流的主要作用类似于数据库缓存&#xff0c;提高IO操作效率。 缓冲流 在Java的输入输出操作中&#xff0c;缓冲流是提高性能的重要工具之…...

16 亚稳态原理和解决方案

1. 亚稳态原理 亚稳态是指触发器无法在某个规定的时间段内到达一个可以确认的状态。在同步系统中&#xff0c;输入总是与时钟同步&#xff0c;因此寄存器的setup time和hold time是满足的&#xff0c;一般情况下是不会发生亚稳态情况的。在异步信号采集中&#xff0c;由于异步…...

C# OCR识别图片中的文字

1、从NuGet里面安装Spire.OCR 2、安装之后&#xff0c;找到安装路径下&#xff0c;默认生成的packages文件夹&#xff0c;复制该文件夹路径下的 6 个dll文件到程序的根目录 3、调用读取方法 OcrScanner scanner new OcrScanner(); string path "C:\1.png"; scann…...

使用python-numpy实现一个简单神经网络

目录 前言 导入numpy并初始化数据和激活函数 初始化学习率和模型参数 迭代更新模型参数&#xff08;权重&#xff09; 小彩蛋 前言 这篇文章&#xff0c;小编带大家使用python-numpy实现一个简单的三层神经网络&#xff0c;不使用pytorch等深度学习框架&#xff0c;来理解…...

CSS定位装饰

网页常见布局方式 标准流 块级元素独占一行---垂直布局 行内元素/行内块元素一行显示多个----水平布局 浮动 可以让原本垂直布局的块级元素变成水平布局 定位 可以让元素自由的摆放在网页的任意位置 一般用于盒子之间的层叠情况 使用定位步骤 设置定位方式 属性名&am…...

java之jvm详解

JVM内存结构 程序计数器 Program Counter Register程序计数器(寄存器) 程序计数器在物理层上是通过寄存器实现的 作用&#xff1a;记住下一条jvm指令的执行地址特点 是线程私有的(每个线程都有属于自己的程序计数器)不会存在内存溢出 虚拟机栈(默认大小为1024kb) 每个线…...

vue3学习——集成sass

安装 pnpm i sass sass-loader -D在vite.config.ts文件配置: export default defineConfig({css: {preprocessorOptions: {scss: {javascriptEnabled: true,additionalData: import "./src/styles/variable.scss";,},},},} }创建三个文件 src/styles/index.scss //…...

开关电源学习之Boost电路

如果我们需要给一个输入电压为5V的芯片供电&#xff0c;而我们只有一个3.3V的电源&#xff0c;那怎么办&#xff1f; 我们能不能把3.3V的电压升到5V&#xff1f; 一、电感的简介 而在升压的电路设计方案中&#xff0c;使用到一个重要的元器件&#xff1a;电感。 电感的特性…...

QRegExp的学习

【QT学习】QRegExp类正则表达式&#xff08;一文读懂&#xff09;-CSDN博客 [ ]:匹配括号内输入的任意字符 例&#xff1a;[123]:可以是1或2或3 {m&#xff0c;n}表达式至少重复m次&#xff0c;至多重复n次。 例&#xff1a;"ba{1,3}"可以匹配 "ba"或&…...

28.Stream流

Stream流 1. 概述2. 方法2.1 开始生成方法2.1.1 概述2.1.2 方法2.1.3 代码示例 2.2 中间操作方法2.2.1 概述2.2.2 方法2.2.3 代码示例 2.3 终结操作方法2.3.1 概述2.3.2 方法2.3.3 代码示例 2.4 收集操作方法2.4.1 概述2.4.2 方法2.4.3 代码示例 3. 代码示例14. 代码示例25. 代…...

大数据应用对企业的价值

目录 一、大数据应用价值 1.1 大数据技术分析 1.2 原有技术场景的优化 1.2.1 数据分析优化 1.2.2 高并发数据处理 1.3 通过大数据构建新需求 1.3.1 智能推荐 1.3.2 广告系统 1.3.3 产品/流程优化 1.3.4 异常检测 1.3.5 智能管理 1.3.6 人工智能和机器学习 二、大数…...

【51单片机】LED点阵屏(江科大)

9.1LED点阵屏 1.LED点阵屏介绍 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。 2.LED点阵屏工作原理 LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已。原理图如下 每一行的阳极连在一起,每一列…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...