cookies(8)

post請(qǐng)求

post和get都可以帶著參數(shù)請(qǐng)求轴咱,不過(guò)get請(qǐng)求的參數(shù)會(huì)在url上顯示出來(lái)坚洽。但post請(qǐng)求的參數(shù)就不會(huì)直接顯示,像賬號(hào)密碼這種私密的信息,就應(yīng)該用post的請(qǐng)求。get是明文顯示,post是非明文顯示尸闸。

通常睹栖,get請(qǐng)求會(huì)應(yīng)用于獲取網(wǎng)頁(yè)數(shù)據(jù),比如之前學(xué)的requests.get()茧痕。post請(qǐng)求則應(yīng)用于向網(wǎng)頁(yè)提交數(shù)據(jù),比如提交表單類型數(shù)據(jù)(像賬號(hào)密碼就是網(wǎng)頁(yè)表單的數(shù)據(jù))恼除。

cookies及其用法

當(dāng)?shù)卿洸┛唾~號(hào)踪旷,并勾選“記住我”:服務(wù)器就會(huì)生成一個(gè)cookies和這個(gè)賬號(hào)綁定——>接著它把這個(gè)cookies告訴你的瀏覽器曼氛,讓瀏覽器把cookies存儲(chǔ)到你的本地電腦——>當(dāng)下一次,瀏覽器帶著cookies訪問(wèn)博客令野,服務(wù)器會(huì)知道你的賬號(hào)舀患,從而實(shí)現(xiàn)不需要再重復(fù)輸入賬號(hào)密碼即可直接訪問(wèn)。

當(dāng)然气破,cookies也是有時(shí)效性的聊浅,過(guò)期后就會(huì)失效。

在【headers】里【form data】下面是有關(guān)登錄的5個(gè)參數(shù):
log和pwd是我們的賬號(hào)和密碼现使,
wp-submit是登錄的按鈕低匙,
redirect_to后面帶的鏈接是登錄后會(huì)跳轉(zhuǎn)到的這個(gè)頁(yè)面網(wǎng)址。

向服務(wù)器發(fā)起請(qǐng)求登錄代碼的寫(xiě)法:
import requests#引入requests碳锈。
url = ' https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php'#把登錄的網(wǎng)址賦值給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'
}#加請(qǐng)求頭,模擬瀏覽器正常的訪問(wèn)售碳,避免被反爬蟲(chóng)强重。
data = {
'log': '......', #寫(xiě)入賬戶
'pwd': '......', #寫(xiě)入密碼
'wp-submit': '登錄',
'redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-admin/',
'testcookie': '1'
}#把有關(guān)登錄的參數(shù)封裝成字典,賦值給data贸人。
login_in = requests.post(url,headers=headers,data=data)#用requests.post發(fā)起請(qǐng)求间景,放入?yún)?shù):請(qǐng)求登錄的網(wǎng)址、請(qǐng)求頭和登錄參數(shù)艺智,然后賦值給login_in倘要。
print(login_in)#打印login_in

當(dāng)我們點(diǎn)擊發(fā)表評(píng)論時(shí),Network里迅速加載出很多請(qǐng)求力惯,點(diǎn)開(kāi)【wp-comments-post.php】碗誉,看headers,會(huì)發(fā)現(xiàn)剛剛發(fā)表的評(píng)論就藏在【form data】這里父晶。comment是評(píng)論內(nèi)容哮缺,submit是發(fā)表評(píng)論的按鈕,另外兩個(gè)參數(shù)也是和評(píng)論有關(guān)的參數(shù)甲喝〕⑽【wp-comments-post.php】的數(shù)據(jù)放在哪里不一定。常規(guī)情況下埠胖,大部分網(wǎng)站都會(huì)把這樣的數(shù)據(jù)存儲(chǔ)在XHR里糠溜,比如知乎的回答。
要發(fā)表博客評(píng)論直撤,首先得登錄非竿,其次得提取和調(diào)用登錄的cookies,然后還需要評(píng)論的參數(shù)谋竖,才能發(fā)起評(píng)論的請(qǐng)求『熘現(xiàn)在承匣,登錄的代碼在前面寫(xiě)好了,評(píng)論的參數(shù)剛也找到了锤悄,就差提取和調(diào)用登錄的cookies韧骗。

如何調(diào)用cookies?

提取cookies的方法:調(diào)用requests對(duì)象的cookies屬性獲得登錄的cookies零聚。
調(diào)用cookies的方法:在post請(qǐng)求中傳入cookies=cookies的參數(shù)袍暴。

