requests模塊的使用方法——session,response屬性


兩個主要的函數:

  get

  post

  

import requests
kwd = "吳秀波出軌門"
# URL編碼
from urllib.parse import urlencode
res = urlencode({"wd":kwd})
print(res)

headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}

url = "https://www.baidu.com/s"
#直接將參數放在 params中 會自動進行url編碼
response =  requests.get(url,headers=headers,params={"wd":kwd})
print(response.status_code)
print(response.text)

  

添加數據到請求頭中

response =  requests.get(url,headers={
    # 把你的數據加在這里
},params={"wd":kwd})
print(response.status_code)
print(response.text)

  

post請求參數

其他參數與get一致,請求體放在data中

requests.post(data={})

  

返回值的處理

response =  requests.get(url,headers=headers,params={"wd":kwd})
print(response.status_code) # 狀態碼
print(response.text) # 將結果以文本的形式返回
res1=response.content # 將結果以二進制的方式返回
res2=response.json() # 將數據直接反序列化得到字典或是列表

  

requests模塊的其它用法

session可以幫助我們自定完成cookie的存儲和發送

import requests
# 創建一個session對象
session = requests.session()

1.請求登錄頁面

res = session.get("https://github.com/login",headers={
    "Referer": "https://github.com/",
    "User-Agent": user_agent
})
print(res.status_code)
token = re.search('name="authenticity_token" value="(.*?)"',res.text).group(1)
print(token)

 

2.發送登錄請求,帶上cookie,帶上請求體

res2 = session.post("https://github.com/session",
                     headers = {
                         "Referer": "https://github.com/login",
                         "User-Agent": user_agent},
                     data={
                         "commit": "Sign in",
                         "utf8": "✓",
                         "authenticity_token": token,
                         "login": "oldboyedujerry",
                         "password": "123654asdAsd"},
                     allow_redirects = False
                     )

print(res2.status_code)

訪問個人主頁

res3 = session.get("https://github.com/settings/profile",
                    headers={
                        "User-Agent": user_agent,
                        "Referer": "https://github.com/login"
                    })

print(res3.status_code)

with open("tt.html","wt") as f:
    f.write(res3.text)
# 判斷是否登錄成功
print("oldboyedujerry" in  res3.text)

  

""
    session可以幫助我們自定完成cookie的存儲和發送
"""
import requests
# 創建一個session對象
session = requests.session()

"""
1.請求登陸頁面 獲取token cookie
2.發生登陸的post請求,將用戶名密碼 和token 放在請求體中,cookie放在請求頭中

