细说 Python 的三大网络请求库 urllib、urllib2、urllib3

本贴最后更新于 1859 天前,其中的信息可能已经渤澥桑田

不知道有没有人跟我一样想过这个问题,Python 怎么会有那么多网络请求的库 urllib、urllib2...这我到底要用哪一个,几个库又有什么区别,真是让人头大,下文我就针对 urllib、urllib2、urllib3 来做一个详细的阐述。

简介

urllib、urllib2、urllib3 均能通过网络访问互联网上的资源文件,它们通过使用统一资源定位符(URL)并结合 re 模块完成很多意想不到的操作。

  1. urllib:Python2 和 Python3 内置的网络请求库,Python3 的 urllib 实际是 Python2 版本中 urllib2 和 urllib3 的合并
  2. urllib2:它只存在于 Python2 版本的内置库中,功能与 urllib 基本类似,主要上 urllib 的增强
  3. urllib3:Python2 和 Python3 均可以使用,但这不是标准库,需要使用 pip 安装使用,urllib3 提供了线程安全池和文件 post 等

注意: 在 Python2 中 urllib 和 urllib2 一般搭配使用的(不然 Python2 整两个内置库干嘛),urllib 具有 urllib2 没有的功能,而 urllib2 具有 urllib 没有的功能。

urllib

urllib 这个 Python 标准库基本上包含了基础的网络请求功能,以下 urllib 的演示均为 Python3 中的用法,Python2 中单独用 urllib 会比较难受,上面也提到了它最好配合 urllib2 一起使用。

urllib 发起 GET 请求

urlopen()方法发起请求,read()方法获取网页数据

from urllib import request

res = request.urlopen("http://httpbin.org/get")
print(res.read().decode())	# red()方法读取的数据是bytes的二进制格式,需要解码

urllib 发起 POST 请求

urlopen()默认是 GET 方式请求,当传入 data 参数时会发起 POST 请求,此时传递的参数必须时 bytes 格式

from urllib import request~~~~

res = request.urlopen("http://httpbin.org/post", data=b'hello=world')
print(res.read().decode())

urllib 为请求添加 Headers

通过 urllib 发起的请求默认的头信息是"User-Agent": "Python-urllib/3.6",一般网站会验证请求头的合法性,如果需要修改可以通过 urllib.request 中的 Request 对象

from urllib import request

url = "http://httpbin.org/get"
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}

req = request.Request(url=url, headers=headers)	# 传递的Request对象
res = request.urlopen(req)
print(res.read().decode())

此时 httpbin 网站返回的内容如下:

{
  "args": {},
  "headers": {
    "Accept-Encoding": "identity",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"
  },
  "origin": "210.33.11.241, 210.33.11.241",
  "url": "https://httpbin.org/get"
}

urllib 制定 proxy 代理

在使用爬虫时经常会配置代理隐藏我们的 IP 地址

from urllib import request

url = 'http://httpbin.org/ip'
proxy = {'http': '117.95.200.71:9999', 'https': '183.154.54.188:9999'} # 可以使用西刺代理配置

# 创建代理处理器
proxies = request.ProxyHandler(proxy)
# 创建opener对象
opener = request.build_opener(proxies)

resp = opener.open(url)
print(resp.read().decode())

urllib 下载数据至本地

from urllib import request

url = 'http://httpbin.org/image/jpeg'
request.urlretrieve(url, '1.jpg')

urllib2

urllib2 的用法其实基本和 urllib 相似,且它只存在于 Python2 版本,它的使用时需要配合 urllib 一起使用,要说它和 urllib 的区别还要看下面这个表,下表主要说明了在 Python2 中的 urllib、urllib2 中的方法整合到 Python3 后方法名的区别。

