1. 程式人生 > 實用技巧 >爬蟲---requests模組

爬蟲---requests模組

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引數設定超時時間