寫(xiě)法如下:
cookies = login_in.cookies #提取cookies的方法:調(diào)用requests對(duì)象(login_in)的cookies屬性獲得登錄的cookies,并賦值給變量cookies隶症。
url_1 = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-comments-post.php'#我們想要評(píng)論的文章網(wǎng)址政模。
data_1 = {
'comment': input('請(qǐng)輸入你想要發(fā)表的評(píng)論:'),
'submit': '發(fā)表評(píng)論',
'comment_post_ID': '13',
'comment_parent': '0'
}#把有關(guān)評(píng)論的參數(shù)封裝成字典。
comment = requests.post(url_1,headers=headers,data=data_1,cookies=cookies) #用requests.post發(fā)起發(fā)表評(píng)論的請(qǐng)求沿腰,放入?yún)?shù):文章網(wǎng)址览徒、headers、評(píng)論參數(shù)颂龙、cookies參數(shù)习蓬,賦值給comment。#調(diào)用cookies的方法就是在post請(qǐng)求中傳入cookies=cookies的參數(shù)措嵌。
print(comment.status_code)#打印出comment的狀態(tài)碼躲叼,若狀態(tài)碼等于200,則證明我們?cè)u(píng)論成功企巢。就說(shuō)明服務(wù)器成功接收并響應(yīng)了我們的評(píng)論請(qǐng)求枫慷。

多解釋一句:登錄的cookies其實(shí)包含了很多名稱和值,真正能幫助我們發(fā)表評(píng)論的cookies浪规,只是取了登錄cookies中某一小段值而已或听。所以登錄的cookies和評(píng)論成功后在【wp-comments-post.php】里的headers面板中看到的cookies是不一致的。

session及其用法

session是會(huì)話過(guò)程中笋婿,服務(wù)器用來(lái)記錄特定用戶會(huì)話的信息誉裆。cookies中存儲(chǔ)著session的編碼信息,session中又存儲(chǔ)了cookies的信息缸濒。我們可以通過(guò)創(chuàng)建session來(lái)處理cookies足丢,進(jìn)而優(yōu)化代碼。

經(jīng)session優(yōu)化過(guò)的發(fā)表博客評(píng)論的代碼:
import requests #引用requests庇配。
session = requests.session()#用requests.session()創(chuàng)建session對(duì)象斩跌,相當(dāng)于創(chuàng)建了一個(gè)特定的會(huì)話朴摊,幫我們自動(dòng)保持了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('請(qǐng)輸入賬號(hào):'), #用input函數(shù)填寫(xiě)賬號(hào)和密碼耽梅,這樣代碼更優(yōu)雅同仆,而不是直接把賬號(hào)密碼填上去。
'pwd':input('請(qǐng)輸入密碼:'),
'wp-submit':'登錄',
'redirect_to':'https://wordpress-edu-3autumn.localprod.oc.forchange.cn',
'testcookie':'1'
}
session.post(url,headers=headers,data=data)#在創(chuàng)建的session下用post發(fā)起登錄請(qǐng)求阱高,放入?yún)?shù):請(qǐng)求登錄的網(wǎng)址柱蟀、請(qǐng)求頭和登錄參數(shù)屎即。

url_1 = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-comments-post.php'#把我們想要評(píng)論的文章網(wǎng)址賦值給url_1。
data_1 = {
'comment': input('請(qǐng)輸入你想要發(fā)表的評(píng)論:'),
'submit': '發(fā)表評(píng)論',
'comment_post_ID': '13',
'comment_parent': '0'
}#把有關(guān)評(píng)論的參數(shù)封裝成字典著角。
comment = session.post(url_1,headers=headers,data=data_1)#在創(chuàng)建的session下用post發(fā)起評(píng)論請(qǐng)求,放入?yún)?shù):文章網(wǎng)址旋恼,請(qǐng)求頭和評(píng)論參數(shù)吏口,并賦值給comment。
print(comment)#打印comment

存儲(chǔ)cookies

cookies本身的內(nèi)容有點(diǎn)像一個(gè)列表冰更,RequestsCookieJar是cookies對(duì)象的類产徊。要想存儲(chǔ)cookies需要經(jīng)歷下面的步驟轉(zhuǎn)化為字符串方可存儲(chǔ):

8-1.png

寫(xiě)法如下:
cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)#把cookies轉(zhuǎn)化成字典。
print(cookies_dict)#打印cookies_dict
cookies_str = json.dumps(cookies_dict)#調(diào)用json模塊的dumps函數(shù)蜀细,把cookies從字典再轉(zhuǎn)成字符串舟铜。
print(cookies_str)#打印cookies_str
f = open('cookies.txt', 'w')#創(chuàng)建名為cookies.txt的文件,以寫(xiě)入模式寫(xiě)入內(nèi)容奠衔。
f.write(cookies_str)#把已經(jīng)轉(zhuǎn)成字符串的cookies寫(xiě)入文件谆刨。

讀取cookies

存儲(chǔ)cookies時(shí),是把它先轉(zhuǎn)成字典归斤,再轉(zhuǎn)成字符串痊夭。讀取cookies則剛好相反,要先把字符串轉(zhuǎn)成字典脏里,再把字典轉(zhuǎn)成cookies本來(lái)的格式她我。