Python 2 Python 3
urllib.urlretrieve() urllib.request.urlretrieve()
urllib.urlcleanup() urllib.request.urlcleanup()
urllib.quote() urllib.parse.quote()
urllib.quote_plus() urllib.parse.quote_plus()
urllib.unquote() urllib.parse.unquote()
urllib.unquote_plus() urllib.parse.unquote_plus()
urllib.urlencode() urllib.parse.urlencode()
urllib.pathname2url() urllib.request.pathname2url()
urllib.url2pathname() urllib.request.url2pathname()
urllib.getproxies() urllib.request.getproxies()
urllib.URLopener urllib.request.URLopener
urllib.FancyURLopener urllib.request.FancyURLopener
urllib.ContentTooShortError urllib.error.ContentTooShortError
urllib2.urlopen() urllib.request.urlopen()
urllib2.install_opener() urllib.request.install_opener()
urllib2.build_opener() urllib.request.build_opener()
urllib2.URLError urllib.error.URLError
urllib2.HTTPError urllib.error.HTTPError
urllib2.Request urllib.request.Request
urllib2.OpenerDirector urllib.request.OpenerDirector
urllib2.BaseHandler urllib.request.BaseHandler
urllib2.HTTPDefaultErrorHandler urllib.request.HTTPDefaultErrorHandler
urllib2.HTTPRedirectHandler urllib.request.HTTPRedirectHandler
urllib2.HTTPCookieProcessor urllib.request.HTTPCookieProcessor
urllib2.ProxyHandler urllib.request.ProxyHandler
urllib2.HTTPPasswordMgr urllib.request.HTTPPasswordMgr
urllib2.HTTPPasswordMgrWithDefaultRealm urllib.request.HTTPPasswordMgrWithDefaultRealm
urllib2.AbstractBasicAuthHandler urllib.request.AbstractBasicAuthHandler
urllib2.HTTPBasicAuthHandler urllib.request.HTTPBasicAuthHandler
urllib2.ProxyBasicAuthHandler urllib.request.ProxyBasicAuthHandler
urllib2.AbstractDigestAuthHandler urllib.request.AbstractDigestAuthHandler
urllib2.HTTPDigestAuthHandler urllib.request.HTTPDigestAuthHandler
urllib2.ProxyDigestAuthHandler urllib.request.ProxyDigestAuthHandler
urllib2.HTTPHandler urllib.request.HTTPHandler
urllib2.HTTPSHandler urllib.request.HTTPSHandler
urllib2.FileHandler urllib.request.FileHandler
urllib2.FTPHandler urllib.request.FTPHandler
urllib2.CacheFTPHandler urllib.request.CacheFTPHandler
urllib2.UnknownHandler urllib.request.UnknownHandler

urllib2 发起 GET 请求

这里展示了一个官方使用 urllib2 的 GET 请求

import urllib2

res = urllib2.urlopen("http://httpbin.org/get")
print res.read().decode()

urllib3

urllib3 说一个 HTTP 客户端 Python 库,Python2 和 Python3 在未安装的情况下均可以使用 pip install urllib3 即可安装,它提供了很多 urllib 库中没有的重要特性:

  • 线程安全
  • 连接池
  • 客户端 SSL/TLS 验证
  • 文件分部编码上传
  • 协助处理重复请求和 HTTP 重定位
  • 支持 gzip 和 deflate 压缩编码
  • 支持 HTTP 和 SOCKS 代理
  • 100% 测试覆盖率

urllib3 发起 GET 请求

urllib3 主要的特点就是在请求之前需要创建一个连接池对象

import urllib3

http = urllib3.PoolManager()  # 线程池生成请求
res = http.request('GET', 'http://httpbin.org/get')
print(res.data.decode())

urllib3 发起 POST 请求

post 请求只需要将 request()方法的第一个参数改为 POST,并设置 fields 参数即可

import urllib3

http = urllib3.PoolManager()  # 线程池生成请求
res = http.request('POST', 'http://httpbin.org/post', fields={'hello': 'world'})
print(res.data.decode())

urllib3 设置 headers

设置 headers 的方法和设置参数一样方便,只需要加入 headers 参数即可

headers = {'X-Something': 'value'}
res = http.request('POST', 'http://httpbin.org/post', headers=headers, fields={'hello': 'world'})

requests

最后介绍一个杀手级神器——requests,你会发现它一样也很好用,requests 使用了 urllib3 的库,并且继承了所有 urllib2 的特性,最关键的是它不需要 urllib3 一样在编码时收到开启线程池,简单粗暴,不过它同样也要使用 pip install requests 安装。

格外简单的演示:

import requests

res = requests.get('http://httpbin.org/get')
print(res.text)

在实际使用中推荐使用后两种,因为毕竟方便,而若时没有安装这些库的情况下,Python3 的 urllib 也是一个不错的选择。

本文参考:https://blog.csdn.net/jiduochou963/article/details/87564467
urllib3 官方文档:https://urllib3.readthedocs.io/en/latest/
requests 官方文档:https://2.python-requests.org/en/master/

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    545 引用 • 672 回帖
  • urllib
    1 引用 • 2 回帖
  • requests
    2 引用 • 3 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...