不知道有没有人跟我一样想过这个问题,Python 怎么会有那么多网络请求的库 urllib、urllib2...这我到底要用哪一个,几个库又有什么区别,真是让人头大,下文我就针对 urllib、urllib2、urllib3 来做一个详细的阐述。
urllib、urllib2、urllib3 均能通过网络访问互联网上的资源文件,它们通过使用统一资源定位符(URL)并结合 re 模块完成很多意想不到的操作。
注意: 在 Python2 中 urllib 和 urllib2 一般搭配使用的(不然 Python2 整两个内置库干嘛),urllib 具有 urllib2 没有的功能,而 urllib2 具有 urllib 没有的功能。
urllib 这个 Python 标准库基本上包含了基础的网络请求功能,以下 urllib 的演示均为 Python3 中的用法,Python2 中单独用 urllib 会比较难受,上面也提到了它最好配合 urllib2 一起使用。
urlopen()
方法发起请求,read()
方法获取网页数据
from urllib import request
res = request.urlopen("http://httpbin.org/get")
print(res.read().decode()) # read() 方法读取的数据是 bytes 的二进制格式,需要解码
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 发起的请求默认的头信息是 "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"
}
在使用爬虫时经常会配置代理隐藏我们的 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())
from urllib import request
url = 'http://httpbin.org/image/jpeg'
request.urlretrieve(url, '1.jpg')
urllib2 的用法其实基本和 urllib 相似,且它只存在于 Python2 版本,它的使用时需要配合 urllib 一起使用,要说它和 urllib 的区别还要看下面这个表,下表主要说明了在 Python2 中的 urllib、urllib2 中的方法整合到 Python3 后方法名的区别。
Python2 | Python3 |
---|---|
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请求
import urllib2
res = urllib2.urlopen("http://httpbin.org/get")
print res.read().decode()
urllib3 说一个 HTTP 客户端 Python 库,Python2 和 Python3 在未安装的情况下均可以使用 pip install urllib3
即可安装,它提供了很多 urllib 库中没有的重要特性:
urllib3 主要的特点就是在请求之前需要创建一个连接池对象
import urllib3
http = urllib3.PoolManager() # 线程池生成请求
res = http.request('GET', 'http://httpbin.org/get')
print(res.data.decode())
post 请求只需要将 request()
方法的第一个参数改为 POST,并设置 fields 参数即可
import urllib3
http = urllib3.PoolManager() # 线程池生成请求
res = http.request('POST', 'http://httpbin.org/post', fields={'hello': 'world'})
print(res.data.decode())
设置 headers 的方法和设置参数一样方便,只需要加入 headers 参数即可
headers = {'X-Something': 'value'}
res = http.request('POST', 'http://httpbin.org/post', headers=headers, fields={'hello': 'world'})
最后介绍一个杀手级神器——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/
😄 不客气
😄 不客气
不错,感谢
不错,感谢