"""
import requests
import re
login_url = "https://github.com/login"

headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}

res1 = session.get(login_url,headers=headers)

print(res1.status_code)
# 從響應體中獲取token
token = re.search('name="authenticity_token" value="(.*?)"',res1.text).group(1)
print(token)
# 保存cookie
# login_cookie = res1.cookies.get_dict()
# print(login_cookie)

# 發送登陸請求
res2 = session.post("https://github.com/session",
              headers={
                  "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"},
              data={
                "commit": "Sign in",
                "utf8": "✓",
                "authenticity_token": token,
                "login": "yangyuanhu",
                "password": "123654asd"},
                # 是否允許自動重定向
                allow_redirects = False)
print(res2.status_code)

# 用戶登錄成功后的cookie
# user_cookie = res2.cookies.get_dict()

# 訪問主頁
res3 = session.get("https://github.com/settings/profile",headers = headers)
print(res3.status_code)
print(res3.text)
# "https://github.com/settings/profile"

  

response屬性

import requests
respone=requests.get('http://www.jianshu.com')
# respone屬性
print(respone.text) # 獲取解碼后的內容 html
print(respone.content) # 獲取二進制字節數據
print(respone.json()) # 對響應進行json反序列化,僅在返回的數據為json格式時可使用
print(respone.status_code)
print(respone.headers)
print(respone.cookies)
print(respone.cookies.get_dict())
print(respone.url)
print(respone.history) # 獲取重定向歷史
print(respone.encoding) # 響應體編碼方式

  

關閉:上下文管理

# 可以以生成器的方式來獲取 在數據較大時 可以避免內存溢出
print(res.iter_content())
from contextlib import closing
with closing(requests.get('http://www.autohome.com/news',stream=True)) as response:
        for line in response.iter_content(chunk_size=10):
            print(line)
            print(len(line))

指定響應體編碼

import requests
response=requests.get('http://www.autohome.com/news')
response.encoding = "GBK"   指定響應體編碼
print(response.text)
print(response.encoding)

分段獲取數據

# 當響應體數據太大的時候一次性獲取所有可能造成內存溢出
# 可以使用iter_content 分段獲取數據,
# chunk_size 指定每次獲取的長度,
# decode_unicode 是否進行解碼 通常為false

import requests
respone = requests.get("https://www.qq.com")
with open("tt.html","wb") as f:
for i in respone.iter_content(chunk_size=1024,decode_unicode=False):
print(len(i))
f.write(i)

  

 獲取原始套接字響應數據

r = requests.get('https://api.github.com/events', stream=True)
# <requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
print(r.raw.read(10))

SSL Cert Verification——證書驗證(大部分網站都是https)

#證書驗證(大部分網站都是https)
import requests
respone=requests.get('https://www.12306.cn') #如果是ssl請求,首先檢查證書是否合法,不合法則報錯,程序終端


#改進1:去掉報錯,但是會報警告
import requests
respone=requests.get('https://www.12306.cn',verify=False) #不驗證證書,報警告,返回200
print(respone.status_code)


#改進2:去掉報錯,並且去掉警報信息
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #關閉警告
respone=requests.get('https://www.12306.cn',verify=False)
print(respone.status_code)

#改進3:加上證書
#很多網站都是https,但是不用證書也可以訪問,大多數情況都是可以攜帶也可以不攜帶證書
#知乎\百度等都是可帶可不帶
#有硬性要求的,則必須帶,比如對於定向的用戶,拿到證書后才有權限訪問某個特定網站
import requests
respone=requests.get('https://www.12306.cn',
                     cert=('/path/server.crt',
                           '/path/key'))
print(respone.status_code)

 

使用代理

官網鏈接: http://docs.python-requests.org/en/master/user/advanced/#proxies

代理設置:先發送請求給代理,然后由代理幫忙發送(封ip是常見的事情)

import requests
ips = ["http://180.118.73.147:9000","http://180.118.73.147:9000"]

proxies={
    # 'http':'http://180.118.73.147:9000',#帶用戶名密碼的代理,@符號前是用戶名與密碼
    'http':'http://180.118.73.147:9000',
}
respone=requests.get('https://www.baidu.com',roxies=proxies)
print(respone.status_code) 
支持socks代理,安裝:pip install requests[socks]
import requests
proxies = {
    'http': 'socks5://user:pass@host:port',
    'https': 'socks5://user:pass@host:port'
}
respone=requests.get('https://www.12306.cn',
                     proxies=proxies)

print(respone.status_code)
View Code

超時設置

#超時設置
#兩種超時:float or tuple
#timeout=0.1 #代表接收數據的超時時間
#timeout=(0.1,0.2)#0.1代表鏈接超時  0.2代表接收數據的超時時間

import requests
respone=requests.get('https://www.baidu.com',
                     timeout=0.0001)

捕獲異常

#異常處理
import requests
from requests.exceptions import * #可以查看requests.exceptions獲取異常類型

try:
    r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
    print('===:')
# except ConnectionError: # 鏈接失敗
#     print('-----')
# except Timeout: # 超時
#     print('aaaaa')

except RequestException as e: # 其他異常
    print(e)

上傳文件

import requests
files={'file':open('a.jpg','rb')} # value為文件對象
respone=requests.post('http://httpbin.org/post',files=files)
print(respone.status_code)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM