requests模塊

標籤(空格分隔): requestshtml


 環境配置

  • pip install requests

get請求:

1.導入requests後,用get方法就能直接訪問url地址,如:http://www.cnblogs.com/surewing/,看起來是否是很酷
2.這裏的r也就是response,請求後的返回值,能夠調用response裏的status_code方法查看狀態碼
3.狀態碼200只能說明這個接口訪問的服務器地址是對的,並不能說明功能OK,通常要查看響應的內容,r.text是返回文本信息python

image.png-125.6kB

 params

1.再發一個帶參數的get請求,如在博客園找找看:surewing,url地址爲:http://zzk.cnblogs.com/s/blogpost?Keywords=surewing
2.請求參數:Keywords=surewing,能夠以字典的形式傳參:{"Keywords": "surewing"}
3.多個參數格式:{"key1": "value1", "key2": "value2", "key3": "value3"}
image.png-27.7kBgit

content

1.咱們有時候響應的結果若是有亂碼,是須要解碼,在fiddler裏面就是如此的;
2.在代碼裏面,他會的內容會自動解碼的;
3.content會自動解碼 gzip 和deflate壓縮github

response

1.response的返回內容還有其它更多信息
r.status_code     #響應狀態碼
r.content           #字節方式的響應體,會自動爲你解碼 gzip 和 deflate 壓縮
r.headersajax

以字典對象存儲服務器響應頭,可是這個字典比較特殊,字典鍵不區分大小寫,若鍵不存在則返回Nonejson

r.json()             #Requests中內置的JSON解碼器
r.url                  # 獲取url
r.encoding         # 編碼格式
r.cookies           # 獲取cookie
r.raw                #返回原始響應體
r.text服務器

字符串方式的響應體,會自動根據響應頭部的字符編碼進行解碼cookie

r.raise_for_status() ,#失敗請求(非200響應)拋出異常session

data和json區分:

在發post請求的時候,有時候body部分要傳data參數,有時候body部分又要傳json參數,那麼問題來了:到底何時該傳json,何時該傳data?
1.post請求的body一般有四種類型,最多見的就是json格式了,這個仍是很好識別的:工具

image.png-82.8kB

2.用抓包工具查看,首先點開Raw去查看body部分,以下圖這種,參數最外面是大括號{   }包起來的,這種已經確診爲json格式了。

image.png-119.5kB

3.再一次確認,能夠點開Json這一項查看,點開以後能夠看到這裏的幾組參數是json

image.png-34.8kB

2、識別data參數
1.data參數也就是這種格式:key1=value1&key2=value2...這種格式很明顯沒有大括號
點開Raw查看,跟上面的json區別仍是很大的

image.png-91.7kB

2.由於這個是非json的,因此點開Json這個菜單是不會有解析的數據的,這種數據在WebForms裏面查看

3.能夠看到這種參數顯示在Body部分,左邊的Name這項就是key值,右邊的Value就是對應的value值,像這種參數轉化從python的字典格式就好了

json數據處理

有些post的請求參數是json格式的,須要導入json模塊處理;
通常常見的接口返回數據也是json格式的,咱們在作判斷時候,每每只須要提取其中幾個關鍵的參數就行,這時候就須要json來解析返回的數據。

encode:Encode(python->json)

1.首先說下爲何要encode,python裏面bool值是True和False,json裏面bool值是true和false,而且區分大小寫,這就尷尬了,明明都是bool值。
在python裏面寫的代碼,傳到json裏,確定識別不了,因此須要把python的代碼通過encode後成爲json可識別的數據類型。
2.舉個簡單例子,下圖中dict類型通過json.dumps()後變成str,True變成了true,False變成了fasle

#!/usr/bin/env python
# coding=utf-8

import requests
import json
payload={'wing':True,
         "json":False,
         'python':'22222345'}
print(type(payload))

#轉化爲json格式:
data_json = json.dumps(payload)
print(type(data_json))
print(data_json)

執行結果:

<class 'dict'>
<class 'str'>
{"wing": true, "json": false, "python": "22222345"}

decode(json->python)

1.若是一個例子的結果:{"success":true},咱們其實最想知道的是success這個字段返回的是True仍是False
2.若是以content字節輸出,返回的是一個字符串:{"success":true},這樣獲取後面那個結果就不方便了
3.若是通過json解碼後,返回的就是一個字典:{u'success': True},這樣獲取後面那個結果,就用字典的方式去取值:result2["success"]
image.png-40.2kB

2、
1.好比打開快遞網:http://www.kuaidi.com/,搜索某個單號,判斷它的狀態是否是已簽收
image.png-132.8kB
2.代碼以下:

#!/usr/bin/env python
# coding=utf-8
import requests
url = "http://www.kuaidi.com/index-ajaxselectcourierinfo-1202247993797-yunda.html"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0"}# get方法其它加個User-Agent就能夠了
s = requests.session()
r = s.get(url, headers=headers,verify=False)
result = r.json()
data = result["data"]# 獲取data裏面內容
print(data)
print(data[0])# 獲取data裏最上面有個
get_result = data[0]['context']# 獲取已簽收狀態
print(get_result)

if u"已簽收" in get_result:
    print("快遞單已簽收成功")
else:
    print("未簽收")

常見網站登陸案例參考(github源碼下載)

github上常見的一些網站登陸案例參考:
1. 知乎:https://github.com/xchaoinfo/fuck-login/tree/master/001%20zhihu

  1. 126:https://github.com/xchaoinfo/fuck-login/tree/master/002%20126
    3.微博:https://github.com/xchaoinfo/fuck-login/tree/master/003%20weibo.cn其它更多:https://github.com/xchaoinfo/fuck-login
相關文章
相關標籤/搜索