1. 程式人生 > >urllib和request的區別總結

urllib和request的區別總結

urllib and urllib2 區別

–博主提示:下面的是python2中的用法,python3需要做出相應修改。

urllib和urllib2模組都做與請求URL相關的操作,但他們提供不同的功能。 
urllib2.urlopen accepts an instance of the Request class or a url, (whereas urllib.urlopen only accepts a url 中文意思就是:urllib2.urlopen可以接受一個Request物件或者url,(在接受Request物件時候,並以此可以來設定一個URL的headers),urllib.urlopen只接收一個url 
urllib 有urlencode,urllib2沒有,這也是為什麼總是urllib,urllib2常會一起使用的原因

 r = Request(url='http://www.mysite.com')
 r.add_header('User-Agent', 'awesome fetcher')
 r.add_data(urllib.urlencode({'foo': 'bar'})
 response = urllib2.urlopen(r)     #post method

I. Requests 

使用的是 urllib3,繼承了urllib2的所有特性。Requests支援HTTP連線保持和連線池,支援使用cookie保持會話,支援檔案上傳,支援自動確定響應內容的編碼,支援國際化的 URL 和 POST 資料自動編碼。 II. 舉例:

 import requests
 ...

 resp = requests.get('http://www.mywebsite.com/user')
 userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
 resp = requests.post('http://www.mywebsite.com/user', params=userdata)
 resp = requests.put('http://www.mywebsite.com/user/put')
 resp = requests.delete('http://www.mywebsite.com/user/delete')
 resp.json()   # 假如返回的是json資料
 resp.text     #返回的不是text資料
 resp.headers['content-type']  #返回text/html;charset=utf-8
 f = open('request_index.html', 'w')
 f.write(page.encode('utf8'))          
 #test 發現requests抓下來的頁面必須要編碼\
 #寫入,(抓下來的是unicode),urllib和urllib2抓下來可以直接寫入,
 #因為這兩者抓下來的page是str
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

III. 其他功能特性

國際化域名和 URLs
Keep-Alive & 連線池
持久的 Cookie 會話
類瀏覽器式的 SSL 加密認證 
基本/摘要式的身份認證
優雅的鍵/值 Cookies
自動解壓
Unicode 編碼的響應體
多段檔案上傳
連線超時
支援 .netrc
適用於 Python 2.6—3.4
執行緒安全
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

IV. requests不是python自帶的庫,需要另外安裝 easy_install or pip install

V. requests缺陷:直接使用不能非同步呼叫,速度慢(from others)。官方的urllib可以替代它。

VI. 個人不建議使用requests模組


urllib模組是python自帶的,直接呼叫就好,用法如下:

複製程式碼
 1 #處理get請求,不傳data,則為get請求
 2 import urllib
 3 from urllib.request import urlopen
 4 from urllib.parse import urlencode
 5 url='http://127.0.0.1:1990/login'
 6 data={"username":"admin","password":123456}
 7 req_data=urlencode(data)#將字典型別的請求資料轉變為url編碼
 8 res=urlopen(url+'?'+req_data)#通過urlopen方法訪問拼接好的url
 9 res=res.read().decode()#read()方法是讀取返回資料內容,decode是轉換返回資料的bytes格式為str
10 print(res)
11 
12 #處理post請求,如果傳了data,則為post請求
13 import urllib
14 from urllib.request import urlopen
15 from urllib.request import Request
16 from urllib.parse import urlencode
17 url='http://127.0.0.1:1990/login'
18 data={"username":"admin","password":123456}
19 data=urlencode(data)#將字典型別的請求資料轉變為url編碼
20 data=data.encode('ascii')#將url編碼型別的請求資料轉變為bytes型別
21 req_data=Request(url,data)#將url和請求資料處理為一個Request物件,供urlopen呼叫
22 with urlopen(req_data) as res:
23     res=res.read().decode()#read()方法是讀取返回資料內容,decode是轉換返回資料的bytes格式為str
24 print(res)
複製程式碼

相比較urllib模組,requests模組要簡單很多,具體用法如下:

複製程式碼
 1 # get請求
 2 import requests
 3 url='http://127.0.0.1:1990/login'
 4 data={"username":"admin","password":123456}
 5 res=requests.get(url,data)#直接用requests.get(url,data)即可,其中.get表示為get方法,不需要對字典型別的data進行處理
 6 #res=res.text#text方法是獲取到響應為一個str,也不需要對res進行轉換等處理
 7 res=res.json()#當返回的資料是json串的時候直接用.json即可將res轉換成字典
 8 print(res)
 9 
10 #post請求
11 import requests
12 url='http://127.0.0.1:1990/login'
13 data={"username":"admin","password":123456}
14 res=requests.post(url,data)#直接用requests.post(url,data)即可,其中.post表示為post方法,不需要對字典型別的data進行處理
15 #res=res.text#text方法是獲取到響應為一個str,也不需要對res進行轉換等處理
16 res=res.json()#當返回的資料是json串的時候直接用.json即可將res轉換成字典
17 print(res)
18 
19 #當傳參格式要求為json串時
20 import requests
21 url='http://127.0.0.1:1990/login'
22 data={"username":"admin","password":123456}
23 res=requests.post(url,json=data)#只需要在這裡指定data為json即可
24 #res=res.text#text方法是獲取到響應為一個str,也不需要對res進行轉換等處理
25 res=res.json()#當返回的資料是json串的時候直接用.json即可將res轉換成字典
26 print(res)
27 
28 #傳參含cookie
29 import requests
30 url='http://127.0.0.1:1990/login'
31 data={"username":"admin","password":123456}
32 cookie={"sign":"123abc"}
33 res=requests.post(url,json=data,cookies=cookie)#只需要在這裡指定cookies位cookie即可,headers,files等類似
34 res=res.json()
35 print(res)
複製程式碼

相關推薦

urllibrequest區別總結

urllib and urllib2 區別–博主提示:下面的是python2中的用法,python3需要做出相應修改。urllib和urllib2模組都做與請求URL相關的操作,但他們提供不同的功能。 urllib2.urlopen accepts an instance o

GETPOST區別總結

get 、post 、區別一、GET和POST區別的普遍看法:HTTP 定義了與服務器交互的不同方法,最常用的有4種,Get、Post、Put、Delete,如果我換一下順序就好記了,Put(增),Delete(刪),Post(改),Get(查),即增刪改查,下面簡單敘述一下:1)Get, 它用於獲取信息,註

Java中equals==的區別總結

1)對於==,如果作用於基本資料型別的變數,則直接比較其儲存的 “值”是否相等;如果作用於引用型別的變數,則比較的是所指向的物件的地址。 2)對於equals方法,equals方法是Object的,所有繼承了Object類的類都有該方法,注意:equals方法不能作用於基本資料型別的變數

Sass、LESS Stylus區別總結

CSS 前處理器技術已經非常的成熟了,而且也湧現出了越來越多的 CSS 的前處理器框架。本文便總結下 Sass、Less CSS、Stylus這三個前處理器的區別和各自的基本語法。 1.什麼是 CSS 前處理器 CSS 前處理器是一種語言用來為 CSS 增加一些程式設計的的

攔截器過濾器區別總結

因為過濾器Filter是servlet相關的由serviette容器tomcat管理,而攔截器Interceptor是spring管理,因為web程式執行過程就是先啟動tomcat容器,之後再在容器中呼叫spring那些東西,所以首先我猜測順序是先走Filter過濾器 後進

urllib request 對比

在HTTP相關處理中使用python是不必要的麻煩,這包括urllib2模組以巨大的複雜性代價獲取綜合性的功能。相比於urllib2,Kenneth Reitz的Requests模組更能簡約的支援完整的簡單用例。 簡單的例子: 想象下我們試圖使用get方法從

javaweb中重定向請求轉發(response.sendRedirect()request.getRequestDispatcher(rul).forward(request,response)))的區別

客戶端 不起作用 這也 方法 cnblogs rect() 獲取url rec alt 先來兩張圖,方便理解: 可以看出,重定向時,是服務器向遊覽器重新發送了一個response命令,讓遊覽器再次向url2發送請求,以獲取url2的資源 而請求轉發時,類似於是服務器自己

