【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 BeautifulSoupsoup = 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' + codeimport 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 BeautifulSoupsoup = 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.textprint(content_post)

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

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

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


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

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

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

相关文章

许多网友可能还不知道,升级到Windows 11其实没那么复杂,只要符合几个条件可以了

如果你的Windows 10电脑可以升级Windows 11,现在怎么办?有几种方法可以免费安装新的操作系统。以下是你的选择。 如果你想升级到Windows 11,你可以随时购买一台已经安装了操作系统的新电脑。然而,如果你目前的Windows 10 PC满足所有必要的升级要求,那么在Windows 11免费的…

pm2在Windows环境中的使用

pm2 进程管理工具可以Windows操作系统上运行,当一台Windows电脑上需要运行多个进程时,或者运维时需要运行多个进程以提供服务时。可以使用pm2,而不再是使用脚本。 1. 使用PM2管理进程 1.1. 启动PM2项目 1.1.1. 直接启动项目 参数说明&…

中国电影票房排行数据爬取及分析可视化

大家好,我是带我去滑雪! 对中国电影票房排行数据的爬取和分析可视化具有多方面的用处:例如了解电影市场的历史趋势,包括不同类型电影的受欢迎程度、票房的季节性波动。识别观众对于不同类型电影的偏好,为电影制片方提供…

Java Swing商品信息查询系统

内容要求 1) 本次程序设计是专门针对 Java 课程的,要求使用 Java 语言进行具有一定代码量的程序开发。程序的设计要结合一定的算法,在进行代码编写前要能够设计好自己的算法。 2)本次程序设计涉及到 Java 的基本语法,即课堂上所…

【STM32】ADC(模拟/数字转换)

一、ADC的简介 1.什么是ADC 1)将【电信号】-->【电压】-->【数字量】 2)ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字量,建立模拟电路到数字电路的桥梁。 3)12位逐次逼近型ADC,1us转换时间&#xf…

宠物信息服务预约小程序的效果如何

宠物的作用越来越重要,因此铲屎官们对自己爱宠的照顾也是加倍提升,而市场围绕宠物展开的细分服务近些年来逐渐增多,且市场规模快速增长。涉及之广,涵盖宠物衣食住行、医疗、美容、婚丧嫁娶等,各品牌争相抢夺客户及抢占…

支持4KHz回报还能无线充电,简约不简单的雷柏VT3S游戏鼠标上手

这两年国产鼠标的表现很让人惊喜,不仅外观做工越来越精细,配置也越来越强大,当然价格依然亲民。现在很容易找到一款搭载高端传感器、响应速度快、电池续航时间长,并且还支持无线充电的全能型鼠标。 我之前用雷柏的鼠标比较多&…

AUTODL云服务器使用大致步骤(适合本人版)

(一)在官网上创建一个服务器 (二)远程连接指令: 改为: (三)连接后,可在中进行代码运行 输入一些指令 python ......

Nodejs中net模块多次Socket.setTimeout无法覆盖之前函数,导致叠加执行问题解决

Hi, I’m Shendi Nodejs中net模块多次Socket.setTimeout无法覆盖之前函数,导致叠加执行问题解决 问题描述 在 Nodejs 中,net 模块的 Socket 的 setTimeout 函数是设置超时时间,如果多次设置,超时时间会是最后一次的时间&#xff…

038、语义分割

之——介绍与数据集 杂谈 语义分割,语义分割(Semantic Segmentation)方法-CSDN博客: 语义分割是计算机视觉领域的一项重要任务,旨在将图像中的每个像素分配到其对应的语义类别中。与物体检测或图像分类不同,语义分割不仅要识别图像…

QGroundControl源码编译的三种方法

1.使用QtCreator编译: 下载qgroundcontrol源码 https://github.com/mavlink/qgroundcontrol.git 克隆 同步子模块 使用打开qgroundcontrol.pro 打开前要求先安装qt 5.15.2

Mysql之单行函数

Mysql之单行函数 单行函数数值类型函数字符串类型的函数日期和时间函数加密与解密函数信息函数 单行函数 函数的定义 函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经常使用的代码封装起来, 需要的时候直接调用即可。这…