python-requests向伺服器傳送請求(post/get)
python處理http請求有很多庫,,比如python的原生庫:urllib包、requests類庫等
requests庫和urllib包對比:
urllib和urllib2是相互獨立的模組,python3.0以上把urllib和urllib2合併成一個庫了,requests庫使用了urllib3。requests庫的口號是“HTTP For Humans”,為人類使用HTTP而生,用起來不知道要比python原生庫好用多少呢,比起urllib包的繁瑣,requests庫特別簡潔和容易理解。
從以下幾個方面進行對比:
1)構建引數:在構建請求引數時,第一種需要將請求引數使用urllib庫的urlencode方法進行編碼預處理,非常麻煩
2)請求方法:傳送get請求時,第一種使用的urllib庫的urlopen方法開啟一個url地址,而第二種直接使用requests庫的get方法,與http請求方式是對應的,更加直接、易懂
3)請求資料:第一種按照url格式去拼接一個url字串,顯然非常麻煩,第二種按順序將get請求的url和引數寫好就可以了
4)處理響應:第一種處理訊息頭部、響應狀態碼和響應正文時分別使用.info()、.getcode()、.read()方法,第二種使用.headers、.status_code、.text方法,方法名稱與功能本身相對應,更方便理解、學習和使用
5)連線方式:看一下返回資料的頭資訊的“connection”,使用urllib庫時,"connection":"close",說明每次請求結束關掉socket通道,而使用requests庫使用了urllib3,多次請求重複使用一個socket,"connection":"keep-alive",說明多次請求使用一個連線,消耗更少的資源
6)編碼方式:requests庫的編碼方式Accept-Encoding更全,
ps:requests庫的官網是http://www.python-requests.org/en/master/,裡面有操作文件
介紹下requests庫的使用
# HTTP請求型別 # get型別 r = requests.get('https://github.com/timeline.json') # post型別 r = requests.post("http://m.ctrip.com/post") # put型別 r = requests.put("http://m.ctrip.com/put") # delete型別 r = requests.delete("http://m.ctrip.com/delete") # head型別 r = requests.head("http://m.ctrip.com/head") # options型別 r = requests.options("http://m.ctrip.com/get") # 獲取響應內容 print(r.content) #以位元組的方式去顯示,中文顯示為字元 print(r.text) #以文字的方式去顯示 #URL傳遞引數 payload = {'keyword': '香港', 'salecityid': '2'} r = requests.get("http://m.ctrip.com/webapp/tourvisa/visa_list", params=payload) print(r.url) #示例為http://m.ctrip.com/webapp/tourvisa/visa_list?salecityid=2&keyword=香港 #獲取/修改網頁編碼 r = requests.get('https://github.com/timeline.json') print (r.encoding) #json處理 r = requests.get('https://github.com/timeline.json') print(r.json()) # 需要先import json # 定製請求頭 url = 'http://m.ctrip.com' headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'} r = requests.post(url, headers=headers) print (r.request.headers) #複雜post請求 url = 'http://m.ctrip.com' payload = {'some': 'data'} r = requests.post(url, data=json.dumps(payload)) #如果傳遞的payload是string而不是dict,需要先呼叫dumps方法格式化一下 # post多部分編碼檔案 url = 'http://m.ctrip.com' files = {'file': open('report.xls', 'rb')} r = requests.post(url, files=files) # 響應狀態碼 r = requests.get('http://m.ctrip.com') print(r.status_code) # 響應頭 r = requests.get('http://m.ctrip.com') print (r.headers) print (r.headers['Content-Type']) print (r.headers.get('content-type')) #訪問響應頭部分內容的兩種方式 # Cookies url = 'http://example.com/some/cookie/setting/url' r = requests.get(url) r.cookies['example_cookie_name'] #讀取cookies url = 'http://m.ctrip.com/cookies' cookies = dict(cookies_are='working') r = requests.get(url, cookies=cookies) #傳送cookies #設定超時時間 r = requests.get('http://m.ctrip.com', timeout=0.001) #設定訪問代理 proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.100:4444", } r = requests.get('http://m.ctrip.com', proxies=proxies) #如果代理需要使用者名稱和密碼,則需要這樣: proxies = { "http": "http://user:[email protected]:3128/", }
json中json.loads()和json.dumps()的區別
json.loads() 是將字串傳化為字典
json.dumps () 是將字典轉化為字串
舉列
一、python向伺服器傳送一個帶引數的get請求
import requests import json def fun_httpget(): date1={'wd': 'python'} r = requests.get(url='https://dict.baidu.com/s',params=date1) r.text print(r.text) fun_httpget()
響應結果為html格式內容,開啟即為我們百度搜索python結果
二、python向伺服器傳送一個post請求。
請求報文格式為json格式,
#coding=utf-8 from urllib import request, parse import urllib import requests import json import excelTestConfigure import Log def fun_httprequest(dict_qurey_data): logname='request_post' url = 'http://ip:port/path' print(url) s = json.dumps(dict_qurey_data) print(s) headers = {'Content-Type': 'servicejson;charset=UTF-8'} r = requests.post(url=url, data=dict_qurey_data,headers=headers) respode=r.text print('響應報文為') print (respode) ret_dict = json.loads(respode)#��str����ת��Ϊdict���� return ret_dict dict_qurey_data="{'client_name': 'TRUE,0', 'card_no': '6216610100008898222', 'partner_trans_time': '192552', 'partner_trans_date': '201705101', 'partner_serial_no': 'AutoTestJin20201201192552934659', 'cvv2': '987', 'mobile_tel': '15988179711', 'pay_bankacct_type': '0', 'id_kind': '0', 'partner_id': 'A0003123', 'valid_date': '0817', 'id_no': '320113196912021509', 'func_code': '1'}" fun_httprequest(dict_qurey_data)
可以得到伺服器結果的請求和響應
參考:https://www.cnblogs.com/lanyinhao/p/9634742.html