GET&POST請求通常格式html
爬取Github數據git
好久以前在講web框架的時候,曾經提到過一句話,在網絡編程中「萬物皆socket」。任何的網絡通訊歸根結底,就是服務端跟客戶端的一次socket通訊。發送一個socket請求給服務端,服務端做出響應返回socket給客戶端。github
在此,就不詳細介紹HTTP請求頭,網上的大牛博客多的很,這裏針對請求頭跟請求體,稍微瞭解下通常規律,只是爲了爬蟲準備基礎。web
HTTP請求django
既然萬物皆socket,那麼不論客戶端仍是服務端拿到的必定是一段socket,說白了就是一串字符串。那麼請求頭與請求體,或者響應頭與響應體是如何解析出來的呢?編程
這裏,先查看下google的network內的請求信息:cookie
不管是請求仍是響應都是特別規整的數據。網絡
在Http請求中,請求頭跟請求體之間是經過/r/n/r/n分割開的。session
請求頭內容Accept-Encoding: gzip, deflate, br/r/nContent-Type: application/x-www-form-urlencoded/r/n......./r/n/r/n請求體
如上的一串字符串、會根據/r/n/r/n解析出來請求頭跟請求體,而後根據/r/n來換行。app
響應體也是同樣的套路。
惟一須要特殊提醒的是:
*************************************響應*************************************
普通:
響應頭:
content-encoding:utf8
....
響應體:
<html>.....</html> 重定向: 響應頭: status code location:http://www.baidu.com **************************************************************************
重定向只有響應頭,裏面又一個狀態碼(具體忘了是多少),還有一個location,是指向重定向網址的。
關於GET請求
Get請求只有請求頭。
看到這份需求的第一步,須要先打開github的登錄頁面測試下登錄:
上面的圖片,隨便輸入了帳號密碼測試,發現了兩點
一、帳號密碼驗證是form提交
二、熟悉的字眼token
若是是從django看過來的小夥伴必定會會心一笑、懂了。因此,自動登陸爬取數據的通常流程以下:
一、發送get請求,先獲取到token值
二、發送post請求,進行登錄驗證
三、帶着cookie肆意妄爲
代碼以下:
import requests
from bs4 import BeautifulSoup # 第一步:發送第一次請求,獲取csrftoken r1 = requests.get( url='https://github.com/login' ) bs1 = BeautifulSoup(r1.text, 'html.parser') # 對獲取到的文本對象解析獲取token值 obj_token = bs1.find( name='input', attrs={'name': 'authenticity_token'} ) # token = obj_token.attrs.get('value') # 獲取token值的兩種方式 token = obj_token.get('value') print(token) # 第二步:發送post請求,攜帶用戶名密碼並僞造請求頭 r2 = requests.post( url='https://github.com/session', data={ 'commit': 'Sign in', 'utf8': '✓', 'authenticity_token': token, 'login': 'wuzdandz@qq.com', 'password': 'jiao88' } ) r2_cookie = r2.cookies.get_dict() print(r2_cookie) print(r2.text) # 由於是form data提交因此網頁是走的重定向,獲取狀態碼&location # 一、根據狀態碼;二、根據錯誤提示 # 第三步:訪問我的頁面,攜帶cookie r3 = requests.get( url='https://github.com/settings/repositories', cookies=r2_cookie ) print(r3.text)
測試結果:
此時,github已經提示須要開啓cookies。再來查看一次network:
發現第一次響應頭就帶着cookie了。因此通常流程應該改爲:
一、發送get請求,先獲取到token值和cookie
二、發送post請求,帶入帳號名密碼,cookies進行登錄驗證
三、帶着cookie肆意妄爲
修改下代碼:
import requests
from bs4 import BeautifulSoup # 第一步:發送第一次請求,獲取csrftoken r1 = requests.get( url='https://github.com/login' ) bs1 = BeautifulSoup(r1.text, 'html.parser') obj_token = bs1.find( name='input', attrs={'name': 'authenticity_token'} ) # token = obj_token.attrs.get('value') token = obj_token.get('value') r1_cookie = r1.cookies.get_dict() # 獲取第一次cookie值、格式化成字典 print(r1_cookie) # 第二步:發送post請求,攜帶用戶名密碼並僞造請求頭 r2 = requests.post( url='https://github.com/session', data={ 'commit': 'Sign in', 'utf8': '✓', 'authenticity_token': token, 'login': 'wuzdandz@qq.com', 'password': 'jiao88' }, cookies=r1_cookie # 帶入第一次的cookie作驗證 ) r2_cookie = r2.cookies.get_dict() print(r2_cookie) r1_cookie.update(r2_cookie) # 更新到第一次response的cookie字典裏 print(r1_cookie) # 由於是form data提交因此網頁是走的重定向,獲取狀態碼&location # 一、根據狀態碼;二、根據錯誤提示 # 第三步:訪問我的頁面,攜帶cookie r3 = requests.get( url='https://github.com/settings/repositories', cookies=r1_cookie # 帶入cookie肆意妄爲 ) print(r3.text)
結果:
r3.text: