Python:爬虫之怎样通过 urllib 获取网页内容

Lasted 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()