爬蟲入門 -> urllib庫中request模塊的基本使用(筆記二)

urllib庫中request模塊的基本使用

  request模塊是urllib中最基本的HTTP請求模塊,可以用來模擬發送請求。

urlopen方法

基本使用

  要使用request模塊來模擬發送請求,最基本方法就是urlopen方法,其主要參數就是一個url字符串,除此之外還可以傳入data、timeout等參數。下面以獲取一個網頁爲例:

# FILENAME: code1.py
import urllib.request

response = urllib.request.urlopen('https://www.baidu.com/') #這裏注意不要遺漏 'https://'
print(type(response))
print(response.read().decode('utf-8'))

運行結果如下:
code1.py
從打印結果的第一行可以獲知urlopen方法會返回一個HTTPResponse類型的對象,該對象可以像讀取文本一樣使用read方法並返回一個bytes類型的對象,因此還要用decode方法進行解碼再打印,即response.read().decode('utf-8')。由此便獲取了百度的首頁,這和用瀏覽器訪問實際上並無區別,只是瀏覽器又進一步對獲取的文本進行了解析才讓我們看到了又有文字又有圖片的網頁。


HTTPResponse類型

  關於HTTPResponse類型的對象,它主要包含了read方法、readinto方法、getheader方法、getheaders方法、fileno方法等方法,還有msg、version、status、reason、debuglevel、closed等屬性。
  下面演示個別方法及屬性:

# FILENAME: code2.py
import urllib.request

response = urllib.request.urlopen('https://www.baidu.com/')
print(response.status) # 打印響應結果的狀態碼,如404表示找不到資源,200表示請求成功

print(response.getheader('Date')) # getheader方法可以獲取響應頭中的某一個字段,如這裏獲得了Date字段的內容

# print(response.getheaders()) getheaders方法可以獲取請求頭的所有內容,返回的對象是一個列表,列表的元素全是元祖

運行結果如下:
在這裏插入圖片描述


data參數

  GET和POST都是常用的請求方式,對於POST而言需要我們在發送請求時要帶着數據,而urlopen方法就有一個參數data來滿足這樣的需求。這裏需要注意的是,data參數是bytes類型,下面爲使用data參數的簡單示範:

#FILENAME:code3.py
import urllib.request
import urllib.parse

URL = 'http://httpbin.org/post'
Data_text = {'word': 'hello'}
# 由於Data_text是一個字典,在這裏先提前使用未學習的parse模塊中的urlencode方法,它可以將字典轉化爲字符串。
Data = bytes(urllib.parse.urlencode(Data_text), 'utf-8')

response = urllib.request.urlopen(url=URL, data=Data)
print(response.read().decode('utf-8'))

運行結果:
在這裏插入圖片描述
http://httpbin.org 是一個可以用來測試的網站,當向 http://httpbin.org/post/post 提交數據時,它會以JSON的形式將請求頭返回給客戶端。在上圖可以看到,form字段中就有我們提交的內容 {‘word’: ‘hello’}



timeout參數

  timeout可以用於設置超時時間,單位爲秒。當請求的時間超過了timeout但仍未收到應答,則報錯:

#FILENAME:code3.py
import urllib.request
import urllib.parse

URL = 'http://httpbin.org/post'
Data_text = {'word': 'hello'}
Data = bytes(urllib.parse.urlencode(Data_text), 'utf-8')

response = urllib.request.urlopen(url=URL, data=Data, timeout=0.1)
print(response.read().decode('utf-8'))

運行結果:
在這裏插入圖片描述


Request方法

基本用法

  Request方法可以將請求作爲一個對象,然後再用前面的urlopen方法來處理這個對象:

#FILENAME:code4.py
import urllib.request

request = urllib.request.Request('https://www.baidu.com')
response = urllib.request.urlopen(request)
print(type(request))
print(response.read().decode('utf-8'))

運行結果如下:
在這裏插入圖片描述
這和只用urlopen方法沒什麼區別,但是通過Request方法可以將請求作爲一個對象來看待。從結果的第一行可以看出來Request方法會返回一個Request類型的對象。


Request方法的參數

  Request方法主要有六個參數:

Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

  其中url不用多說了,data、method分別是要發送的數據和請求方式(如GET、POST);headers代表請求頭,可以通過修改headers字典來達到自定義請求頭內容的目的;origin_req_host代表請求方的IP地址/host名稱;unberifiable表示這個請求是否是無法驗證的。

  下面以修改請求頭爲例:

#FILENAME:code5.py

import urllib.request
import urllib.parse

URL = 'http://httpbin.org/post'
Data_text = {'hello': 'world'}
Data = bytes(urllib.parse.urlencode(Data_text),'utf-8')
Headers = {
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    'Host': 'httpbin.org'
}

request = urllib.request.Request(url=URL, data=Data, headers=Headers)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

運行結果:
在這裏插入圖片描述

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