【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.rhkb.cn/news/197995.html

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

相关文章

SpringBoot项目连接linux服务器数据库两种解决方法(linux直接开放端口访问本机通过SSH协议访问,以mysql为例)

最近找个springboot脚手架重新熟悉一下springboot相关框架的东西,结果发现好像项目还不能直接像数据库GUI工具一样填几个SSH参数就可以了,于是就给他再整一下看看如何解决 linux开放3306(可修改)端口直接访问 此方法较为方便&am…

从0开始学习数据结构 C语言实现 1.前篇及二分查找算法

一、前篇 1、什么是数据结构? 数据结构是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系 2、时间复杂度与空间复杂度 大O符号是用于描述函数渐进行为的数学符号 常用函数的增长表 阶乘O(n!) > 指数…

LeetCode - 26. 删除有序数组中的重复项 (C语言,快慢指针,配图)

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路一:快慢指针 在数组中,快慢指针就是两个整数下标,定义 fast 和 slow 这里我们从下标1开始(下标0的数据就1个,没有重复项)&…

Flutter最新稳定版3.16 新特性介绍

Flutter 3.16 默认采用 Material 3 主题,Android 平台预览 Impeller,DevTools 扩展等等 Flutter在每个季度通常都会有个稳定版本的发布。在2023 Q4的更新中为大家带来的是Flutter 3.16。这个版本将 Material 3 设为新的默认主题,并为 Android…

人生阶段总结

--回顾一下我迷茫、努力、不开心又失败的阶段人生自我介绍一下,我是一个智力平平,记忆力差,适合自学的长睡眠者。 大专之前 国内的应试教育基本上不适合我,厌恶补课厌恶机械式听课刷题,所有的优势学科都是自学&#xf…

Unity中Shader法线贴图(上)

文章目录 前言一、法线纹理的作用二、为什么法线贴图长这样?(蓝色)三、法线贴图能使纹理采样时,进行偏移采样四、在Shader中使用法线贴图1、在属性面板定义一个变量来接收法线贴图2、在使用前声明 _NormalTex3、在片元着色器中&am…

【Go入门】Web工作方式

【Go入门】 Web工作方式 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容。在这个看似简单的用户行为背后,到底隐藏了些什么呢? 对于普通的上网过程,系统其实是这样做的&…

内容运营工具:标签体系

一.分类和标签的区别 ■标签是扁平的,分类是层级的。 ■标签是精确的,分类是粗糙的。 ■标签是多维的,分类是一维的。 二.标签的本质:元数据 事实上,在数据领域,有一个鼎鼎大名的词汇与标签极其雷同&…

Python爬虫的七个常用技巧总结,这些你一定得知道!

文章目录 前言1、基本抓取网页2、使用代理IP3、Cookies处理4、伪装成浏览器5、验证码的处理6、gzip压缩7、多线程并发抓取关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战…

锐捷EG易网关login.php以及其后台cli.php/branch_passw.php RCE漏洞复现 [附POC]

文章目录 锐捷EG易网关login.php以及其后台cli.php/branch_passw.php远程代码执行漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 锐捷EG易网关login.php以及其后台cli.php/branch_passw.php远程代码执行漏洞复…

Mysql -常见函数

目录 字符串函数 数值函数 日期函数 流程函数 字符串函数 -- 拼接 SELECT CONCAT(Hello, World); -- 小写 SELECT LOWER(Hello); -- 大写 SELECT UPPER(Hello); -- 左填充 SELECT LPAD(01, 5, -); -- 右填充 SELECT RPAD(01, 5, -); -- 去除空格 SELECT TRIM( Hello World )…

批量替换WordPress文章内图片链接

在WordPress使用过程中,如果中途更换了域名,原先文章内的图片使用的是原来的域名,就会造成文章页里面的图片链接无法显示。如果从后台文章挨个修改就比较麻烦。可以通过数据库进行批量替换即可。 使用 PHPMyadmin 打开 数据库,登…

【C++】一文全解C++中的异常:标准库异常体系&自定义异常体系(含代码演示)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.C语言传统的处理错误的方式二.C异常…

修完这个 Bug 后,MySQL 性能提升了 300%

最近 MySQL 官方在 8.0.35 上修复了一个 bug: 这个 bug 是由 Mark Callaghan 发现的。Mark 早年在 Google MySQL 团队,后来去了 Meta MySQL,也主导了 RocksDB 的开发。 Mark 在 #109595 的 bug report 给出了非常详细的复现步骤 在官方修复后…

【网络通信】探索UDP与TCP协议、IP地址和端口号的奥妙

🌺个人主页:Dawn黎明开始 🎀系列专栏:网络奇幻之旅 ⭐每日一句:往前走,朝着光 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️ 文章目录 📋前…

【Web】Ctfshow SSTI刷题记录1

目录 ①web361 362-无过滤 ②web363-过滤单双引号 ③web364-过滤单双引号和args ④web365-过滤中括号[]、单双引号、args ⑤web366-过滤单双引号、args、中括号[]、下划线 ⑦web367-过滤单双引号、args、中括号[]、下划线、os ⑧web368-过滤单双引号、args、中括号[]、下…

如何在 Nginx Proxy Manager(NPM)上部署静态网站

前言 众所周知,我们在之前介绍过 Nginx Proxy Manager(以下简称 NPM) 这个反向代理的神器,对于一些 Docker 搭建的 Web 项目,NPM 能够很轻松地给他们做反向代理。 然而对于一些静态网站,小伙伴们可能不知道怎么用 NP…

Ubuntu 安装VMware Tools选项显示灰色,如何安装VMware Tools

切换apt源为阿里云: https://qq742971636.blog.csdn.net/article/details/134291339 只要你的网络没问题,你直接执行这几个命令,重启ubuntu虚拟机即可、 sudo dpkg --configure -a sudo apt-get autoremove open-vm-tools sudo apt-get ins…

LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字

上一节实现了 LangChain 实现给动物取名字, 实际上每次给不同的动物取名字,还得修改源代码,这周就用模块化template来实现。 1. 添加promptTemplate from langchain.llms import OpenAI # 导入Langchain库中的OpenAI模块 from langchain.p…

Autox.js和Auto.js4.1.1手机编辑器不好用我自己写了一个编辑器

功能有 撤销 重做 格式化 跳转关键词 下面展示一些 内联代码片。 "ui"; ui.layout( <drawer id"drawer"><vertical><appbar><toolbar id"toolbar"title""h"20"/></appbar><horizontal b…