python3 中使用 urllib 问题
今天遇到一个蛮奇怪的问题:当我在控制台中使用 urllib 没问题,但是当我在 vscode 中 .py 文件中导入 urllib 使用时会报错:
AttributeError: module 'urllib' has no attribute 'request'
查了一下资料是 python3
的 urllib
不会自动导入其under
层的包,需要手动导入。
import urllib
import urllib.parse
import urllib.request
再次使用即可成功。
urllibe 是 python3 中将中文 urlencode 编码使用的函数,urlencode 使用如下:
import urllib
import urllib.parse
urllib.parse.quote(string, safe='/', encoding=None, errors=None)
urllib 将编码后的字符串转为中文则使用:
import urllib
import urllib.parse
urllib.parse.unquote(string, encoding='utf-8', errors='replace')
聊到这里就顺带讲讲 urllibe 的使用吧
urllib 是一个 python 内置包,不需要额外安装即可使用,它包含一下几个用来处理 url 的模版。
- urllib.request,用来打开和读取 url,意思就是可以用它来模拟发送请求,就像在浏览器里输入网址然后敲击回车一样,获取网页响应内容。
- urllib.error,用来处理 urllib.request 引起的异常,保证程序的正常执行。
- urllib.parse,用来解析 url,可以对 url 进行拆分、合并等。
- urllib.robotparse,用来解析 robots.txt 文件,判断网站是否能够进行爬取。
urllib.request 模块
urllib.request 模块定义了以下几个函数。
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
该函数主要用于模拟网站请求,返回一个 HTTPResponse 类型的对象。
urlopen 函数中参数定义
- url,必选参数,是一个 str 字符串或者 Request 对象(后面会介绍)。
- data,bytes 类型的可选参数,如果传递的是字典型数据,可以用 urllib.parse.urlencode() 进行编码,返回 str 字符串,再将 str 转换成 bytes 字节流。如果传递 data 参数,urlopen 将使用 HTTP POST 方式请求,否则为 HTTP GET 请求。
- timeout,可选参数,设置超时时间(未设置时使用全局默认超时时间),以秒为单位计时,如果 urlopen 请求超出了设置时间还未得到响应则抛出异常。
- cafile 和 capath,可选参数,在 HTTPS 连接请求时指定已认证的 CA 证书以及证书路径。
- cadefault,一般可忽略该参数。
- context,ssl.SSLContext 类型的可选参数,用来指定 SSL 设置。
urlopen 函数返回类型
urlopen 函数请求返回一个 HTTPResponse 响应上下文,或者请求异常抛出 URLError 协议错误,一般有如下属性:
- geturl(),返回检索的 url,通常用于判定是否进行了重定向。
- info(),返回网页的头信息。
- getcode(),返回 HTTPResponse 响应的状态码。
urlopen 函数的应用实例
# 创建一个 HTTP GET 请求,输出响应上下文
from urllib.request import urlopen
response = urlopen("http://www.python.org")
print(response.read())
# 创建一个 HTTP POST 请求,输出响应上下文
from urllib.request import urlopen
from urllib.parse import urlencode
data = {
'kw' : 'python'}
data = bytes(urlencode(data), encoding = 'utf-8')
response = urlopen("https://fanyi.baidu.com/sug", data)
print(response.read().decode('unicode_escape'))