Python之爬蟲urllib(二)-request.data

目錄

request.data 的使用

案例1: 

案例2: 

案例3: 


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'])

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章