8-2.png

寫(xiě)法如下:
cookies_txt = open('cookies.txt', 'r')#以reader讀取模式,打開(kāi)名為cookies.txt的文件迫横。
cookies_dict = json.loads(cookies_txt.read())#調(diào)用json模塊的loads函數(shù)番舆,把字符串轉(zhuǎn)成字典。
cookies = requests.utils.cookiejar_from_dict(cookies_dict)#把轉(zhuǎn)成字典的cookies再轉(zhuǎn)成cookies本來(lái)的格式矾踱。
session.cookies = cookies#獲取cookies:就是調(diào)用requests對(duì)象(session)的cookies屬性恨狈。

登錄博客發(fā)表評(píng)論的代碼可以優(yōu)化成:
如果程序能讀取到cookies,就自動(dòng)登錄介返,發(fā)表評(píng)論拴事;如果讀取不到,就重新輸入賬號(hào)密碼登錄圣蝎,再評(píng)論刃宵。
另外,cookies是否過(guò)期可以通過(guò)最后的狀態(tài)碼是否等于200來(lái)判斷徘公。
更好的解決方法是在代碼里加一個(gè)條件判斷牲证,如果cookies過(guò)期,就重新獲取新的cookies关面。

最終版本寫(xiě)法:
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('請(qǐng)輸入你的賬號(hào)'),
'pwd': input('請(qǐng)輸入你的密碼'),
'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存儲(chǔ)捂齐。

def write_message():
url_2 = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-comments-post.php'
data_2 = {
'comment': input('請(qǐng)輸入你要發(fā)表的評(píng)論:'),
'submit': '發(fā)表評(píng)論',
'comment_post_ID': '13',
'comment_parent': '0'
}
return (session.post(url_2, headers=headers, data=data_2)) #以上9行代碼蛮放,是發(fā)表評(píng)論。

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()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末包颁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子压真,更是在濱河造成了極大的恐慌娩嚼,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滴肿,死亡現(xiàn)場(chǎng)離奇詭異岳悟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)泼差,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)贵少,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拴驮,你說(shuō)我怎么就攤上這事春瞬。” “怎么了套啤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵宽气,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我潜沦,道長(zhǎng)萄涯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任唆鸡,我火速辦了婚禮涝影,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘争占。我一直安慰自己燃逻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布臂痕。 她就那樣靜靜地躺著伯襟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪握童。 梳的紋絲不亂的頭發(fā)上姆怪,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼稽揭。 笑死俺附,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溪掀。 我是一名探鬼主播事镣,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼膨桥!你這毒婦竟也來(lái)了蛮浑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤只嚣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后艺沼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體册舞,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年障般,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了调鲸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挽荡,死狀恐怖藐石,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情定拟,我是刑警寧澤于微,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站青自,受9級(jí)特大地震影響株依,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜延窜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一恋腕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逆瑞,春花似錦荠藤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谋减,卻和暖如春牡彻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工庄吼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缎除,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓总寻,卻偏偏與公主長(zhǎng)得像器罐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渐行,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 博客的評(píng)論需要登錄才能進(jìn)行 上圖左邊是“正常人”的操作:填上賬號(hào)和密碼轰坊;右邊我們可以用工程師的思維,來(lái)分析瀏覽器的...
    千喜Ya閱讀 524評(píng)論 0 1
  • 接口測(cè)試自動(dòng)化的優(yōu)點(diǎn): 1祟印,web自動(dòng)化說(shuō)起來(lái)很多人都會(huì)直接想到UI自動(dòng)化這個(gè)設(shè)計(jì)肴沫,很少有人直接第一個(gè)概念是接口自...
    路邊看雪的小男孩閱讀 4,925評(píng)論 1 26
  • 爬蟲(chóng)的基本流程 一、發(fā)送HTTP請(qǐng)求(Request)通過(guò)Python庫(kù)向目標(biāo)站點(diǎn)發(fā)送HTTP請(qǐng)求蕴忆,等待服務(wù)器響應(yīng)...
    曉楓_0544閱讀 782評(píng)論 0 0
  • 昨天颤芬,我們更多的討論了request的基礎(chǔ)API,讓我們對(duì)它有了基礎(chǔ)的認(rèn)知套鹅。學(xué)會(huì)上一課程站蝠,我們已經(jīng)能寫(xiě)點(diǎn)基本的爬蟲(chóng)...
    阿爾卑斯山上的小灰兔閱讀 12,311評(píng)論 1 8
  • 柳葉壓絳落入潭,望凝碧水淚不干卓鹿。 深情難卻任其遠(yuǎn)菱魔,不比春風(fēng)棄舊寒。 折曲柳青難相斷吟孙,掬抷潭水潤(rùn)傷端澜倦。 去年此地仍猶...
    徐一村閱讀 388評(píng)論 7 14