Python:爬蟲之怎樣通過 urllib 獲取網頁內容

最近更新時間 2020-12-01 18:55:27

urllib.request 是一個用於獲取 URL 內容的模塊。適用於在各種複雜情況下請求 URL 的函數和類,包括認證、重定向、header和cookies等操作。

urllib.request 支持包括 ftp、https 和 file 等各種 URL 協議。

函數定義

主要的 urlopen 函數有一個必填參數 url,其他為可選參數。

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

示例

使用 urllib.request 獲取 https://docsxyz.com 網頁內容。

import urllib.request

with urllib.request.urlopen('https://docsxyz.com') as response:
   html = response.read()
注:urlopen 函數返回字節流對象,因為 urlopen 不能自動判斷從 HTTP 服務器返回的數據流的編碼格式,自動轉換可能出現亂碼。一般情況下程序會根據猜測可能的編碼自動解析返回數據流為對應的字符串。

docsxyz.com 網站為 utf-8 編碼,如需讀取前 100 個字節的長度,可在 read 函數中傳入長度。可以直接獲取文件而不使用 with 上下文管理器,如下所示:

import urllib.request

f = urllib.request.urlopen('https://docsxyz.com')
f.read(100).decode('utf-8')

發送 GET 數據

下面的示例使用 GET 方法獲取服務器內容,GET 參數需要使用 urlencode 方法先編碼,如下所示:

import urllib.request
import urllib.parse

params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
url = "https://docsxyz.com?%s" % params
with urllib.request.urlopen(url) as f:
    f.read().decode('utf-8')

發送 POST 數據

下面的示例使用 POST 方法獲取服務器內容,POST 參數需要使用 urlencode 方法先編碼再使用 encode 編碼為字節數據才能發送,如下所示:

import urllib.request
import urllib.parse

data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
data = data.encode('ascii')
with with urllib.request.urlopen("https://docsxyz.com", data) as f:
    f.read()
rss_feed