Python爬虫笔记——post请求、cookies及session_python session.post-程序员宅基地

技术标签: python  爬虫笔记  

一、post请求

post和get都可以带着参数请求,不过get请求的参数会在url上显示出来,但post请求的参数就不会直接显示,而是隐藏起来。像账号密码这种私密的信息,就应该用post的请求。如果用get请求的话,账号密码全部会显示在网址上,这显然不科学!你可以这么理解,get是明文显示,post是非明文显示
get请求会应用于获取网页数据,比如我们之前学的requests.get()。post请求则应用于向网页提交数据,比如提交表单类型数据(像账号密码就是网页表单的数据)。requests.post()

二、Cookies

【requests headers】存储的是浏览器的请求信息,【response headers】存储的是服务器的响应信息。我们这一关要找的cookies就在其中。
你会看到在【response headers】里有set cookies的参数。

其实,你对cookies并不陌生,我敢肯定你见过它。比如一般当你登录一个网站,你都会在登录页面看到一个可勾选的选项“记住我”,如果你勾选了,以后你再打开这个网站就会自动登录,这就是cookie在起作用。
当你登录博客账号spiderman,并勾选“记住我”,服务器就会生成一个cookies和spiderman这个账号绑定。接着,它把这个cookies告诉你的浏览器,让浏览器把cookies存储到你的本地电脑。当下一次,浏览器带着cookies访问博客,服务器会知道你是spiderman,你不需要再重复输入账号密码,即可直接访问。
当然,cookies也是有时效性的,过期后就会失效。你应该有过这样的体验:哪怕勾选了“记住我”,但一段时间过去了,网站还是会提示你要重新登录,就是之前的cookies已经失效。

三、session(会话)

所谓的会话,你可以理解成我们用浏览器上网,到关闭浏览器的这一过程。session是会话过程中,服务器用来记录特定用户会话的信息。
比如你打开浏览器逛购物网页的整个过程中,浏览了哪些商品,在购物车里放了多少件物品,这些记录都会被服务器保存在session中。
session和cookies的关系还非常密切——cookies中存储着session的编码信息,session中又存储了cookies的信息。
当浏览器第一次访问购物网页时,服务器会返回set cookies的字段给浏览器,而浏览器会把cookies保存到本地。
等浏览器第二次访问这个购物网页时,就会带着cookies去请求,而因为cookies里带有会话的编码信息,服务器立马就能辨认出这个用户,同时返回和这个用户相关的特定编码的session。
这也是为什么你每次重新登录购物网站后,你之前在购物车放入的商品并不会消失的原因。因为你在登录时,服务器可以通过浏览器携带的cookies,找到保存了你购物车信息的session。
在这里插入图片描述
代码:

