1. 程式人生 > >urllib的Request詳解

urllib的Request詳解

一 點睛

urlopen()方法可以實現最基本請求的發起,但這幾個簡單的引數並不足以構建一個完整的請求。如果請求中需要加入Headers等資訊,就可以利用更強大的Request類來構建。

二 實戰

1 程式碼

import urllib.request

request = urllib.request.Request('https://python.org')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

2 說明

我們依然是用urlopen()方法來發送這個請求,只不過這次該方法的引數不再是URL,而是一個Request型別的物件。通過構造這個資料結構,一方面我們可以將請求獨立成一個物件,另一方面可更加豐富和靈活地配置引數。

三 Request類介紹

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

  • 第一個引數url用於請求URL,這是必傳引數,其他都是可選引數。

  • 第二個引數data如果要傳,必須傳bytes(位元組流)型別的。如果它是字典,可以先用urllib.parse模組裡的urlencode()編碼。

  • 第三個引數headers是一個字典,它就是請求頭,我們可以在構造請求時通過headers引數直接構造,也可以通過呼叫請求例項的add_header()方法新增。

       新增請求頭最常用的用法就是通過修改User-Agent來偽裝瀏覽器,預設的User-Agent是Python-urllib,我們可以通過修改它來偽裝瀏覽器。比如要偽裝火狐瀏覽器,可以把它設定為:

       Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11

  • 第四個引數origin_req_host指的是請求方的host名稱或者IP地址。

  • 第五個引數unverifiable表示這個請求是否是無法驗證的,預設是False,意思就是說使用者沒有足夠許可權來選擇接收這個請求的結果。例如,我們請求一個HTML文件中的圖片,但是我們沒有自動抓取影象的許可權,這時unverifiable的值就是True`。

  • 第六個引數method是一個字串,用來指示請求使用的方法,比如GET、POST和PUT等。

四 實戰

1 程式碼

from urllib import request, parse

url = 'http://httpbin.org/post'
headers = {
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    'Host': 'httpbin.org'
}
dict = {
    'name': 'Germey'
}
data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, headers=headers, method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

2 結果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_1_1.py
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "name": "Germey"
  },
  "headers": {
    "Accept-Encoding": "identity",
    "Connection": "close",
    "Content-Length": "11",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"
  },
  "json": null,
  "origin": "106.36.217.202",
  "url": "http://httpbin.org/post"
}

3 說明

觀察結果可以發現,我們成功設定了data、headers和method。

另外,headers也可以用add_header()方法來新增,程式碼如下:

req = request.Request(url=url, data=data, method='POST')
req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')