目錄
request.data 的使用
- 訪問網絡的兩種方法
- get:
- 利用參數給服務器傳遞信息,
- 參數爲dict,然後用parse編碼
- 案例1
- post
- 一般向服務器傳遞參數使用
- post是把信息自動加密處理
- 我們如果想使用psot信息,需要用到data參數
- 使用post,意味着Http的請求頭可能需要更改:
- Content-Type: application/x-www.form-urlencode
- Content-Length: 數據長度
- 簡而言之,一旦更改請求方法,請注意其他請求頭部信息相適應
- urllib.parse.urlencode可以將字符串自動轉換成上面的
- 案例2
- 爲了更多的設置請求信息,單純的通過urlopen函數已經不太好用了,需要利用request.Request 類
- 案例3
案例1:
from urllib import request, parse
'''
掌握對url進行參數編碼的方法
需要使用parse模塊
'''
if __name__ == '__main__':
url = 'http://www.baidu.com/s?'
wd = input("請輸入關鍵字,比如大熊貓:")
# 做一個字典出來,要想使用data, 需要使用字典結構
qs = {
"wd": wd
}
# 轉換url編碼
qs = parse.urlencode(qs)
print(qs)
fullurl = url + qs
print(fullurl)
# 如果直接用可讀的帶參數的url,是不能訪問的
#fullurl = 'http://www.baidu.com/s?wd=大熊貓'
rsp = request.urlopen(fullurl)
html = rsp.read()
# 使用get取值保證不會出錯
html = html.decode()
print(html)
案例2:
'''
利用parse模塊模擬post請求
分析百度詞典
分析步驟:
1. 打開F12
2. 嘗試輸入單詞girl,發現每敲一個字母后都有請求
3. 請求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-sug-Hearders,查看,發現FormData的值是 kw:girl
5. 檢查返回內容格式,發現返回的是json格式內容==>需要用到json包
'''
from urllib import request, parse
# 負責處理json格式的模塊
import json
'''
大致流程是:
1. 利用data構造內容,然後urlopen打開
2. 返回一個json格式的結果
3. 結果就應該是girl的釋義
'''
baseurl = 'http://fanyi.baidu.com/sug'
# 存放用來模擬form的數據一定是dict格式
data = {
# girl是翻譯輸入的英文內容,應該是由用戶輸入,此處使用硬編碼
'kw': 'girl'
}
# 需要使用parse模塊對data進行編碼
data = parse.urlencode(data).encode("utf-8")
print(type(data))
# 我們需要構造一個請求頭,請求頭部應該至少包含傳入的數據的長度
# request要求傳入的請求頭是一個dict格式
headers = {
# 因爲使用post,至少應該包含content-length 字段
'Content-Length':len(data)
}
# 有了headers,data,url,就可以嘗試發出請求了,第三個參數應爲 headers = headers,但是報錯
rsp = request.urlopen(baseurl, data=data)
json_data = rsp.read().decode('utf-8')
print( type(json_data))
print(json_data)
# 把json字符串轉化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)
for item in json_data['data']:
print(item['k'], "--", item['v'])
案例3:
'''
任務要求和內容跟 案例2 一樣
本案例只是利用Request來實現v5的內容
利用parse模塊模擬post請求
分析百度詞典
分析步驟:
1. 打開F12
2. 嘗試輸入單詞girl,發現每敲一個字母后都有請求
3. 請求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-Hearders,查看,發現FormData的值是 kw:girl
5. 檢查返回內容格式,發現返回的是json格式內容==>需要用到json包
'''
from urllib import request, parse
# 負責處理json格式的模塊
import json
'''
大致流程是:
1. 利用data構造內容,然後urlopen打開
2. 返回一個json格式的結果
3. 結果就應該是girl的釋義
'''
baseurl = 'http://fanyi.baidu.com/sug'
# 存放用來模擬form的數據一定是dict格式
data = {
# girl是翻譯輸入的英文內容,應該是由用戶輸入,此處使用硬編碼
'kw': 'girl'
}
# 需要使用parse模塊對data進行編碼
data = parse.urlencode(data).encode("utf-8")
# 我們需要構造一個請求頭,請求頭部應該至少包含傳入的數據的長度
# request要求傳入的請求頭是一個dict格式
headers = {
# 因爲使用post,至少應該包含content-length 字段
'Content-Length':len(data)
}
# 構造一個Request的實例
req = request.Request(url=baseurl, data=data, headers=headers)
# 因爲已經構造了一個Request的請求實例,則所有的請求信息都可以封裝在Request實例中
rsp = request.urlopen(req)
json_data = rsp.read().decode('utf-8')
print( type(json_data))
print(json_data)
# 把json字符串轉化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)
for item in json_data['data']:
print(item['k'], "--", item['v'])