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ǔ):
寫(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)的格式她我。
寫(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()