Datawhale-爬蟲-Task1(學習get與post請求)
Get與Post請求
本質: get和post本質上都是TCP連結,並無差別,只是由於HTTP的規定和瀏覽器/伺服器的限制,導致他們在應用過程中體現出一些不同。
Get產生一個TCP資料包;Post產生兩個TCP資料包。
對於GET方式的請求,瀏覽器會把http header和data一併傳送出去,伺服器響應200(返回資料);對於POST,瀏覽器先傳送header,伺服器響應100(continue),然後再傳送data,伺服器響應200(返回資料);
對於HTTP協議的GET和POST,他們只有一點根本區別, 一個用於獲取資料,一個用於修改資料。
requests庫和urllib庫的區別
示例:分別用requests庫和urllib庫向百度傳送一個請求,並將其返回結果輸出
urllib庫:
import urllib.request
url = "https://www.baidu.com"
r = urllib.request.urlopen(url)
print("Response Headers:")
print(r.info())
print('-'*50)
print("Status Code:",r.getcode())
print("Response Body:")
print(r.read())
返回結果:
requests庫:
import requests
url = "https://www.baidu.com"
r = requests.get(url)
r.encoding = 'utf-8'
print("Response Headers:")
print(r.headers)
print('-'*50)
print("Status Code:",r.status_code)
print("Response Body:")
print(r.text)
返回結果:
兩者比較:
1)請求方法:傳送get請求時,第一種使用的urllib庫的urlopen方法開啟一個url地址,而第二種直接使用requests庫的get方法,與http請求方式是對應的,更加直接、易懂
2)請求資料:第一種按照url格式去拼接一個url字串,顯然非常麻煩,第二種按順序將get請求的url和引數寫好就可以了
3)處理響應:第一種處理訊息頭部、響應狀態碼和響應正文時分別使用info()、getcode()、read()方法,第二種使用.headers、.status_code、.text方法,方法名稱與功能本身相對應,更方便理解、學習和使用。
4)連線方式:看一下返回資料的頭資訊的“connection”,使用urllib庫時,“connection”:“close”,說明每次請求結束關掉socket通道,而使用requests庫使用了urllib3,多次請求重複使用一個socket,“connection”:“keep-alive”,說明多次請求使用一個連線,消耗更少的資源。
5)編碼方式:requests庫的編碼方式Accept-Encoding更全,在此不做舉例。
由此可見,requests庫更容易理解和閱讀,符合Python哲學“Readability counts”,可讀性很重要~更利於開發人員學習和使用
斷網後發出申請的結果
requests庫:
urillb庫:
申請返回的狀態碼
分類
定義: HTTP的狀態碼是由三個十進位制的數字組成,第一個數字表示狀態碼的型別,後兩個字沒有分別的作用,http的狀態碼分為5類
1** :表示的是伺服器收到了請求,需要請求者繼續執行操作
2** :表示的是請求成功,
3** :重定向 需要進一步的操作來完成請求
4** :客戶端錯誤,請求包含語法錯誤或者是無法完成的請求
5** :伺服器錯誤,伺服器在處理請求的時候出錯
常見HTTP狀態碼:
- 200 -請求成功
- 301 -資源被轉移到其他url
- 404 -請求的資源不存在
- 500 -伺服器的內部出錯
狀態碼列表
狀態碼 | 狀態碼英文名稱 | 中文描述 |
---|---|---|
100 | Countinue | 繼續,客戶端應該繼續他的請求 |
101 | Switching Protocols | 切換協議 |
200 | OK | 請求成功,一般用於GET與POST請求 |
201 | Created | 以建立。成功請求並建立了新的資源 |
202 | Accepted | 以接受,已接受請求,但是為處理完成 |
203 | Non-Authoritative Information | 非授權資訊,請求成功,返回的資料為原始資料 |
204 | No Content | 無內容,伺服器處理成功但是沒有返回資料 |
205 | Reset Content | 重置內容,伺服器處理成功,客戶端應該重置文件檢視 |
206 | Partial Content | 部分內容,伺服器處理了部分的get請求 |
300 | Multiple Choices | 多種選擇,請求的資源包括多個位置 |
301 | Moved Permanently | 永久的移動,請求的資源已經被永久的移動到新的url |
302 | Found | 臨時移動,和 301相似 但是資源只是臨時的移動,客戶端應繼續使用原本的url |
303 | See Other | 檢視其他地址,與301類似使用GET和POST請求檢視 |
304 | Not Modified | |
305 | Use Proxy | 使用代理,訪問的資源必須通過代理訪問 |
307 | Temporary Redirect | 臨時重定向 和302 相似 使用的是GET請求重定向 |
400 | BadRequest | 客戶端語法錯誤,服務端無法理解 |
401 | Unauthorized | 請求需要使用者的身份認證 |
402 | Payment Required | 保留,將來使用 |
403 | Forbidden | 伺服器理解客戶端的請求但是,拒絕執行請求 |
404 | Not Found | 伺服器找不到相應的資源 |
405 | Not Acceptable | 客戶端請求中的方法被禁止 |
406 | Not Acceptable | 伺服器無法根據客戶端請求的內容特性完成請求 |
407 | Proxy Authentication Required | 請求要求代理的身份認證,與401類似,但請求者應當使用代理進行授權 |
408 | Request Time-out | 伺服器等待客戶端傳送的請求時間過長,超時 |
409 | Conflict | 伺服器完成客戶端的PUT請求是可能返回此程式碼,伺服器處理請求時發生了衝突 |
410 | Gone | 客戶端請求的資源已經不存在。410不同於404,如果資源以前有現在被永久刪除了可使用410程式碼,網站設計人員可通過301程式碼指定資源的新位置 |
411 | Length Required | 伺服器無法處理客戶端傳送的不帶Content-Length的請求資訊 |
412 | Precondition Failed | 客戶端請求資訊的先決條件錯誤 |
413 | Request Entity Too Large | 由於請求的實體過大,伺服器無法處理,因此拒絕請求。為防止客戶端的連續請求,伺服器可能會關閉連線。如果只是伺服器暫時無法處理,則會包含一個Retry-After的響應資訊 |
414 | Request-URI Too Large | 請求的URI過長(URI通常為網址),伺服器無法處理 |
415 | Unsupported Media Type | 伺服器無法處理請求附帶的媒體格式 |
416 | Requested range not satisfiable | 客戶端請求的範圍無效 |
417 | Expectation Failed | 伺服器無法滿足Expect的請求頭資訊 |
500 | Internal Server Error | 伺服器內部錯誤,無法完成請求 |
501 | Not Implemented | 伺服器不支援請求的功能,無法完成請求 |
502 | Bad Gateway | 充當閘道器或代理的伺服器,從遠端伺服器接收到了一個無效的請求 |
503 | Service Unavailable | 由於超載或系統維護,伺服器暫時的無法處理客戶端的請求。延時的長度可包含在伺服器的Retry-After頭資訊中 |
504 | Gateway Time-out | 充當閘道器或代理的伺服器,未及時從遠端伺服器獲取請求 |
505 | HTTP Version not supported | 伺服器不支援請求的HTTP協議的版本,無法完成處理 |
什麼是請求頭,如何新增請求頭
定義
通俗來講,就是能夠告訴被請求的伺服器需要傳送什麼樣的格式的資訊。
HTTP客戶程式(例如瀏覽器),向伺服器傳送請求的時候必須指明請求型別(一般是GET或者POST)。如有必要,客戶程式還可以選擇傳送其他的請求頭。大多數請求頭並不是必需的,但Content-Length除外。對於POST請求來說Content-Length必須出現。
使用requests庫新增請求頭
import requests
url = "http://baidu.com"
header = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*,q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive' }
r = requests.post(url, headers=header)
head = r.headers #響應頭
print(head)
print('-'*80)
print(r.request.headers) #請求頭
返回結果:
相關文章
- 4.爬蟲 requests庫講解 GET請求 POST請求 響應爬蟲
- POST與GET請求區別
- get與post的請求區別
- Datawhale-爬蟲-Task4(學習xpath)爬蟲
- Datawhale-爬蟲-Task5(selenium學習)爬蟲
- 爬蟲快速入門——Get請求的使用爬蟲
- iOS 同步請求 非同步請求 GET請求 POST請求iOS非同步
- HTTP Get,Post請求詳解HTTP
- Get和Post請求詳解
- 利用post請求傳送內容進行爬蟲爬蟲
- get請求和post請求的區別
- vue 發起get請求和post請求Vue
- 安卓基礎-get post請求與提交資料安卓
- Android Http請求框架一:Get 和 Post 請求AndroidHTTP框架
- Android okHttp網路請求之Get/Post請求AndroidHTTP
- java傳送GET和post請求Java
- go對get、post請求封裝Go封裝
- get,post URL加字尾請求
- PHP傳送POST和GET請求PHP
- Java Http Get Post 請求工具類JavaHTTP
- get請求和post請求區別詳解
- uni-app的POST請求和GET請求APP
- SpringMVC中如何傳送GET請求、POST請求、PUT請求、DELETE請求。SpringMVCdelete
- Datawhale-爬蟲-Task6(學習IP相關知識)爬蟲
- Requests如何在Python爬蟲中實現get請求?Python爬蟲
- Http請求get與post請求方式的各種相關面試總結HTTP面試
- 【轉】怎麼用PHP傳送HTTP請求(POST請求、GET請求)?PHPHTTP
- java apache commons HttpClient傳送get和post請求的學習整理JavaApacheHTTPclient
- Python爬蟲Post請求返回值為-1000Python爬蟲
- axios 發get,post 請求小結iOS
- httprequest- post- get -傳送請求HTTP
- get和post請求的區別(面試)面試
- php 利用socket傳送GET,POST請求PHP
- java傳送http的get、post請求JavaHTTP
- axios的post請求爬坑iOS
- Datawhale-爬蟲-Task3(beautifulsoup)爬蟲
- http請求之get和post的區別HTTP
- 優雅地使用GET和POST請求方法