【Python从入门到进阶】42、使用requests的Cookie登录古诗文网站

接上篇《41、有关requests代理的使用》
上一篇我们介绍了requests代理的基本使用,本篇我们来学习如何利用requests的Cookie登录古诗文网。

一、登录网站及目的介绍

我们需要Cookie模拟登录的网站为:https://www.gushiwen.cn/(古诗文网)
这是一个专门分享和品鉴古诗文、名句、作者和古籍的网站。

点击“我的”菜单,可以进入登录页面:

可以看到,是需要输入账号以及密码还有验证码进行登录。
登录成功之后,会跳转到真正的“我的”后台页面:

我们本次要实现的目的就是:使用Python脚本实现自动登录,进入到主页面。

二、登录接口分析

1、登录接口API查看

我们先进入登录页面,故意输入一个错误的账号密码,触发错误提示(如果输入正确的账号密码,登录成功后会跳转新的页面,这样我们就无法拿到接口信息了),此时我们F12打开浏览器开发者选项,在network里面找到包含“login”字样的网络请求:

可以看到,接口的大致信息是这样的:

请求URL:
https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx
请求方法:POST
请求参数:
__VIEWSTATE: LE5vdTvJMVsOaxkvBCE16Ls8zz7btwPW6mhhhDq+UtmXrcMxidC6Wa1xm0GFX/1CX4OmxMeVz+hd5lWiq8oPkkAd1bVtoGsgiS/BHXqghOntsFCYfkdmSJwzteX/Itiv81PAIcgZrQTgMH3jRer1MF/1krk=
__VIEWSTATEGENERATOR: C93BE1AE
from: http://so.gushiwen.cn/user/collect.aspx
email: jackzhucoder@126.com
pwd: 23423423423
code: XQ97
denglu: 登录

通过观察到的参数,可以看到__VIEWSTATE、__VIEWSTATEGENERATOR和code是变量,其他的都是不变量。所以我们实现最终目标需要搞定三个难点,即:
(1)分析出“__VIEWSTATE”参数是什么,在哪里获取。
(2)分析出“__VIEWSTATEGENERATOR”参数是什么,在哪里获取。
(3)解析验证码图片,获取相应字符设置在code参数上。

我们下面一个个的解决。

2、__VIEWSTATE等动态参数获取

一般我们看不到的数据,大概率都是隐藏在页面的源代码中。我们查看网页源码,可以看到这两个参数在当前页面中都有,而且是隐藏的(type="hidden"):

那么获取这两个值就比较简单了,我们只要一开始访问到登录页面,然后通过登录页面的源代码拿到这两个值去访问登录接口即可。

这里我们需要访问的登录页面地址为:https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx我们来编写一些获取__VIEWSTATE和__VIEWSTATEGENERATOR的代码:

import requests

# 古诗文网登录页面的URL地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}

# 获取网络源代码
response = requests.get(url=url, headers=headers)
content = response.text

# 使用BeautifulSoup来解析网页源码,获取__VIEWSTATE和__VIEWSTATEGENERATOR参数
from bs4 import BeautifulSoup

soup = BeautifulSoup(content, 'lxml')

# 获取__VIEWSTATE
VIEWSTATE = soup.select('#__VIEWSTATE')[0].attrs.get('value')
print('VIEWSTATE: ', VIEWSTATE)

# 获取__VIEWSTATEGENERATOR
VIEWSTATEGENERATOR = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
print('VIEWSTATEGENERATOR: ', VIEWSTATEGENERATOR)

效果:

可以看到我们成功获取到了想要的这两个参数的值,可以在下一步调用登录接口的时候设置这两个参数。

3、验证码获取

我们还是进入登录页面,邮件检查验证码图片,可以看到获取验证码的地址:

通过src可以看到验证码地址为https://so.gushiwen.cn/RandCode.ashx。
而我们获取到这个验证码的src的地方,是id为imgCode的img元素

我们仍可以通过bs4获取到该src,并将其下载下来存储至本地:

# 获取验证码图片
code = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code

import urllib.request
urllib.request.urlretrieve(url=code_url,filename='code.jpg')
# 获取验证码图片后,下载到本地,观察本地验证码,在控制台输入code
code_name = input('请输入登录验证码:')

效果:

这里要注意,我们如果直接通过上面的方式获取,实际上拿到的是一个全新的验证码图片,而不是我们在登录页面上首次获取的那个,原因是因为我们没有带着之前的Cookie记录去访问这个图片路径,后台会把我们当成一个全新的请求给我们返回数据,所以我们这里一定要带着会话细腻系去访问,才能拿到原始页面的图片验证码。具体做法就是,通过requests的session()方法,获取一个带有之前页面Cookie值的请求对象,利用这个请求对象再去获取图片验证码,拿到的就是原始页面的验证码了:

# 获取验证码图片
code = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code

#import urllib.request
#urllib.request.urlretrieve(url=code_url,filename='code.jpg')
session = requests.session()
# 验证码url的内容
response_code = session.get(code_url)
# 图片下载要使用二进制数据
content_code = response_code.content
# wb模式就是将二进制数据写入文件
with open('code.jpg','wb') as fp:
    fp.write(content_code)

# 获取验证码图片后,下载到本地,观察本地验证码,在控制台输入code
code_name = input('请输入登录验证码:')

此时我们可以在本地看到该验证码,可以进行手工输入(自动识别我们在下一章讲解)。此时我们就可以带着所有参数去执行登录了。

三、进行登录操作

根据上面我们两个步骤的操作,最终获取到登录需要的所有参数,我们来完成最后的登录代码:

# _*_ coding : utf-8 _*_
# @Time : 2023-11-19 15:59
# @Author : 光仔December
# @File : requests_cookie登录古诗文网
# @Project : Python基础

import requests

# 古诗文网登录页面的URL地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}

# 获取网络源代码
response = requests.get(url=url, headers=headers)
content = response.text

# 使用BeautifulSoup来解析网页源码,获取__VIEWSTATE和__VIEWSTATEGENERATOR参数
from bs4 import BeautifulSoup

soup = BeautifulSoup(content, 'lxml')

# 获取__VIEWSTATE
VIEWSTATE = soup.select('#__VIEWSTATE')[0].attrs.get('value')
print('VIEWSTATE: ', VIEWSTATE)

# 获取__VIEWSTATEGENERATOR
VIEWSTATEGENERATOR = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
print('VIEWSTATEGENERATOR: ', VIEWSTATEGENERATOR)

# 获取验证码图片
code = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code

#import urllib.request
#urllib.request.urlretrieve(url=code_url,filename='code.jpg')
session = requests.session()
# 验证码url的内容
response_code = session.get(code_url)
# 图片下载要使用二进制数据
content_code = response_code.content
# wb模式就是将二进制数据写入文件
with open('code.jpg','wb') as fp:
    fp.write(content_code)

# 获取验证码图片后,下载到本地,观察本地验证码,在控制台输入code
code_name = input('请输入登录验证码:')

# 点击登录
url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'

data_post = {
    '__VIEWSTATE': VIEWSTATE,
    '__VIEWSTATEGENERATOR': VIEWSTATEGENERATOR,
    'from': 'http://so.gushiwen.cn/user/collect.aspx',
    'email': 'jackzhucoder@126.com',
    'pwd': '123456',
    'code': code_name,
    'denglu': '登录'
}

# 获取网络源代码(这里能用requests对象,要用验证码的session对象,保持一个Cookie环境)
response_post = session.post(url=url_post, headers=headers, data=data_post)
content_post = response_post.text

print(content_post)

这里我们要注意,为了校验验证码成功,登录接口要带着图片验证码的Cookie一起过去,在编码上的体现形式就是使用session对象做post请求。
效果:

可以看到我们成功登录,并进入了后台,看到我们收藏的诗文信息。

至此,我们使用requests的Cookie登录古诗文网站的全部内容讲解完毕。下一篇我们讲解如何使用第三方库来自动识别登录验证码。


参考:尚硅谷Python爬虫教程小白零基础速通
转载请注明出处:https://guangzai.blog.csdn.net/article/details/134492436

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于2023年编程语言使用排行我的看法

一、2022、2023年编程语言使用排行榜 从这个表格中,我们可以看到Python在两次调查中都排第一。对这件事情,很多人有了不同的看法。一个小粉丝问我,凭什么、又是为什么。下面,我展开我的理解。 二、Python为什么排第一&#xff1f…

Jmeter——循环控制器中实现Counter计数器的次数重置

近期在使用Jmeter编写个辅助测试的脚本,用到了多个Loop Controller和Counter。 当时想的思路就是三个可变的数量值,使用循环实现;但第三个可变值的数量次数,是基于第二次循环中得到的结果才能确认最终次数,每次的结果…

【碰碰球】弹珠游戏-微信小程序项目开发流程详解

还记得小时候玩过的弹珠撞击游戏不,这里把它的实现原理通俗易懂地讲一下,看看怎样实现一个碰碰球(弹珠)小游戏,除了个人玩法,也可以双人玩哦,与打乒乓球一样的,可练习临场反应。 创建项目 打开微信开发者…

自动驾驶学习笔记(九)——车辆控制

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 控制器设计 比例积分微分控制 线性…

[C/C++] 数据结构 LeetCode:用队列实现栈

题目描述: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元…

Vulhub靶场-KIOPTRIX: LEVEL 1.1

目录 环境配置 端口扫描 漏送发现 漏送利用 提权(内核漏洞提权) 环境配置 环境配置的过程同主页该专栏第一个靶场,不在赘述。 端口扫描 首先通过arp-scan并根据靶机的mac地址确定靶机的IP地址 然后对靶机进行一个扫描 首先扫描到OpenS…

