官方文档地址:https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen
urlopen
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
参数
- url:可以是 url 字符串,也可以是 Request 对象。
- data:默认是 None,则为 GET 请求;不为空时,默认是 POST 请求。
- timeout:设置访问超时时间(以秒为单位),不设置则使用全局默认时间。
- cafile, capath, cadefault:自 3.6 版本弃用。实现可信任的 CA 证书的 HTTPS 连接,使用 context 代替。
- context:了解。实现 ssl 加密传输,必须是 ssl.SSLContext 实例。
返回对象有以下属性
- url:返回 url。
- headers:返回 EmailMessage 实例的响应头。
- status:3.9 版本里新添加的,返回状态码。
- geturl():自 3.9 版本弃用。使用 url 代替。
- info():自 3.9 版本弃用。使用 headers 代替。
- code:自 3.9 版本弃用。使用 status 代替。
- getstatus():自 3.9版本弃用。使用 status 代替。
对于 HTTP 和 HTTPS URLs 来说,返回的是稍加修改的 http.client.HTTPResponse 对象。
对于 FTP、文件和数据 URLs 来说,返回的是 urllib.response.addinfourl 对象。
基础示例
import urllib.request url = r'http://www.baidu.com' # 字符串前添加 r,防止 url 中包含转义字符 response = urllib.request.urlopen(url) # url 中不添加协议,报错,ValueError: unknown url type: 'www.baidu.com' content = response.read() content_decode = content.decode() # 默认编码 utf-8 print(type(response)) # <class 'http.client.HTTPResponse'> print(type(content)) # <class 'bytes'> print(type(content_decode)) # <class 'str'> print(response.url) print(response.headers) print(response.status)
自定义请求
Request
文档:https://docs.python.org/3/library/urllib.request.html#urllib.request.Request
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
from urllib import request url = r'http://www.baidu.com' req = request.Request(url) response = request.urlopen(url).read().decode()
添加 UserAgent,伪装浏览器
from urllib import request url = r'http://www.baidu.com' header = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36" } req = request.Request(url, headers=header) response = request.urlopen(url).read().decode()