1. 程式人生 > >爬蟲入門 -> urllib庫中request模組的基本使用(筆記二)

爬蟲入門 -> 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'))

執行結果: 在這裡插入圖片描述 是一個可以用來測試的網站,當向 提交資料時,它會以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'))

執行結果: 在這裡插入圖片描述