import requests
#引用requests。
session = requests.session()
#用requests.session()创建session对象,相当于创建了一个特定的会话,帮我们自动保持了cookies。
url = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php'
headers = {
    
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
data = {
    
    'log':input('请输入账号:'), #用input函数填写账号和密码,这样代码更优雅,而不是直接把账号密码填上去。
    'pwd':input('请输入密码:'),
    'wp-submit':'登录',
    'redirect_to':'https://wordpress-edu-3autumn.localprod.forc.work/wp-admin/',
    'testcookie':'1'
}
session.post(url,headers=headers,data=data)
#在创建的session下用post发起登录请求,放入参数:请求登录的网址、请求头和登录参数。

url_1 = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-comments-post.php'
#把我们想要评论的文章网址赋值给url_1。
data_1 = {
    
'comment': input('请输入你想要发表的评论:'),
'submit': '发表评论',
'comment_post_ID': '7',
'comment_parent': '0'
}
#把有关评论的参数封装成字典。
comment = session.post(url_1,headers=headers,data=data_1)
#在创建的session下用post发起评论请求,放入参数:文章网址,请求头和评论参数,并赋值给comment。
print(comment)
#打印comment

四、存储cookies

我们先把登录的cookies打印出来看看

import requests
session = requests.session()
url = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php'
headers = {
    
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
data = {
    
    'log':input('请输入账号:'),
    'pwd':input('请输入密码:'),
    'wp-submit':'登录',
    'redirect_to':'https://wordpress-edu-3autumn.localprod.forc.work/wp-admin/',
    'testcookie':'1'
}
session.post(url,headers=headers,data=data)
print(type(session.cookies))
#打印cookies的类型,session.cookies就是登录的cookies
print(session.cookies)
#打印cookies

RequestsCookieJar是cookies对象的类,cookies本身的内容有点像一个列表,里面又有点像字典的键与值。那怎么把cookies存储下来?json模块能把字典转成字符串。我们或许可以先把cookies转成字典,然后再通过json模块转成字符串。这样,就能用open函数把cookies存储成txt文件。

在这里插入图片描述在这里插入图片描述

import requests,json
#引入requests和json模块。
session = requests.session()   
url = ' https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php'
headers = {
    
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
data = {
    
'log': input('请输入你的账号:'),
'pwd': input('请输入你的密码:'),
'wp-submit': '登录',
'redirect_to': 'https://wordpress-edu-3autumn.localprod.forc.work/wp-admin/',
'testcookie': '1'
}
session.post(url, headers=headers, data=data)

cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)
#把cookies转化成字典。
print(cookies_dict)
#打印cookies_dict
cookies_str = json.dumps(cookies_dict)
#调用json模块的dumps函数,把cookies从字典再转成字符串。
print(cookies_str)
#打印cookies_str
f = open('cookies.txt', 'w')
#创建名为cookies.txt的文件,以写入模式写入内容。
f.write(cookies_str)
#把已经转成字符串的cookies写入文件。
f.close()
#关闭文件。

运行代码后,确实证明了cookies可以被转成字典,也可以通过json模块把字典格式的cookies转成字符串。
这样一来,cookies的存储我们搞定了,但还得搞定cookies的读取,才能解决每次发表评论都得先输入账号密码的问题。

五、读取cookies

我们存储cookies时,是把它先转成字典,再转成字符串。读取cookies则刚好相反,要先把字符串转成字典,再把字典转成cookies本来的格式。
在这里插入图片描述
读取cookies的代码如下:

cookies_txt = open('cookies.txt', 'r')
#以reader读取模式,打开名为cookies.txt的文件。
cookies_dict = json.loads(cookies_txt.read())
#调用json模块的loads函数,把字符串转成字典。
cookies = requests.utils.cookiejar_from_dict(cookies_dict)
#把转成字典的cookies再转成cookies本来的格式。
cookies = session.cookies
#获取cookies:就是调用requests对象(session)的cookies属性。

六、总结

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

def cookies_read():
    cookies_txt = open('cookies.txt', 'r')
    cookies_dict = json.loads(cookies_txt.read())
    cookies = requests.utils.cookiejar_from_dict(cookies_dict)
    return (cookies)
    # 以上4行代码,是cookies读取。

def sign_in():
    url = ' https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php'
    data = {
    'log': input('请输入你的账号'),
            'pwd': input('请输入你的密码'),
            'wp-submit': '登录',
            'redirect_to': 'https://wordpress-edu-3autumn.localprod.forc.work/wp-admin/',
            'testcookie': '1'}
    session.post(url, headers=headers, data=data)
    cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)
    cookies_str = json.dumps(cookies_dict)
    f = open('cookies.txt', 'w')
    f.write(cookies_str)
    f.close()
    # 以上5行代码,是cookies存储。


def write_message():
    url_2 = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-comments-post.php'
    data_2 = {
    
        'comment': input('请输入你要发表的评论:'),
        'submit': '发表评论',
        'comment_post_ID': '7',
        'comment_parent': '0'
    }
    return (session.post(url_2, headers=headers, data=data_2))
    #以上9行代码,是发表评论。

try:
    session.cookies = cookies_read()
except FileNotFoundError:
    sign_in()
    session.cookies = cookies_read()

num = write_message()
if num.status_code == 200:
    print('成功啦!') #cookies是否过期,我们可以通过最后的状态码是否等于200来判断
else:
    sign_in()
    session.cookies = cookies_read()
    num = write_message() #如果cookies过期,就重新获取新的cookies。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_48615832/article/details/107029831

智能推荐

房屋租赁管理系统 基于SSM框架_基于ssm框架实现的房屋租赁管理系统-程序员宅基地

文章浏览阅读2k次。房屋租赁管理系统 基于SSM框架一.功能介绍包括管理员、房东、租客三种角色,外加游客(未登录情况)出租类型包含整租和合租权限游客 < 租客 < 房东 < 管理员1、游客功能登录、注册(可以注册房东或租客)、搜索房子、查看箱子信息、新闻资讯查询搜索功能,根据价格范围,面积范围,城市,小区,整租/合租搜索房子信息,基本信息、轮播图、地图定位2、租客功能预定房子(创建订单、签订合同、支付订单)订单管理(取消订单、查看订单、查看合同、退租)我的家(查看我的当前有效订单房子信息、_基于ssm框架实现的房屋租赁管理系统

VCED跨模态学习与实践(一)_could not import extension myst_parser (exception:-程序员宅基地

文章浏览阅读509次。学习路径。_could not import extension myst_parser (exception: no module named 'myst_par

readelf_creating extended listing: xfkz.lss avr-objdump -h-程序员宅基地

文章浏览阅读360次。13. readelf elf文件格式分析这个工具和objdump命令提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件);ELF文件类型ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了_creating extended listing: xfkz.lss avr-objdump -h -s xfkz.elf > xfkz.lss /u

html语言怎么让字体加粗,css怎么让字体加粗?-程序员宅基地

文章浏览阅读504次。我们常常对HTML代码中文字字体进行加粗,无论中文、英文、数字以及符合进行加粗布局。下面我们来看一下如何使用css设置字体加粗。css设置字体加粗使用css属性font-weight。该属性用于设置显示元素的文本中所用的字体加粗。数字值400相当于关键字normal,700等价于bold。每个数字值对应的字体加粗必须至少与下一个最小数字一样细,而且至少与下一个最大数字一样粗。font-weight..._html font thick

2021年中国X射线开关电源电容器市场趋势报告、技术动态创新及2027年市场预测_国内航空开关电源市场-程序员宅基地

文章浏览阅读60次。X射线开关电源电容器市场的企业竞争态势 该报告涉及的主要国际市场参与者有AVX、IXYS Corporation、Murata、TDK、J. Schneider Elektrotechnik GmbH等。这些参与者的市场份额、收入、公司概况和SWOT分析都包含在X射线开关电源电容器市场调研报告中。产品分类:自动控制直流应用领域:数码产品汽车用品航空航天其他【出版日期】2021-10【出版商】湖南贝哲斯信息咨询有限公司报告指南(共十五..._国内航空开关电源市场

ibus计算机组成原理,计算机组成原理课程设计报告模板.doc-程序员宅基地

文章浏览阅读137次。计算机组成原理课程设计报告PAGE3 / NUMPAGES10计算机组成原理课程设计报告2014计算机组成原理课程设计报告 班级:计科1202组号:2-4北京化工大学计算机科学与技术专业计算机组成原理课程设计报告院 系: 信息科学与技术学院专 业: 计算机科学与技术班 级: 计科1202组 号: ..._ibus控制原理

随便推点

嵌入式入门之51单片机_嵌入式51单片机-程序员宅基地

文章浏览阅读1.7k次,点赞4次,收藏28次。单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。数码管的接法,有共阳和共阴之分。共阴时,拉高电压即可点亮。_嵌入式51单片机

axios和fetch、async和await_await怎么放到axios前面-程序员宅基地

文章浏览阅读278次。与axios使用方式相似,fetch("数据接口").then(回调函数返回数据),返回的数据调用json方法转为json格式,再用then()获取数据。axios是网络请求工具与我们自己封装的myaxios函数使用方法一样,但是它的功能更多。在ES7的时候新出了acync和await新语法,再次进行了优化,不再采用链式调用,而是将每个请求独立出来,做到了高内聚低耦合。我们只需要在函数前面加上async,再axios前面加上await,即可实现。前面的方法都优化了回调地狱,采用链式调用的方法。..._await怎么放到axios前面

P2737 [USACO4.1]麦香牛块Beef McNuggets-程序员宅基地

文章浏览阅读108次。题目传送门:P2737 [USACO4.1]麦香牛块Beef McNuggets简化题意:其实就是给你 nnn 个数,a1a_1a1​ 到 ana_nan​ ,对于每个数取任意个,把它们的和放到集合 SSS 中,找出在集合 SSS 中最大的正整数 xxx ,使得 $x \not \in S $这题大概思路就是确定两个范围,设有两数 m, rm,\ rm, r,它们满足:所有的测试点里的答案 ≤m\le m≤m如果凑出来的数有上限,那么 {x∣x∈[r,m],x∈N+}⊆S\{x _[usaco4.1]麦香牛块beef mcnuggets

上海有学计算机的职业学校吗,我初中没有毕业,现在17岁,我想去职业学校读计算机,请问去哪里读呢?我在上海...-程序员宅基地

文章浏览阅读204次。上海市现代职业技术学校上海曹杨职业学校中华职业学校上海商业学校上海海业学校上海市建筑工程学校上海市戏剧学院附属舞蹈学校上海市交通学校上海市工商外国语学校上海电子工业学校上海市贸易学校上海市临港科技学校上海市航空服务学校上海城市建设工程学校上海市体育运动学校上海市音乐学院附属中等音乐专科学校上海市公用事业学校上海市医药学校上海市工业技术学校上海市物资学校上海市行政管理学校上海市西南工程学校上海交通大..._上海计算机职业学校

1.4 MyBatis数据库逆向生成工具_mybatis反向生成工具-程序员宅基地

文章浏览阅读960次。MyBatis数据库逆向生成工具_mybatis反向生成工具

HBase 安装_修改pid文件存放路径 进入 /opt/hbase-2.0.0/conf 目录,找到 hbase-e-程序员宅基地

文章浏览阅读175次。文章目录HBase 安装查看更多:http://www.coffeecode.codes/HBase 安装启动 zookeepera. 进入 zookeeper 目录:/opt/module/zookeeper-3.4.10b. 启动 zookeeper 命令:bin/zkServer.sh start启动 Hadoopa. 进入 Hadoop 目录:/opt/module/hadoop-2.7.2b. 启动 DFS 命令:sbin/start-dfs.shc. Yarn_修改pid文件存放路径 进入 /opt/hbase-2.0.0/conf 目录,找到 hbase-env.sh 进