python之常用模塊三requests

requests簡介

requests是python實現的簡單易用的HTTP庫,使用起來比urllib簡潔很多
因爲是第三方庫,所以使用前需要cmd安裝
pip install requests
安裝完成後import一下,正常則說明可以開始使用了。
詳情見官方文檔http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

1.簡單用法

 #導入requests模塊
 import requests,pprint,json
 # requests.get()用於請求目標網站,嘗試獲取某個網頁
 r = requests.get('https://api.github.com/')
 print(r.status_code)    #響應狀態碼 200
 print(r.content)  # 二進制的內容
 print(r.text)     #字符串
 print(r.json())   #dict  == print(json.loads(r.text)),JSON對象必須是STR、字節或BytErar
 print(r.url)      #獲取url  https://api.github.com/

2.請求頭headers

# 請求頭:就是客戶端在訪問url的時候也就是請求服務器時,會把一些request headers請求頭信息發送給服務器,服務器就可以接收。
'''
作用:告訴HTTP服務器, 客戶端使用的操作系統和瀏覽器的名稱和版本.
我們上網登陸論壇的時候,往往會看到一些歡迎信息,其中列出了你的操作系統的名稱和版本,
你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神奇,實際上,
服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息User-Agent
請求報頭域允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器。
'''
user_Agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' \
            '(KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
header = {'User-Agent':user_Agent}
r = requests.get('https://www.douban.com/',headers= header)
print(r.text)

3.響應headers

# 服務器收到了客戶端提出的要求,現在要把數據返回給客戶端,還有一些response Headers信息給客服端,所以客戶端也能獲取到這些信息。
user_Agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' \
            '(KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
header = {'User-Agent':user_Agent}
r = requests.get('https://www.douban.com/',headers= header)
pprint.pprint(r.headers)    #獲取響應頭

4.url參數以及請求方式

#以微信公衆號開發爲例:
appID='wx4880f9bc5144a729'
APPsecret='61dac4640b7d16ff19e9cab1ca8c108b'

url = f'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appID}&secret={APPsecret}'
result = requests.get(url).json()
print(result)    #微信會返回下述JSON數據包給公衆號
access_token = result.get('access_token')

#另一種方式,與上面效果相同
params = {'grant_type':'client_credential','appid':appID,'secret':APPsecret}
url = 'https://api.weixin.qq.com/cgi-bin/token?'
result = requests.get(url,params=params)    #獲取到access_token
print(result.url)
result = result.json()
print(result)    #微信會返回下述JSON數據包給公衆號
access_token = result.get('access_token')

#得到我們的access_token,用post去請求
#這裏要注意第一次有可能發送失敗會報錯,需要我們自己先給公衆號發送一條信息
#我這裏第一次默認發送的是Hello World,所以不會報錯,因爲hello world 是開發者的共同語言,如過不是可能會有上述問題
url = f'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={access_token}'

req_json = {
    "touser":"olrK61Ro4DDxdDeU7f47qnmPsL9U",  #發給那個用戶   這裏我們要掃碼關注自己的公衆號
    "msgtype":"text",   #類型
    "text":
    {
         "content":"Hello World,你好帥"    #發送內容
    }
}
req_date = json.dumps(req_json,ensure_ascii=False)   #阻止把我們字符串轉換爲Unicode  \u4e2d\u56fd  防止轉換,默認True
json.dumps() #方法返回一個str,內容就是標準的JSON
rsp = requests.post(url,data=req_date.encode('utf-8'))
# 傳遞的時候只能傳遞01010
# 如果data是字符串requests會進行encode的操作,而他使用的編碼類型不受控制
# 所以我們可以自己制定編碼類型,把字符串轉換成二進制數據
print(rsp.json())

5.要判斷響應的狀態碼是否異常(非2…非3…)

url1 = 'http://localhost:8080/500'
rsp = requests.get(url1)
rsp.raise_for_status()   #會拋出 HTTPError的異常,因爲響應狀態碼是500
print(rsp.status_code)  #500
print(rsp.json())
'''
狀態碼解釋,有五種可能取值:
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--信息不完整需要進一步補充
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求
詳情見:https://blog.csdn.net/GarfieldEr007/article/details/77984065
'''

6.cookie的處理

#爲什麼要有Cookie? 因爲HTTP協議是無狀態的
概念:
簡單的說,Cookie就是服務器暫存放在你計算機上的一筆資料,好讓服務器用來辨認你的計算機。
當你在瀏覽網站的時候,Web服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇,
都記錄下來。當下次你再光臨同一個網站,Web服務器會先看看有沒有它上次留下的Cookie資料,有的話,
就會依據Cookie裏的內容來判斷使用者,送出特定的網頁內容給你。

重要:
服務器 響應的headers包含set_cookie, 瀏覽器根據set_cookie的值存儲瀏覽器緩存中
下一次瀏覽器再訪問的時候,會讀取存儲的cookie信息,把他放到Cookie的請求頭裏面
對應服務器就知道你誰誰了

url = 'http://localhost:8080/set/cookie'
r = requests.get(url)
#查看響應設置的cookie
for k,v in r.cookies.items():
    print(k,v)

# # 由於http協議是無狀態的,這裏打印的結果是:沒有得到之前設置的cookie
url = 'http://localhost:8080/has/cookie'
r = requests.get(url)
print(r.text)    #響應的headers包含set_cookie  這裏我們沒有加

#針對上述問題,就延伸出會話保持session
session = requests.Session()   #存儲Cookie
r = session.get('http://localhost:8080/set/cookie')
print(r.text)   #設置cookie
for k,v in r.cookies.items():
    print(k,v)   #username gavin

url = 'http://localhost:8080/has/cookie'  #重新請求,得到了之前設置的cookie: gavin,上述打印的是沒有得到之前設置的cookie
r = session.get(url)
print(r.text)

7.重定向

# 301是永久重定向,而302是臨時重定向
# 瀏覽器訪問http://www.baidu.com/ 地址百度服務器 發現你使用的http,不安全
# 百度告訴 Status Code: 307    Location: https://www.baidu.com/
# Location(重定向到那個網址):應該重定向到 https://www.baidu.com/ 這個地址
# 於是瀏覽器訪問了 https://www.baidu.com/

r = requests.get("http://github.com",allow_redirects = True)  #allow_redirects:允許重定向
print(r.url,r.status_code,r.history[0].url)  #https://github.com/ 200 [<Response [301]>]
# history:歷史訪問記錄
#重定向到:https://github.com/ 200 歷史紀錄:http://github.com/
#打印歷史紀錄
for h in r.history:
    print(h.url)

8.timeout 超時的關鍵字參數

 如果你請求服務器,服務器的處理超過你的timeout的參數 那麼則會拋出requests.exceptions.ConnectTimeout的異常
	from requests.exceptions import ReadTimeout
	try:
	    r = requests.get("http://localhost:8080/", timeout=8)
	except ReadTimeout as err:
	    print(str(err))
	else:
	    print(r.text)

9.代理的設置,通過proxies參數

proxies = {
    'http':'http://58.53.128.83:3128',
    'https':'https://219.234.5.128:3128'
}

url = 'https://www.baidu.com'
r = requests.get(url,proxies=proxies)
print(r.url)
print(r.text)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章