一、前言
1、requests簡介
requests是一個很實用的Python HTTP客戶端庫,爬蟲和測試服務器響應數(shù)據(jù)時經(jīng)常會用到,它是python語言的第三方的庫,專門用于發(fā)送HTTP請求,使用起來比urllib更簡潔也更強大。
2、requests庫的安裝
方法1:命令行安裝
- windows操作系統(tǒng):pip install requests
- Mac操作系統(tǒng):pip3 install requests
- Linux操作系統(tǒng):sodo pip install requests
方法2:源碼安裝
- 下載 requests源碼 http://mirrors.aliyun.com/pypi/simple/requests/
- 下載文件到本地之后,解壓到Python安裝目錄,之后打開解壓文件
- 運行命令行輸入python setup.py install 即可安裝
二、常用方法
序號 | 方法 | 描述 |
---|---|---|
1 | requests.request(url) | 構造一個請求,支持以下各種方法 |
2 | requests.get() | 發(fā)送一個Get請求 |
3 | requests.post() | 發(fā)送一個Post請求 |
4 | requests.head() | 獲取HTML的頭部信息 |
5 | requests.put() | 發(fā)送Put請求 |
6 | requests.patch() | 提交局部修改的請求 |
7 | requests.delete() | 提交刪除請求 |
其中最常用的方法為get()和post(),分別用于發(fā)送Get請求和Post請求。
三、常用屬性
序號 | 屬性或方法 | 描述 |
---|---|---|
1 | response.status_code | 響應狀態(tài)碼 |
2 | response.content | 把response對象轉換為二進制數(shù)據(jù) |
3 | response.text | 把response對象轉換為字符串數(shù)據(jù) |
4 | response.encoding | 定義response對象的編碼 |
5 | response.cookie | 獲取請求后的cookie |
6 | response.url | 獲取請求網(wǎng)址 |
7 | response.json() | 內置的JSON解碼器 |
8 | Response.headers | 以字典對象存儲服務器響應頭,字典鍵不區(qū)分大小寫 |
四、發(fā)送請求
1、發(fā)送GET請求
1) 不帶參數(shù)的請求
import requests
#定義百度URL,獲取百度首頁
url = "http://www.baidu.com"
#使用GET發(fā)起請求
res = requests.get(url)
#將返回對象的2進制數(shù)據(jù)進行解碼并輸出(根據(jù)響應解過中的HTML頭判斷編碼類型)
print(res.content.decode("UTF-8"))
2) 帶參數(shù)的請求
將參數(shù)放在URL中進行請求:
import requests
#將參數(shù)name和age拼接到URL中進行請求
res = requests.get(http://httpbin.org/get?name=gemey&age=22)
#輸出返回對象的文本結果
print(res.text)
將參數(shù)寫在字典中進行請求:
import requests
#將參數(shù)name和age定義到字典params中
params={
"name":"tony",
"age":20
}
url="http://httpbin.org/get"
#發(fā)送請求參數(shù)
res = requests.get(url=url,params=params)
#輸出返回對象的文本結果
print(res.text)
自定義HTTP頭信息進行請求:
import requests
# 將參數(shù)name和age定義到字典params中
params = {
"name": "tony",
"age": 20
}
url = 'http://httpbin.org/get'
# 定義HTTP頭信息,cookie,UA和referer
headers = {
"User-agent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-P585Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36",
"referer": "https://www.abidu.com",
"Cookies": "1234565678"
}
# 發(fā)送請求參數(shù)
res = requests.get(url = url,params = params,headers = headers)
# 輸出返回對象的文本結果
print(res.text)
2、發(fā)送POST請求
POST請求一般用于提交參數(shù),所以直接進行有參數(shù)的POST請求測試。
import requests
# 將參數(shù)name和age定義到字典params中
params = {
"name": "tony",
"age": 20
}
url = 'http://httpbin.org/post'
# 定義HTTP頭信息
headers = {
"User-agent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-P585Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36",
"referer": "https://www.abidu.com",
"Cookies": "username=user1&passwd=passwd"
}
# 發(fā)送請求參數(shù)
res = requests.post(url = url,params = params,headers = headers)
# 輸出返回對象的文本結果
print(res.text)
五、讀取內容
requests對象的get和post方法都會返回一個Response對象,這個對象里面存的是服務器返回的所有信息,包括響應頭,響應碼等。
上面提到了,對于request,常用的屬性有content、text、json、cookie等。content和text兩者區(qū)別在于,content中間存的是字節(jié)碼,而text中存的是Beautifulsoup模塊根據(jù)猜測的編碼方式將content內容編碼成字符串后的結果。
直接輸出content,會發(fā)現(xiàn)前面存在b’這樣的標志,這是字節(jié)字符串的標志,而text是沒有前面的b,對于純ascii碼,這兩個可以說一模一樣,對于其他的文字,需要正確編碼才能正常顯示。
大部分情況下,我們可以直接使用text,但是當有中文的時候,直接使用text會顯示亂碼,所以需要使用content對象來手動進行解碼后才能正常顯示。
而json屬性則是利用內置的json解析模塊解析json數(shù)據(jù)。
cookie屬性則是直接獲取響應頭中的cookie。
1、以content方式讀取
import requests
url = "http://www.baidu.com"
res = requests.get(url)
#不進行解碼,直接輸出
print(res.content)
輸出結果:
進行解碼后輸出:
2、以text方式讀取
import requests
url = "http://www.baidu.com"
res = requests.get(url)
print(res.text)
輸出結果: 中文存在亂碼
3、讀取json數(shù)據(jù)
import requests
params = {
"name": "tony",
"age": 20
}
url = 'http://httpbin.org/get'
headers = {
"referer": "https://www.abidu.com",
"Cookies": "1234565678"
}
res = requests.get(url = url,params = params,headers = headers)
print(res.cookies)
輸出結果:將json數(shù)據(jù)轉換為字典進行輸出
4、獲取cookies
import requests
url = 'https://www.baidu.com'
res = requests.get(url = url)
print(res.cookies.extract_cookies)
讀取cookie時,直接使用reponse.cookie會返回一個RequestsCookieJar對象,不會直接顯示cookie的信息,所以需要再使用extract_cookies屬性對該對象進行解析,結果如下:
六、其他方法
1、設置超時退出
可以通過timeout屬性設置超時時間,一旦超過這個時間還沒獲得響應內容,就會提示錯誤。
import requests
url = 'https://www.baidu.com'
#設置超時時間上限為1s
res = requests.get(url = url,timeout=1)
print(res.content.decode("UTF-8"))
2、異常處理
import requests
url = 'https://www.baidu.com'
#設置超時時間上限為1s,并使用try語句處理異常
try:
res = requests.get(url = url,timeout=1)
print(res.content.decode("UTF-8"))
except exceptions.Timeout as e:
print(e)
except exceptions.HTTPError as e:
print(e)
3、設置代理
代理格式: proxies = { ‘協(xié)議’:‘協(xié)議://IP:端口號’}
提示: 當我們抓取的地址為http時,使用http代理,反之使用https代理
示例:文章來源:http://www.zghlxwxcb.cn/news/detail-471175.html
import requests
url = 'https://www.baidu.com'
#使用字典定義代理
proxies={
'http':'http://123.45.67.76:8888'
'https':'http://123.45.67.76:4433'
}
#設置超時時間上限為1s,并使用try語句處理異常
try:
res = requests.get(url = url,timeout=1,proxies=proxies)
print(res.content.decode("UTF-8"))
except exceptions.Timeout as e:
print(e)
except exceptions.HTTPError as e:
print(e)
4、使用Session進行會話管理
直接 requests.get() 或者 requests.post() 發(fā)送GET請求或POST請求;當然也是可以帶上 cookies 和 headers 的,但這都是一次性請求,你這次帶著cookies信息,后面的請求還得帶。如果使用sessionl來發(fā)起請求,session實例在請求了一個網(wǎng)站后,對方服務器設置在本地的cookie會保存在session中,下一次再使用session請求對方服務器的時候,會帶上前一次的cookie,從而實現(xiàn)回話保持。文章來源地址http://www.zghlxwxcb.cn/news/detail-471175.html
import requests
#使用session,需要先實例化一個session對象。
session = requests.session()
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36",
'Referer': "https://creator.douyin.com/"
}
url = "https://sso.******.com/get_qrcode/?next=https:%2F%2Fcreator.douyin.com%2Fcreator-micro%2Fhome&aid=2906&service=https:%2F%2Fcreator.douyin.com&is_vcd=1&fp=ktv0uumo_gD7FPCuy_MfX7_44zL_9T1C_6i8sUgr4bDT6"
data1 = {
"name" : "test",
"passwd" : "passwd"
}
data2 = {
"name" : "test",
"age" : 20
}
#使用session對象發(fā)起請求,進行登錄。
try:
res = session.get(url = url,timeout=1,headers = headers,data=data1)
print(res.json())
#使用的登錄后的session對需要登錄的操作再次發(fā)起請求。
res2 = session.post(url,data=date2)
except exceptions.Timeout as e:
print(e)
except exceptions.HTTPError as e:
print(e)
到了這里,關于python—requests模塊詳解的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!