如何在Python中使用urllib模块的函数来获取网页内容?
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()函数读取下载下来的内容。
