欢迎访问宙启技术站
智能推送

如何在Python中使用urllib模块的函数来获取网页内容?

发布时间:2023-06-22 15:01:29

1. urllib模块简介

urllib是python内置的HTTP请求库,包含四个模块:urllib.request、urllib.error、urllib.parse、urllib.robotparser。其中urllib.request模块是最为常用的HTTP请求函数库,可以用来发送HTTP/HTTPS请求的模块。

2. HTTP请求方法

在HTTP请求中,常用的请求方法有GET和POST。

GET请求:用于请求访问已经被URI识别的资源,它只请求资源,不会对资源造成任何影响。可以通过URL传递参数,直接添加在摸个URL的后面,参数格式为?name=value&name2=value2

POST请求:用于向指定资源提交数据,请求服务器进行处理,数据存放在请求体中。POST请求一般用于表单提交,登录验证等。

3. urllib.request模块中的常用函数

urllib.request模块提供了一下函数,可以用于请求网页内容:

? urllib.request.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False, context=None)

urlopen()函数可以接受下面的参数:

url: 请求的URL地址。

data: 可选参数,请求的数据。如果要传递这个参数,可以传递一个bytes类型的字典。

timeout: 可选参数,超时时间。

cafile: 可选参数,指定CA证书,用于验证服务器端证书。

capath: 可选参数,指定CAPATH证书路径。

cadefault: 可选参数,是否检验服务器证书。

context: 可选参数,SSL上下文。

? urllib.request.urlretrieve(url[, filename[, reporthook[, data]]])

urlretrieve()函数可以用来下载网页内容。

参数说明:

url: 待下载文件的URL地址。

filename: 可选参数,指定下载文件的保存名称。

reporthook: 可选参数,回调函数,用于显示下载进度。

data: 可选参数,post到服务器的数据。

? urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)

urlencode()函数接受一个字典作为参数,网络编码后返回URL query的字符串。

参数说明:

query: 要进行编码的字典参数。

doseq: 可选参数,默认为False。若值为True,query中的字典将被序列化为一个序列而不是键值对。

safe: 可选参数,默认空。指定保留字符,在字符串中出现代表url的部分,以防止歧义

encoding: 可选参数,默认utf-8。指定编码格式。

errors: 可选参数,默认为strict。指定编码错误处理策略。

4. 使用urllib模块中的函数获取网页内容

通过urllib.request.urlopen()函数获取网页内容,然后使用read()方法来读取网页内容。如下所示:

import urllib.request

response = urllib.request.urlopen('http://www.baidu.com')
html = response.read()
print(html)

上面的代码中,使用urlopen()函数发送了一个GET请求,并获取了百度首页的源代码。通过read()方法来读取了网页内容,并输出到控制台中。

如果要发送POST请求,可以通过添加data参数来传递参数。

import urllib.parse
import urllib.request

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name': 'Michael Foord',
          'location': 'Northampton',
          'language': 'Python'}
headers = {'User-Agent': user_agent}

data = urllib.parse.urlencode(values)
req = urllib.request.Request(url, data.encode('utf-8'), headers)
response = urllib.request.urlopen(req)

上面的代码中,使用urlopen()发送了一个POST请求,并且指定了数据和请求头。这样就可以发送POST请求了。

如果要下载网页内容,可以使用urllib.request.urlretrieve()函数。如下所示:

import urllib.request

url = 'http://www.baidu.com'
local_filename, headers = urllib.request.urlretrieve(url)
html = open(local_filename).read()
print(html)

上面的代码中,先使用urlretrieve()函数下载了百度首页,在使用open()函数读取下载下来的内容。