urllib
是Python中请求url链接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了urllib。html
而urllib3则是增长了链接池等功能,二者互相都有补充的部分。python
urllib做为Python的标准库,基本上涵盖了基础的网络请求功能。安全
urllib中,request
这个模块主要负责构造和发起网络请求,并在其中加入Headers、Proxy等。服务器
主要使用urlopen()
方法来发起请求:cookie
from urllib import request resp = request.urlopen('http://www.baidu.com') print(resp.read().decode())
在urlopen()
方法中传入字符串格式的url地址,则此方法会访问目标网址,而后返回访问的结果。网络
访问的结果会是一个http.client.HTTPResponse
对象,使用此对象的read()
方法,则能够获取访问网页得到的数据。可是要注意的是,得到的数据会是bytes
的二进制格式,因此须要decode()
一下,转换成字符串格式。网站
urlopen()
默认的访问方式是GET,当在urlopen()
方法中传入data参数时,则会发起POST请求。ui
注意:传递的data数据须要为bytes格式。编码
设置timeout参数还能够设置超时时间,若是请求时间超出,那么就会抛出异常。url
from urllib import request resp = request.urlopen('http://httpbin.org', data=b'word=hello', timeout=10) print(resp.read().decode())
经过urllib
发起的请求会有默认的一个Headers:"User-Agent":"Python-urllib/3.6",指明请求是由urllib
发送的。
因此遇到一些验证User-Agent的网站时,咱们须要自定义Headers,而这须要借助于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'} # 须要使用url和headers生成一个Request对象,而后将其传入urlopen方法中 req = request.Request(url, headers=headers) resp = request.urlopen(req) print(resp.read().decode())
如上所示,urlopen()
方法中不止能够传入字符串格式的url,也能够传入一个Request
对象来扩展功能,Request
对象以下所示。
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
构造Request
对象必须传入url参数,data数据和headers都是可选的。
最后,Request
方法可使用method参数来自由选择请求的方法,如PUT,DELETE等等,默认为GET。
为了在请求时能带上Cookie信息,咱们须要从新构造一个opener。
使用request.build_opener方法来进行构造opener,将咱们想要传递的cookie配置到opener中,而后使用这个opener的open方法来发起请求。
from http import cookiejar from urllib import request url = 'http://httpbin.org/cookies' # 建立一个cookiejar对象 cookie = cookiejar.CookieJar() # 使用HTTPCookieProcessor建立cookie处理器 cookies = request.HTTPCookieProcessor(cookie) # 并以它为参数建立Opener对象 opener = request.build_opener(cookies) # 使用这个opener来发起请求 resp = opener.open(url) print(resp.read().decode())
或者也能够把这个生成的opener使用install_opener方法来设置为全局的。
则以后使用urlopen方法发起请求时,都会带上这个cookie。
# 将这个opener设置为全局的opener request.install_opener(opener) resp = request.urlopen(url)
使用爬虫来爬取数据的时候,经常须要使用代理来隐藏咱们的真实IP。
from urllib import request url = 'http://httpbin.org/ip' proxy = {'http':'50.233.137.33:80','https':'50.233.137.33:80'} # 建立代理处理器 proxies = request.ProxyHandler(proxy) # 建立opener对象 opener = request.build_opener(proxies) resp = opener.open(url) print(resp.read().decode())
在咱们进行网络请求时经常须要保存图片或音频等数据到本地,一种方法是使用python的文件操做,将read()获取的数据保存到文件中。
而urllib
提供了一个urlretrieve()
方法,能够简单的直接将请求获取的数据保存成文件。
from urllib import request url = 'http://python.org/' request.urlretrieve(url, 'python.html')
urlretrieve()
方法传入的第二个参数为文件保存的位置,以及文件名。
注:urlretrieve()
方法是python2直接移植过来的方法,之后有可能在某个版本中弃用。
在使用urlopen()
方法或者opener的open()
方法发起请求后,得到的结果是一个response
对象。
这个对象有一些方法和属性,可让咱们对请求返回的结果进行一些处理。
read()
获取响应返回的数据,只能使用一次。
getcode()
获取服务器返回的状态码。
getheaders()
获取返回响应的响应报头。
geturl()
获取访问的url。
urllib.parse
是urllib中用来解析各类数据格式的模块。
在url中,是只能使用ASCII中包含的字符的,也就是说,ASCII不包含的特殊字符,以及中文等字符都是不能够在url中使用的。而咱们有时候又有将中文字符加入到url中的需求,例如百度的搜索地址:
https://www.baidu.com/s?wd=南北
?以后的wd参数,则是咱们搜索的关键词。那么咱们实现的方法就是将特殊字符进行url编码,转换成能够url能够传输的格式,urllib中可使用quote()
方法来实现这个功能。
>>> from urllib import parse >>> keyword = '南北' >>> parse.quote(keyword) '%E5%8D%97%E5%8C%97'
若是须要将编码后的数据转换回来,可使用unquote()
方法。
>>> parse.unquote('%E5%8D%97%E5%8C%97') '南北'
在访问url时,咱们经常须要传递不少的url参数,而若是用字符串的方法去拼接url的话,会比较麻烦,因此urllib
中提供了urlencode
这个方法来拼接url参数。
>>> from urllib import parse >>> params = {'wd': '南北', 'code': '1', 'height': '188'} >>> parse.urlencode(params) 'wd=%E5%8D%97%E5%8C%97&code=1&height=188'
在urllib
中主要设置了两个异常,一个是URLError
,一个是HTTPError
,HTTPError
是URLError
的子类。
HTTPError
还包含了三个属性:
code:请求的状态码
reason:错误的缘由
headers:响应的报头
例子:
In [1]: from urllib.error import HTTPError In [2]: try: ...: request.urlopen('https://www.jianshu.com') ...: except HTTPError as e: ...: print(e.code) 403
Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库。许多Python的原生系统已经开始使用urllib3。Urllib3提供了不少python标准库urllib里所没有的重要特性:
线程安全
链接池
客户端SSL/TLS验证
文件分部编码上传
协助处理重复请求和HTTP重定位
支持压缩编码
支持HTTP和SOCKS代理
urllib3是一个第三方库,安装很是简单,pip安装便可:
pip install urllib3
urllib3
主要使用链接池进行网络请求的访问,因此访问以前咱们须要建立一个链接池对象,以下所示:
>>> import urllib3 >>> http = urllib3.PoolManager() >>> r = http.request('GET', 'http://httpbin.org/robots.txt') >>> r.status 200 >>> r.data 'User-agent: *\nDisallow: /deny\n'
headers={'X-Something': 'value'} resp = http.request('GET', 'http://httpbin.org/headers', headers=headers)
对于GET等没有请求正文的请求方法,能够简单的经过设置fields
参数来设置url参数。
fields = {'arg': 'value'} resp = http.request('GET', 'http://httpbin.org/get', fields=fields)
若是使用的是POST等方法,则会将fields做为请求的请求正文发送。
因此,若是你的POST请求是须要url参数的话,那么须要本身对url进行拼接。
fields = {'arg': 'value'} resp = http.request('POST', 'http://httpbin.org/get', fields=fields)
>>> import urllib3 >>> proxy = urllib3.ProxyManager('http://50.233.137.33:80', headers={'connection': 'keep-alive'}) >>> resp = proxy.request('get', 'http://httpbin.org/ip') >>> resp.status 200 >>> resp.data b'{"origin":"50.233.136.254"}\n'
**注:urllib3
中没有直接设置cookies的方法和参数,只能将cookies设置到headers中