cookies(8)

post请求

post和get都可以带着参数请求,不过get请求的参数会在url上显示出来。但post请求的参数就不会直接显示,像账号密码这种私密的信息,就应该用post的请求。get是明文显示,post是非明文显示。

通常,get请求会应用于获取网页数据,比如之前学的requests.get()。post请求则应用于向网页提交数据,比如提交表单类型数据(像账号密码就是网页表单的数据)。

cookies及其用法

当登录博客账号,并勾选“记住我”:服务器就会生成一个cookies和这个账号绑定——>接着它把这个cookies告诉你的浏览器,让浏览器把cookies存储到你的本地电脑——>当下一次,浏览器带着cookies访问博客,服务器会知道你的账号,从而实现不需要再重复输入账号密码即可直接访问。

当然,cookies也是有时效性的,过期后就会失效。

在【headers】里【form data】下面是有关登录的5个参数:
log和pwd是我们的账号和密码,
wp-submit是登录的按钮,
redirect_to后面带的链接是登录后会跳转到的这个页面网址。

向服务器发起请求登录代码的写法:
import requests#引入requests。
url = ' https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php'#把登录的网址赋值给url。
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/xxx.xx (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/xxx.xx'
}#加请求头,模拟浏览器正常的访问,避免被反爬虫。
data = {
'log': '......', #写入账户
'pwd': '......', #写入密码
'wp-submit': '登录',
'redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-admin/',
'testcookie': '1'
}#把有关登录的参数封装成字典,赋值给data。
login_in = requests.post(url,headers=headers,data=data)#用requests.post发起请求,放入参数:请求登录的网址、请求头和登录参数,然后赋值给login_in。
print(login_in)#打印login_in

当我们点击发表评论时,Network里迅速加载出很多请求,点开【wp-comments-post.php】,看headers,会发现刚刚发表的评论就藏在【form data】这里。comment是评论内容,submit是发表评论的按钮,另外两个参数也是和评论有关的参数。【wp-comments-post.php】的数据放在哪里不一定。常规情况下,大部分网站都会把这样的数据存储在XHR里,比如知乎的回答。
要发表博客评论,首先得登录,其次得提取和调用登录的cookies,然后还需要评论的参数,才能发起评论的请求。现在,登录的代码在前面写好了,评论的参数刚也找到了,就差提取和调用登录的cookies。

如何调用cookies?

提取cookies的方法:调用requests对象的cookies属性获得登录的cookies。
调用cookies的方法:在post请求中传入cookies=cookies的参数。

写法如下:
cookies = login_in.cookies #提取cookies的方法:调用requests对象(login_in)的cookies属性获得登录的cookies,并赋值给变量cookies。
url_1 = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-comments-post.php'#我们想要评论的文章网址。
data_1 = {
'comment': input('请输入你想要发表的评论:'),
'submit': '发表评论',
'comment_post_ID': '13',
'comment_parent': '0'
}#把有关评论的参数封装成字典。
comment = requests.post(url_1,headers=headers,data=data_1,cookies=cookies) #用requests.post发起发表评论的请求,放入参数:文章网址、headers、评论参数、cookies参数,赋值给comment。#调用cookies的方法就是在post请求中传入cookies=cookies的参数。
print(comment.status_code)#打印出comment的状态码,若状态码等于200,则证明我们评论成功。就说明服务器成功接收并响应了我们的评论请求。

多解释一句:登录的cookies其实包含了很多名称和值,真正能帮助我们发表评论的cookies,只是取了登录cookies中某一小段值而已。所以登录的cookies和评论成功后在【wp-comments-post.php】里的headers面板中看到的cookies是不一致的。

session及其用法

session是会话过程中,服务器用来记录特定用户会话的信息。cookies中存储着session的编码信息,session中又存储了cookies的信息。我们可以通过创建session来处理cookies,进而优化代码。

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

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

存储cookies

cookies本身的内容有点像一个列表,RequestsCookieJar是cookies对象的类。要想存储cookies需要经历下面的步骤转化为字符串方可存储:

8-1.png

写法如下:
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写入文件。

读取cookies

存储cookies时,是把它先转成字典,再转成字符串。读取cookies则刚好相反,要先把字符串转成字典,再把字典转成cookies本来的格式。

8-2.png

写法如下:
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本来的格式。
session.cookies = cookies#获取cookies:就是调用requests对象(session)的cookies属性。

登录博客发表评论的代码可以优化成:
如果程序能读取到cookies,就自动登录,发表评论;如果读取不到,就重新输入账号密码登录,再评论。
另外,cookies是否过期可以通过最后的状态码是否等于200来判断。
更好的解决方法是在代码里加一个条件判断,如果cookies过期,就重新获取新的cookies。

最终版本写法:
import requests, json
session = requests.session()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/xxx.xx (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/xxx.xx'}

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.oc.forchange.cn/wp-login.php'
data = {'log': input('请输入你的账号'),
'pwd': input('请输入你的密码'),
'wp-submit': '登录',
'redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/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.oc.forchange.cn/wp-comments-post.php'
data_2 = {
'comment': input('请输入你要发表的评论:'),
'submit': '发表评论',
'comment_post_ID': '13',
'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('成功啦!')
else:
sign_in()
session.cookies = cookies_read()
num = write_message()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344

推荐阅读更多精彩内容

  • 博客的评论需要登录才能进行 上图左边是“正常人”的操作:填上账号和密码;右边我们可以用工程师的思维,来分析浏览器的...
    千喜Ya阅读 509评论 0 1
  • 接口测试自动化的优点: 1,web自动化说起来很多人都会直接想到UI自动化这个设计,很少有人直接第一个概念是接口自...
    路边看雪的小男孩阅读 4,908评论 1 26
  • 爬虫的基本流程 一、发送HTTP请求(Request)通过Python库向目标站点发送HTTP请求,等待服务器响应...
    晓枫_0544阅读 763评论 0 0
  • 昨天,我们更多的讨论了request的基础API,让我们对它有了基础的认知。学会上一课程,我们已经能写点基本的爬虫...
    阿尔卑斯山上的小灰兔阅读 12,237评论 1 8
  • 柳叶压绦落入潭,望凝碧水泪不干。 深情难却任其远,不比春风弃旧寒。 折曲柳青难相断,掬抷潭水润伤端。 去年此地仍犹...
    徐一村阅读 381评论 7 14