pageContext、request、sessionapplication區別

一個 斷網 發出 可能 使用 -s size ssi attr pageContext,request,session,application是指變量(對象)的生命周期,它們都可以通過setAttribute()和getAttribute()來設定或讀取屬性。 pageCo

非接觸IC卡中typeA卡typeB卡的區別--總結,二者的調制方式編碼方式不同

優劣 進制數 發送 們的 -1 通過 title 支持 有關 非接觸IC卡中typeA卡和typeB卡的區別--總結,二者的調制方式和編碼方式不同 1.非接觸式IC卡的國際規範ISO/IEC14443的由來? 在非接觸式IC卡的發展過程中,這些問題逐漸被解決並形成通用的標

response.sendRedirect()request.getRequestDispatcher().forward(request,response)的區別

解決 新的 rain nbsp 響應 服務 war 站點 不知道 轉發方式:request.getRequestDispatcher().forward(); 重定向方式:response.sendRedirect(); 下面是HttpServletResponse.s

ObservableCollectionList的區別總結

con 動態 操作 enume 事件 運行 表示 類的方法 更新 一、繼承的類和接口,還有它們的方法不同 1)ObservableCollection比較簡單,繼承了Collection, INotifyCollectionChanged, INotifyProperty

2018年1月17日總結 css3裏transition animation 區別

owin cti 產生 自動 function 屬性。 ans 移動 介紹 transition 和animation兩個CSS3屬性經常被用到實際項目中,想把它整理出來。 1.先介紹transition >>>>> a. 在做項目

RedisMemcache的區別總結

font 自己 持久性 類型 面具 最大的 利用 eight con 數據類型 redis數據類型豐富,支持set liset等類型 memcache支持簡單數據類型,需要客戶端自己處理復雜對象 持久性 redis支持數據落地持久化存儲 memcac

HTTP請求中的form datarequest payload的區別(request 後臺無法獲取參數)

origin logger res 部分 padding ble 處理 代碼 恰恰 轉載自:btg.yoyo jQuery的ajax方法和post方法分別發送請求,在後臺Servlet進行處理時結果是不一樣的,比如用$.ajax方法發送請求時(data參數是一個JSON.

request.form()request()的區別

限制 數據信息 顯示 for clas https ref ble 地址欄 Request.Form:獲取以POST方式提交的數據(接收Form提交來的數據);Request.QueryString:獲取地址欄參數(以GET方式提交的數據)Request:包含以上兩種方式(

request.getAttribute() request.getParameter() 有何區別?

傳遞 數據類型 get 客戶端 傳遞數據 永遠 object string類 ram 當你要傳遞普通的數據類型給下一個頁面時,你在下一個頁面中就可以用getParameter()方法來獲得上一個頁面傳遞過來的數據了!(普通的數據類型是指int,float,double,st

springmvc-ModelModelAndView的區別以及request區別

  前言         用過springMvc的小夥伴都知道,一般而言我們返回頁面檢視的時候會有兩種可能,就是本文題目中的兩個類。其實本文就是想要對比一下這兩個類在spring的檢視解析中的作用以及區

簡單解析request.getParameter(String arg0)方法request.getAttribute()方法的區別

1.request.getParameter(String arg0)方法 當兩個web元件為連結關係時,被連結元件通過getParameter()方法來獲得引數(獲取Http提交過來的資料如表單) 例: <%@ page language="java" import="jav

說說&&& |||的區別 及關於位操作符的使用總結

參考資料: 張孝祥老師整理的Java就業面試題大全 Java開發實戰經典(李興華老師) 及http://hi.baidu.com/onjee/blog/item/4e902d1f3450040f304e15ca.html package src;/** 本示例演示&和&

select epoll 的區別總結

在Linux中,select 和epoll函式,都是為了監控大量的描述符,是一種I/O多路複用技術。下面總結它們的區別: select 與 epoll區別 1、開啟的最大描述符數量限制    select 檔案描述符使用的是linux ext3,因此開啟數量受限制,一