Python大数据之linux学习总结——day10_hive调优

hive调优 hive调优hive命令和参数配置1.hive数据压缩压缩对比开启压缩 2.hive数据存储[练习]行列存储原理存储压缩比拓展dfs -du -h 3. fetch抓取4. 本地模式5. join的优化操作6. 列裁剪7. 分区裁剪8. group by 操作9. count(distinct)10. 笛卡尔积11. 动态分区[练习]12. 如何调…

【C++】入门三

接下来我们说一下引用这个概念,那么什么是引用呢?简单来说引用就是取别名,比如有一个变量叫a,现在我给它取了一个别名叫b,那么此时a和b管理的都是一块空间 这个例子就可以很好的体现a和b管理的是同一块空间&#xff0…

2023.11.18 每日一题(AI自生成应用)【C++】【Python】【Java】【Go】 动态时间序列分析

目录 一、编程挑战:动态时间序列分析 实际应用: 实现提示: 二、实现 1. C 2. Python 3. JAVA 4. Go 一、编程挑战:动态时间序列分析 问题描述: 假设你是一名软件工程师,需要开发一个应用来分析和预…

Spark 平障录

Profile Profile 是最重要的第一环。 利用好 spark UI 和 yarn container log分析业务代码,对其计算代价进行预判建设基准,进行对比,比如application id 进行对比,精确到 job DAG 环节 充分利用 UI Stage 页面 页头 summary&…

java拼图游戏(待优化)

启动类 package com.yx.ui;public class App { //启动入口public static void main(String[] args) {//如果想要开启一个界面,就创建谁的对象 // new DengJFrame(); // new ZCJFrame();new GameJFrame();}}游戏类 package com.yx.ui;import java.awt.event.KeyEv…

【数据结构】前言

数据结构是在计算机中维护数据的方式。 数据结构是OI重要的一部分。 同的数据结构各有优劣,能够处理的问题各不相同,而根据具体问题选取合适的数据结构,可以大大提升程序的效率。 所以,学习各种各样的数据结构是很有必要的。 数据…

Infineon+EB构建MCAL驱动包Demo实现片内外设使用

本篇文章以实际MCAL示例程序的实现与使用,帮助读者理解MCAL层在BSW中具体担任的功能与角色。文章首先介绍了为了构建MCAL示例程序所需要的相关应用程序的安装;然后介绍了个软件相互集成配置的过程,达到可以编译生成可执行文件;最后…

055-第三代软件开发-控制台输出彩虹日志

第三代软件开发-控制台输出彩虹日志 文章目录 第三代软件开发-控制台输出彩虹日志项目介绍控制台输出彩虹日志实现原理真实代码 总结 关键字: Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QM…

054-第三代软件开发-信号槽

第三代软件开发-信号槽 文章目录 第三代软件开发-信号槽项目介绍信号槽实现原理与MFC消息映射机制区别Qt信号槽机制的优缺点 关键字: Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML&#x…

网络层——IP协议

文章目录 一.IP协议二.基本概念三.IP协议格式四.分片与组装五.网段划分六.特殊的IP地址七.IP地址的数量限制八.私网IP地址和公网IP地址九.路由十.路由表生成算法 一.IP协议 IP协议全称为“网际互连协议(Internet Protocol)”,IP协议是TCP/IP…

视频合并:掌握视频嵌套合并技巧,剪辑高手的必备秘籍

在视频剪辑的过程中,掌握视频合并的技巧是每个剪辑高手必备的技能之一。通过合理的合并视频,可以增强视频的视觉效果,提高观看体验。 一、视频合并的准备工作 收集素材:在进行视频合并之前,首先需要收集足够的素材&a…

C语言 深入理解指针

目录 前言 指针的重要概念 剖析 题目一 题目二 题目三 题目四 题目五 题目六 题目七 题目八 **cpp *--*cpp 3 *cpp[-2] 3 cpp[-1][-1] 1 前言 简单来说,指针是一个变量,其值为另一个变量的地址。通过指针,我们可以直…

交易机器人-规则部分

微信公众号:大数据高性能计算 背景 背景是基于人工去做交易本身无法做到24小时无时无刻的交易,主要是虚拟币本身它是24小时交易,人无法做到24小时盯盘,其次就是如果你希望通过配置更加复杂的规则甚至需要爬取最新的信息走模型进行…

二阶低通滤波器(二阶巴特沃斯滤波器)

连续传递函数G(s) 离散传递函数G(z) 差分方程形式 二阶巴特沃斯滤波器参数设计 设计采样频率100Hz,截止频率33Hz。 注意:设计参数使用在离散系统中! 同理,其他不同阶数不同类型的滤波器设计,如二阶高通滤波器、二阶…
最新文章