Requests——讓HTTP服務人類
- 一、Requests簡介
- 1. requests庫簡介
- 2. 安裝方式
- 二、GET請求
- 1. 全頁面保存
- text和content的使用情況
- 2. params屬性
- 3. headers屬性
- 三、POST請求
- 1. data屬性
- 2. header屬性
一、Requests簡介
1. requests庫簡介
Urllib 和 Requests 模塊是發起 http 請求最常見的模塊,
雖然 Python 的標準庫中 urllib 模塊已經包含了平常我們使用的大多數功能,但是它的 API 使用起來讓人感覺不太好,而 Requests 自稱“http for Humans”,說明使用更簡潔方便,
Requests繼承了urllib的所有特性,Requests支持http連接保持和連接池,支持使用cookie 保持會話,支持檔案上傳,支持自動確定回應內容的編碼,支持國際化的 URL 和 POST 數 據自動編碼,
**requests 的底層實作其實就是 urllib3(urllib2 的升級版—python2 支持) **
Requests 的檔案非常完備,中文檔案也相當不錯,Requests 能完全滿足當前網路的需求, 支持 Python 2.6—3.6,
開源地址:http://github.com/kennethreitz/requests
中文檔案 API:http://2.python-requests.org/zh_CN/latest/
2. 安裝方式
利用 pip 安裝或者利用 easy_install 都可以完成安裝:
$ pip install requests
二、GET請求
- 匯入requests
- 發送請求,回傳回應
- 確定請求的URL
- 確定請求方式get
- 保存檔案(html)
1. 全頁面保存
例:將百度產品大全頁面保存到本地
import requests
response = requests.get(url='https://www.baidu.com/more/')
with open('百度產品大全.html','w',encoding='utf-8') as fp:
fp.write(response.text)
發現問題:
- 中文亂碼
- 圖片不顯示
解決:
- 中文亂碼:最根本原因是編碼問題
content:獲取頁面二進制型別內容,使用content.decode(‘編碼格式’),默認是utf-8大部分網頁都是使用utf-8或者是gbk,解碼時,嘗試使用utf-8,如果亂碼沒有解決,換成gbk基本可以,如果還沒有解決,使用response.encoding來解決
import requests
response = requests.get(url='https://www.baidu.com/more/')
with open('百度產品大全.html','w',encoding='utf-8') as fp:
fp.write(response.content.decode())
- 圖片不顯示:圖片是本地路徑,我們本地沒有,所以,不顯示,
text和content的使用情況
- text獲取頁面文本型別資料,在大部分使用text獲取資料時都不會出現亂碼情況,如果亂碼,使用content.decode()解決亂碼,
- content()獲取頁面二進制型別的內容,在下載圖片、視頻、音頻等媒體檔案時,必須使用content()
2. params屬性
當請求攜帶引數,引數少時可以直接寫在url上,當引數過長則及其不方便,此時使用params屬性加載引數,
params作用:自動的將引數按照地址欄的引數形式拼接
提取引數
在請求時傳入引數params,接收字典型別資料,get請求的引數是放在Query String Parameters中,get請求時,傳遞的關鍵字引數是params
例:將新浪搜索python的頁面保存至本地
import requests
params = { # 定義引數字典
'q': 'python',
'c': 'news'
}
response = requests.get(url='http://search.sina.com.cn/', params=params)
with open('新浪搜索-python.html', 'w', encoding='utf-8') as fp:
fp.write(response.text)
3. headers屬性
- 不管寫什么爬蟲,都加上請求頭,至少加一個UA
- 如果加入UA之后還是訪問不到資料,嘗試加入cookie
- 如果加入cookie還是不好用,將全部的請求頭都加入,以:開頭的請求頭不要加入
例:自定義百度搜索
import requests
# 自定義搜索內容
wd = input('請輸入想要查詢的內容:')
params = {
"wd": "python"
}
headers = { # 定義請求頭字典
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
}
response = requests.get(url='https://www.baidu.com/s', params=params, headers=headers)
print(response.headers)
with open(f'{wd}.html', 'w', encoding='utf-8') as fp:
fp.write(response.text)
三、POST請求
類似百度實時翻譯的頁面,輸入一個單詞實時出現翻譯以及聯想翻譯,這種并不是get請求,而是post請求,
步驟與get相同:
- 匯入requests
- 發送請求,回傳回應
- 確定請求的URL
- 確定請求方式post
- 保存檔案(html)
1. data屬性
如果是post請求,需要攜帶引數,加入data的關鍵字引數,data接收字典格式資料
2. header屬性
與get相同,都需要攜帶請求頭屬性,
如果獲取異步請求的資料,最好將x-requested-with: XMLHttpRequest加入到請求頭中
例:用戶自定義輸入單詞,獲取解釋
import requests
# 自定義用戶輸入
kw = input('請輸入想要查詢的單詞:')
# 定義引數字典
data = {
'kw':kw
}
# 定義請求頭
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',
'x-requested-with': 'XMLHttpRequest'
}
# 發起請求,接收回應
response = requests.post(url='https://fanyi.baidu.com/sug',data=data,headers=headers)
# 使用json()可以將json格式的字串轉換成字典
data_list = response.json()['data']
# 獲取資料
for data in data_list:
# 獲取單詞
word = data['k']
# 獲取解釋
explain = data['v']
print(word,explain)
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/225356.html
標籤:python
