带Cookies信息操作页面(Selenium)

文章目录

  • 一、Cookie介绍
  • 二、使用Selenium获取Cookies信息(登入)
  • 三、带Cookies操作页面(Selenium)
  • 四、带Cookies操做页面(session)
  • 五、自动登入(验证处理)
    • 1、超级鹰(图片验证码)

一、Cookie介绍

通常在发起请求登入之后,再次发起请求又恢复为未登入状态,即第一次请求的登入信息不会保存至第二次请求中,如果要在第二次请求中共使用第一次的登入信息,这里就需要使用到Cookie。Cookie是用来让服务端记录客户端的相关状态。session可以进行请求的发送,如果请求产生了Cookie,则该Cookie会被自动存储在该session中

二、使用Selenium获取Cookies信息(登入)

selenium可以对页面进行自动化操作,在碰到需要登入信息的时候,一般开始自动化时没有登入信息,可以使用selenium模块提前将登入的相关信息打印出来或者使用文件保存起来,在下一次使用的时候,读取使用该信息,加入进去,在selenium对网页发起请求时,就已经包含了账户信息,具体的操作如下

首先,我们写入一段程序,获取登入信息,这里一般是直接请求到登入界面,使用扫码或某种方式登入,操作完成之后将获取的信息打印出来,或者将信息保存为文件,在下一次使用的时候将读取其文件。这里注意,在打印登入信息之前(Cookies)一定要给定足够的延时,以足够你完成登入操作,如果没有延时或者延时过短,打印信息时可能还是未登入的信息(Cookies)。(很多网站为了安全,获得的Cookies登入信息一般都有一定的时效性,一般不会长期有效

from selenium import webdriver
from selenium.webdriver.common.by import By
import timebrowser = webdriver.Chrome()
# 需要请求的网址,这里一般可以直接请求登入界面,接着发出get请求
url = 'https://www.xxx.cn/resources/login.html'
browser.get(url)# 此时,就是看你怎么登入,要么输入信息登入,要么跳转至某界面扫码登入,这个自行解决
# 我选择扫码登入,此处使用Xpath定位查找点击跳转至扫码登入界面,然后click函数自动点击,就会跳转至Xpath界面,这里直接手动点入跳转也可
login = browser.find_element(By.XPATH, '//*[@id="toolbar_Div"]/div[2]/div[2]/ul/li[2]/a')
login.click()
# 注:此处一定要留够充足的时间,以足够完成登入操作,确保后面获取的Cookies登入信息为登入信息是登入状态的,如果没有下面延时或者延时不充足,可能导致获取的Cookies信息还是未登入的状态,影响后期使用
time.sleep(10)# 获取登入信息(Cookies),将其打印出来,或者保存为文件
cookies = browser.get_cookies()
print(cookies)

如果将其界面化,这个可以封装为一个函数,将某个按钮绑定该函数,点击时,即可触发,然后完成操作,将登入信息保存为全局变量,在界面上做其他操作时,可使用该全局变量。

三、带Cookies操作页面(Selenium)

这里将上面获取的Cookies信息复制过滤,赋值给下面cookies变量,然后使用add_cookie将其加入,如果操作时切换到了新的窗口,则需要使用switch_to.window切换至新的界面,如果网站随机使用两种方案,可以使用try except使用两种方案进行解析

import selenium.common.exceptions
from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 首先正常创建对象,对某网址发起请求,这里的请求不包含登入信息
q = webdriver.Chrome()
q.get('https://www.xxx.cn/index.html')
time.sleep(1)# 这里将上面打印的用户信息(Cookies)复制过来,是一个列的格式,列表里面为字典,使用for循环将cookies一项一项的加入进入
cookies = []
for cookie in cookies:q.add_cookie(cookie)
time.sleep(1)# 接着对需要请求的网站发起请求,此处的请求已经包含了登入信息
q.get('https://www.xxx.cn')# 接着对该网站操作(如输入、清除、单击等)
star = q.find_element(By.XPATH, '//*[@id="fromStationText"]')   # 定位输入框(此处为Xpath)
star.clear()                                                    # 对定位的输入框清除原有内容
star.send_keys("hello")                                         # 此处对查找到的输入框进行输入hello
runsta = q.find_element(By.XPATH, '//*[@id="search_one"]')      # 定位按钮(此处为Xpath)
runsta.click()                                                  # 对定位的按钮进行单击操作
time.sleep(1)# 这里如果跳转弹出了新窗口,需要进行如下操作,切换至当前窗口进行操作,否则将会查找不到元素
# 如果在原来的窗口跳转至新的网址,则不需要进行如下操作
currentWin = q.current_window_handle
handles = q.window_handles
for i in handles:if currentWin == i:continueelse:q.switch_to.window(i)
time.sleep(1)# 如果要对网址进行批量操作(如获取网址显示的为列表,获取其信息),可以使用for循环
# 部分网站会存在两种方案,反复进入网页对元素进行定位,会发现有两种解析格式,这里可以使用try方式
for i in range(1, 1000, 2):# 这里两种不同的解析方案try:# 方案一# 使用XPath定位获取信息并打印a = q.find_element(By.XPATH, '/html/body/div[1]/div[9]/div[12]/table/tbody/tr[{}]/td[1]/div/div[1]/div/a'.format(i))b = q.find_element(By.XPATH, '/html/body/div[1]/div[9]/div[12]/table/tbody/tr[{}]/td[4]'.format(i))print(a.text, b.text)except selenium.common.exceptions.NoSuchElementException as e:# 方案二# 使用XPath定位获取信息并打印a = q.find_element(By.XPATH, '/html/body/div[2]/div[8]/div[12]/table/tbody/tr[{}]/td[1]/div/div[1]/div/a'.format(i))b = q.find_element(By.XPATH, '/html/body/div[2]/div[8]/div[12]/table/tbody/tr[{}]/td[4]'.format(i))print(a.text, b.text)

这里的一系列操作可以封装为函数绑定某个按钮,点击按钮即可触发,cookies使用全局变量,即上面登入时获取的cookies信息

更多selenium操作详情请看https://blog.csdn.net/weixin_46287157/article/details/129149265

四、带Cookies操做页面(session)

可以使用信息直接使用session登入

# 登入的URL
login_url = ''
# 登入带入的参数,如email为账户,pwd为密码,code为验证码
# 这种参数具体的得根据具体的网址,一般会通过一些加密,需要反向解析
data = {'email': '','pwd': '','code': ''
}
# 抓取登入后的页面,使用session进行POST请求的发送,session中获取了Cookie
login_page_text = session.post(url=login_url, headers=headers, data=data)

在这也可以使用上面使用selenium获取的Cookies信息,加入到session中,发起请求时已经包含了登入信息

import requests# selenium获取的Cookies复制过来
cookies = []
# 创建对象并将Cookies信息加入,具体那些键值对得根据具体网址来
session = requests.session()
for cookie in cookies:session.cookies.set(cookie['name'], cookie['value'])# 发起请求,获取网址文件
page = session.get(browser.current_url)
page.encoding = "utf-8"
html = page.text
# 保存源码
with open('./a.html', 'w', encoding='utf-8') as fp:fp.write(page.text)

五、自动登入(验证处理)

上面为了方便,登入操作都是手动,也可以将登入操作自动化,只不过一些大网址会比较麻烦,比如需要图片验证码、手机验证码或其他什么方式验证,有些验证可以借助于第三方工具,比如超级鹰等其他第三方平台

1、超级鹰(图片验证码)

超级鹰的基本用法:www.chaojiying.com/about.html
以登入某网站为例,为保证请求页面的验证码和登入的一样,不能做两次请求,可以借助于截图的方式,将页面进行截图,然后截取验证码部分,利用第三方工具进行处理,获取信息或操作后进行登入操作。这里采用的是截图裁剪方式

from PIL import Image# 请求页面全局截图且保存
bro.save_screenshot('a.png')
# 确定验证码坐标(裁剪区域)
code_img_ele = bro.find_element('') # 图片标签
location = code_img_ele.location # 验证码左上角坐标 x y
size = code_img_ele.size # 宽度
# 左上角和右下角位子
rangle = (int(location['x']), int(location['y']), int(location['x']+size['width']), int(location['y']+size['height']))
# 图片裁剪
i = Image.Open('./a.png')
frame = i.crop(rangle)
frame.save('code.png')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Promethues:普罗米修斯

promethues是一个开源的系统监控以及报警系统。整和zabbix的功能,系统,网络,设备promethues可以兼容网络,设备。容器监控。告警系统。因为他和k8s是一个项目基金开发的产品,天生匹配k8s的原生系统。对容器化和云原生服…

MySQL(下)

四、事务 一、概念 对数据库的一次执行中有多条sql语句执行。这多条sql在一次执行中,要么都成功执行,要么都不执行。保证了数据完整性。MySQL中只有innodb引擎支持事务。 二、特性 事务是必须满足 4 个条件(ACID)&#x…

江西公务员考试报名照如何上传成功

2024年江西省考报名公告已经发布了,想要参加江西省考报名的姐妹们,快来看看,提前了解报名流程,和报名照上传要求。 网上报名时间:1月28日9:00至2月2日17:00 网上缴费时间:1月28日9:00至2月3日17:00 打印准考…

MookLab 和 SGVision

什么是马克拉伯(MookLab) MookLab是一个机器视觉应用开放社区,MookLab致力于帮助用户以最低的成本、门槛构建视觉系统。具体为:1)提供免费软件:平台提供免费的视觉软件,专业团队进行免费软件服务支持。 2)…

备战蓝桥杯----数据结构及STL应用(基础2)

上次我们讲了vector的大致内容,接下来让我们讲一下栈,队列吧! 什么是栈呢? 很简单,我们用的羽毛球桶就是,我们取的球,是最后放的,栈是一种先进后出的数据结构。 方法函数 s.push(…

SpringBoot深入解析:掌握自动装配机制及其定制化原理

推荐一款我一直在用的ChatGPT4.0国内站点,每日有免费使用额度,支持PC、APP、VScode插件同步使用 SpringBoot篇:SpringBoot的自动装配原理 SpringBoot是一个旨在简化Spring应用初始搭建以及开发过程的框架。它利用了Spring框架的依赖注入特性…

HDFS Federation前世今生

一 背景 熟悉大数据的人应该都知道,HDFS 是一个分布式文件系统,它是基于谷歌的GFS实现的开源系统,设计目的就是提供一个高度容错性和高吞吐量的海量数据存储解决方案。在经典的HDFS架构中有2个NameNode和多个DataNode,如下 从上面…

美易官方《阿迪达斯一季度营收微降,大中华区连续八季下滑》

阿迪达斯一季度营收微降,大中华区连续八季下滑 近日,阿迪达斯公布了2023财年第一季度的财务报告。尽管公司营收总体实现了微幅增长,但是大中华区的营收却出现了连续八个季度的下滑。这一现象引发了市场对阿迪达斯在中国市场表现的的关注和担忧…

内网安全:RDP WinRS WinRM SPN Kerberos 横向移动

目录 WinRM协议 RDP协议 域横向移动:RDP协议 RDP协议利用 一. 探针服务 二. 获取NTML Hash 明文密码 三. 连接执行 域横向移动:WinRM WinRS WinRM协议、WinRS命令利用 一. cs 内置端口扫描5985 二. 连接执行 三. 上线CS 四. CS插件横向移动…

如何在Unity中无缝衔接播放视频,避免卡顿

如何在Unity中无缝衔接播放视频,避免卡顿 问题描述**解决方案概览**实现步骤**1. 准备工作****2. 视频播放控制器**初始化视频播放器预加载视频**举例说明****技术实现**细节提醒**1. 准备UI元素****2. 添加和配置VideoPlayer****3. 创建RenderTexture****4. 绑定脚本与UI元素…

第五篇:express路由路径方式(字符串,字符串模式,和正则)

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 引言: &#x1f4…

(二十一)Flask之上下文管理第二篇(细细扣一遍源码)

每篇前言: 🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 🔥🔥本文已收录于Flask框架从入门到实战专栏:《Flask框架从入…

《幻兽帕鲁》1月29日游戏服务器推荐!腾讯云降低规格再次降价!

腾讯29日刷新规格,从14M降低到12M,硬盘和流量都有降低,但价格打下来了!价格从66元/月降低到32元/月,277元/3个月降低到96元/3个月! 三大厂商4核16G的云服务器价格对齐,不过具体参数略有不同 阿里…

C语言数据结构——链表

(图像由AI生成) 0.前言 在计算机科学中,数据结构是存储和组织数据的一种方式,它不仅影响数据的存储,也影响数据的检索和更新效率。C语言,作为一种经典的编程语言,提供了灵活的方式来处理数据…

安装pygraphviz报错——fatal error: graphviz/cgraph.h: 没有那个文件或目录的解决方法

今天想在一台新的pc上用networkx输出dot图: nx.drawing.nx_agraph.write_dot(G_PDG,test.dot) 结果报错:requires pygraphviz http://pygraphviz.github.io/ 然后运行 pip install pygraphviz 结果就报错: pygraphviz/graphviz_wrap.c:3…

GIS应用水平考试一级—2009 年度第二次

全国信息化工程师——GIS应用水平考试 2009 年度第二次全国统一考试一级 试卷说明: 1、本试卷共9页,6个大题,满分150 分,150 分钟完卷。 2、考试方式为闭卷考试。 3、将第一、二、三題的答案用铅笔涂写到(NCIE-GIS)答题卡上。 4、将第四、五、六题的答案填写到主观题答题卡上…

STM32学习笔记(二) —— 调试串口

我们在调试程序时,经常会使用串口打印相关的调试信息,但是单片机串口不能直接与 PC 端的 USB 接口通讯,需要用到一个USB转串口的芯片来充当翻译的角色。我们使用的开发板上有这个芯片,所以在打印调试信息的时候直接使用USB线连接开…

C#,广义斐波那契数(Generalised Fibonacci Numbers)的算法

广义斐波那契序列(generalized Fibonacci sequence)是斐波那契数的推广。由递推关系F₁F₂…Fm-10,Fₘ1,FmnFₙFn1…Fnm1,n≥1所产生的序列,称为m级广义斐波那契序列。 计算结果: 源代码: 1 文本格式 …

【MCAL】TC397+EB-tresos之GPT配置实战 - 定时器

本篇文章介绍了在TC397平台使用EB-tresos对GPT驱动模块进行配置的实战过程,不仅介绍了使用GTM来实现定时器的方案,还介绍了基于GPT12来实现连续定时器的实例。因为GTM是德国博世公司开发的IP,而英飞凌的芯片集成了这个IP,并在这个基础上搭建了…

蓝牙----蓝牙连接建立_连接建立

蓝牙----蓝牙连接建立_连接建立 蓝牙连接建立过程图1.主机扫描到广播包1.1判断是否是自己关心的广播包1.2广播地址添加到扫描列表 2.主机扫描结束,建立连接3.主从连接成功后,执行连接建立后事件3.1.主机将连接句柄和设备地址添加到连接列表3.2.主机进行G…