爬蟲---requests模組
阿新 • • 發佈:2020-09-08
requests簡介
requests模組是在urllib的基礎上編寫的, 採用的是Apache2 Licensed開源協議的HTTP庫. 與urllib相比較, requests模組使用起來更加方便, 但安裝好python之後沒有該模組, 故使用requests模組需要單獨安裝.
requests詳解
一個使用requests模組的簡單示例:
import requests url = 'http://www.baidu.com' # 響應物件 response = requests.get(url) # 響應狀態碼 print(response.status_code) # 響應字串 print(response.text) # 響應位元組串 print(response.content) print(response.content.decode('utf-8')) # 響應頭 print(response.headers) # cookies print(response.cookies)
這裡有一個需要注意的地方, 有些網站直接用response.text
返回資料時會出現亂碼問題, 解決方法有兩種. 一種是使用response.content
返回資料, 這裡返回的是二進位制格式, 通過decode可以轉換為utf-8; 另一種是找出requests使用的編碼方式, 並改變response.encoding
屬性, response.encoding = 'utf-8'
. 這是因為當請求發出以後, requests會根據http頭部對響應的編碼做推測, 當訪問response.text
時, requests會使用推測的文字編碼.
各種請求方式
requests.get('http://httpbin.org/get') requests.post('http://httpbin.org/post') requests.put('http://httpbin.org/put') requests.delete('http://httpbin.org/delete') requests.head('http://httpbin.org/get') requests.options('http://httpbin.org/get')
GET請求
# 基本get請求 response = requests.get('http://httpbin.org/get') print(response.text) # 帶引數的get請求1 response = requests.get('http://httpbin.org/get?name=lau&age=24') print(response.text) # 帶引數的get請求2 data = {'name': None, 'age': 24} response = requests.get('http://httpbin.org/get', params=data) print(response.url) # http://httpbin.org/get?age=24 print(response.text) # args中會傳入data # 兩種方式的區別是, 當通過params引數傳遞一個字典內容時, 如果字典中的引數為None, 不會新增到url上
解析json
response = requests.get('http://httpbin.org/get')
print(type(response.text)) # str
# 解析json1
print(response.json())
print(type(response.json())) # dict
# 解析json2
print(json.loads(response.text)) # dict
獲取二進位制資料
使用response.content
, 下載圖片, 視訊時最為常用.
新增headers
直接通過requests請求訪問一些網站時, 預設是無法訪問的, 會出現400 Bad Request
錯誤. 這是因為這些網站需要頭部資訊, 我們需要將requests請求模仿成瀏覽器在訪問, 即在頭部資訊中新增使用者代理, 可以在谷歌瀏覽器中輸入Chrome://version
檢視對應的使用者代理, 並將使用者代理新增到請求的頭部資訊中.
headers = {
'User-agent':
'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'}
response = requests.get('http://www.zhihu.com', headers=headers)
print(response.text)
POST請求
# post請求
headers = {
'User-agent':
'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'}
data = {
'name': 'lau',
'age': 24
}
response = requests.post('http://httpbin.org/post', headers=headers, data=data)
print(response.text) # form中會傳入data
響應的更多屬性
# 響應的更多屬性
response = requests.get('http://httpbin.org/get', headers=headers, )
print(type(response.status_code), response.status_code) # int
print(type(response.headers), response.headers) # requests.structures.CaseInsensitiveDict
print(type(response.cookies), response.cookies) # requests.cookies.RequestsCookieJar
print(type(response.url), response.url) # str
print(type(response.history), response.history) # list
檔案上傳
files = {'files': open('./app.py', 'r')}
response = requests.post('http://httpbin.org/post', files=files)
print(response.text) # files中會寫入檔案內容, "Content-Type": "multipart/form-data;
獲取cookie
response = requests.get('http://www.baidu.com')
print(response.cookies) # <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
for k, v in response.cookies.items():
print(k, v) # BDORZ 27315
會話維持
cookie的一個作用就是用於模擬登陸, 做會話維持
# 會話維持
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456')
response = s.get('http://httpbin.org/cookies')
print(response.text)
# {
# "cookies": {
# "number": "123456"
# }
# }
代理設定
proxies = {
'http': 'http://115.223.7.110:80',
}
response = requests.get('http://www.baidu.com', proxies=proxies)
print(response.content.decode('utf-8'))
超時設定
通過timeout引數設定超時時間