首先,导入urllib3模块:

>>> import urllib3

您需要一个PoolManager实例来发出请求。此对象处理连接池和线程安全的所有详细信息,因此您不必:

>>> http = urllib3.PoolManager()

要发出请求,请使用request()

>>> r = http.request('GET', 'http://httpbin.org/robots.txt')
>>> r.data
b'User-agent: *\nDisallow: /deny\n'

request()返回一个HTTPResponse对象, 响应内容部分解释了如何处理各种响应。

您可以使用request()任何HTTP动词来发出请求:

>>> r = http.request(
...     'POST',
...     'http://httpbin.org/post',
...     fields={'hello': 'world'})

该请求数据部分涵盖发送其他类型的请求的数据,包括JSON,文件和二进制数据。

响应内容

的HTTPResponse对象提供 status,data和 header属性:

>>> r = http.request('GET', 'http://httpbin.org/ip')
>>> r.status
200
>>> r.data
b'{\n  "origin": "104.232.115.37"\n}\n'
>>> r.headers
HTTPHeaderDict({'Content-Length': '33', ...})

JSON内容

可以通过解码和反序列data化请求的属性来加载JSON内容 :

>>> import json
>>> r = http.request('GET', 'http://httpbin.org/ip')
>>> json.loads(r.data.decode('utf-8'))
{'origin': '127.0.0.1'}

二进制内容

data响应的属性始终设置为表示响应内容的字节字符串:

>>> r = http.request('GET', 'http://httpbin.org/bytes/8')
>>> r.data
b'\xaa\xa5H?\x95\xe9\x9b\x11'

注意

对于更大的响应,有时更好地传输 响应。

请求数据

标题

您可以在headers参数中将标题指定为字典request()

>>> r = http.request(
...     'GET',
...     'http://httpbin.org/headers',
...     headers={
...         'X-Something': 'value'
...     })
>>> json.loads(r.data.decode('utf-8'))['headers']
{'X-Something': 'value', ...}

查询参数

对于GETHEADDELETE请求,您只需将参数作为参数中的字典传递fieldsrequest()

>>> r = http.request(
...     'GET',
...     'http://httpbin.org/get',
...     fields={'arg': 'value'})
>>> json.loads(r.data.decode('utf-8'))['args']
{'arg': 'value'}

对于POSTPUT请求,您需要在URL中手动编码查询参数:

>>> from urllib.parse import urlencode
>>> encoded_args = urlencode({'arg': 'value'})
>>> url = 'http://httpbin.org/post?' + encoded_args
>>> r = http.request('POST', url)
>>> json.loads(r.data.decode('utf-8'))['args']
{'arg': 'value'}

表格数据

对于PUTPOST请求,urllib3将自动对fields提供的参数中 的字典进行格式编码request()

>>> r = http.request(
...     'POST',
...     'http://httpbin.org/post',
...     fields={'field': 'value'})
>>> json.loads(r.data.decode('utf-8'))['form']
{'field': 'value'}

JSON

您可以通过将编码数据指定为body 参数并Content-Type在调用时设置标头来 向JSON发送请求request()

>>> import json
>>> data = {'attribute': 'value'}
>>> encoded_data = json.dumps(data).encode('utf-8')
>>> r = http.request(
...     'POST',
...     'http://httpbin.org/post',
...     body=encoded_data,
...     headers={'Content-Type': 'application/json'})
>>> json.loads(r.data.decode('utf-8'))['json']
{'attribute': 'value'}

文件和二进制数据

要使用multipart/form-data编码上载文件,您可以使用与表单数据相同的方法,并将文件字段指定为以下元组 :(file_name, file_data)

>>> with open('example.txt') as fp:
...     file_data = fp.read()
>>> r = http.request(
...     'POST',
...     'http://httpbin.org/post',
...     fields={
...         'filefield': ('example.txt', file_data),
...     })
>>> json.loads(r.data.decode('utf-8'))['files']
{'filefield': '...'}

虽然不严格要求指定文件名,但建议使用它来匹配浏览器行为。您还可以传递元组中的第三个项目以明确指定文件的MIME类型:

>>> r = http.request(
...     'POST',
...     'http://httpbin.org/post',
...     fields={
...         'filefield': ('example.txt', file_data, 'text/plain'),
...     })

要发送原始二进制数据,只需指定body参数即可。还建议设置Content-Type标题:

>>> with open('example.jpg', 'rb') as fp:
...     binary_data = fp.read()
>>> r = http.request(
...     'POST',
...     'http://httpbin.org/post',
...     body=binary_data,
...     headers={'Content-Type': 'image/jpeg'})
>>> json.loads(r.data.decode('utf-8'))['data']
b'...'

证书验证

强烈建议始终使用SSL证书验证。 默认情况下,urllib3不验证HTTPS请求

为了启用验证,您需要一组根证书。最简单,最可靠的方法是使用提供Mozilla根证书包的certifi包:

pip install certifi

您还可以使用secure 额外的安装与urllib3一起安装certifi :

pip install urllib3[secure]

警告

如果您使用的是Python 2,则可能需要其他软件包。有关详细信息,请参阅以下部分。

获得证书后,您可以创建PoolManager 在发出请求时验证证书的证书:

>>> import certifi
>>> import urllib3
>>> http = urllib3.PoolManager(
...     cert_reqs='CERT_REQUIRED',
...     ca_certs=certifi.where())

该PoolManager会自动处理证书验证,并会提高SSLError,如果验证失败:

>>> http.request('GET', 'https://google.com')
(No exception)
>>> http.request('GET', 'https://expired.badssl.com')
urllib3.exceptions.SSLError ...

注意

如果需要,您可以使用OS提供的证书。只需指定证书包的完整路径作为ca_certs参数而不是 certifi.where()。例如,大多数Linux系统都存储证书/etc/ssl/certs/ca-certificates.crt。其他操作系统可能很难。

Python 2中的证书验证

较旧版本的Python 2使用ssl缺少SNI支持的模块 构建,并且可能落后于安全更新。由于这些原因,建议使用 pyOpenSSL。

如果你使用secure额外的安装urllib3,将安装Python 2上所有必需的证书验证包:

pip install urllib3[secure]

如果您想要手动安装的软件包,您需要pyOpenSSL, cryptographyidna,和certifi

注意

如果您不使用macOS或Windows,请注意加密需要额外的系统包进行编译。有关 所需软件包的列表,请参阅在Linux上构建加密。

安装完成后,您可以通过以下方式告诉urllib3使用pyOpenSSL urllib3.contrib.pyopenssl:

>>> import urllib3.contrib.pyopenssl
>>> urllib3.contrib.pyopenssl.inject_into_urllib3()

最后,您可以创建一个PoolManager在执行请求时验证证书:

>>> import certifi
>>> import urllib3
>>> http = urllib3.PoolManager(
...     cert_reqs='CERT_REQUIRED',
...     ca_certs=certifi.where())

如果你不想使用pyOpenSSL,你可以简单地省略对它的调用urllib3.contrib.pyopenssl.inject_into_urllib3()。urllib3将回退到标准库ssl模块。执行此操作时,您可能会遇到 几个警告。

警告

如果您不使用pyOpenSSL,则必须使用ssl支持编译Python以使证书验证起作用。这种情况并不常见,但可以在没有SSL支持的情况下编译Python。有关 更多详细信息,请参阅此 Stackoverflow线程。

如果您使用的是Google App Engine,则必须在以下位置明确启用SSL支持app.yaml

libraries:
- name: sslversion: latest

使用超时

超时允许您控制在中止之前允许运行的请求的时间。在简单的情况下,您可以将超时指定float 为request()

>>> http.request(
...     'GET', 'http://httpbin.org/delay/3', timeout=4.0)
<urllib3.response.HTTPResponse>
>>> http.request(
...     'GET', 'http://httpbin.org/delay/3', timeout=2.5)
MaxRetryError caused by ReadTimeoutError

要进行更精细的控制,您可以使用一个Timeout 实例,它允许您指定单独的连接和读取超时:

>>> http.request(
...     'GET',
...     'http://httpbin.org/delay/3',
...     timeout=urllib3.Timeout(connect=1.0))
<urllib3.response.HTTPResponse>
>>> http.request(
...     'GET',
...     'http://httpbin.org/delay/3',
...     timeout=urllib3.Timeout(connect=1.0, read=2.0))
MaxRetryError caused by ReadTimeoutError

如果您希望所有请求都受到相同的超时,您可以在PoolManager级别指定超时:

>>> http = urllib3.PoolManager(timeout=3.0)
>>> http = urllib3.PoolManager(
...     timeout=urllib3.Timeout(connect=1.0, read=2.0))

您仍然通过指定timeoutto来 覆盖此池级超时request()

重试请求

urllib3可以自动重试幂等请求。同样的机制也处理重定向。您可以使用retries参数to 控制重试次数request()。默认情况下,urllib3将重试请求3次,并最多跟进3次重定向。

要更改重试次数,只需指定一个整数:

>>> http.requests('GET', 'http://httpbin.org/ip', retries=10)

要禁用所有重试和重定向逻辑,请指定retries=False

>>> http.request(
...     'GET', 'http://nxdomain.example.com', retries=False)
NewConnectionError
>>> r = http.request(
...     'GET', 'http://httpbin.org/redirect/1', retries=False)
>>> r.status
302

要禁用重定向但保留重试逻辑,请指定redirect=False

>>> r = http.request(
...     'GET', 'http://httpbin.org/redirect/1', redirect=False)
>>> r.status
302

要获得更精细的控制,您可以使用Retry实例。此类允许您更好地控制请求的重试方式。

例如,要总共执行3次重试,但仅限于2次重定向:

>>> http.request(
...     'GET',
...     'http://httpbin.org/redirect/3',
...     retries=urllib3.Retry(3, redirect=2))
MaxRetryError

您还可以禁用太多重定向的异常,只返回 302响应:

>>> r = http.request(
...     'GET',
...     'http://httpbin.org/redirect/3',
...     retries=urllib3.Retry(
...         redirect=2, raise_on_redirect=False))
>>> r.status
302

如果您希望所有请求都遵循相同的重试策略,则可以在PoolManager级别指定重试:

>>> http = urllib3.PoolManager(retries=False)
>>> http = urllib3.PoolManager(
...     retries=urllib3.Retry(5, redirect=2))

您仍然通过指定retriesto来 覆盖此池级重试策略request()

错误和异常

urllib3包含较低级别的异常,例如:

>>> try:
...     http.request('GET', 'nx.example.com', retries=False)
>>> except urllib3.exceptions.NewConnectionError:
...     print('Connection failed.')

有关exceptions所有例外的完整列表,请参阅。

记录

如果您使用的是标准库logging模块,则urllib3会发出几个日志。在某些情况下,这可能是不可取的。您可以使用标准记录器界面更改urllib3记录器的日志级别:

>>> logging.getLogger("urllib3").setLevel(logging.WARNING)

Python爬虫--urllib3相关推荐

  1. python爬虫urllib3模块详解

    鉴于urllib请求模块的功能已经无法满足开发者的需求,出现了功能更强大的urllib3模块,urllib3模块是一个第三方的网络请求模块. 安装命令:pip install urllib3 1.发送 ...

  2. python爬虫入门教程--优雅的HTTP库requests(二)

    requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive.连接池.Cookie持久化.内容自动解压.HTTP代理.SSL认证等很多特性,下面这篇文章主要给大家介绍 ...

  3. python免费自学爬虫_这套Python爬虫学习教程,不到一天即可新手到进阶!免费领...

    想用Python做爬虫,而你却还不会Python的话,那么这些入门基础知识必不可少.很多小伙伴,特别是在学校的学生,接触到爬虫之后就感觉这个好厉害的样子,我要学.但是却完全不知道从何开始,很迷茫,学的 ...

  4. 零基础学习python爬虫_教你零基础如何入门Python爬虫!

    Python爬虫好学吗?看你怎么学了.如果是自学,会难一些,毕竟有难题很难找到人帮你解答,很容易半途而废.要是你找到了一家靠谱的学校,就会容易很多.不过,这里我想教你入门Python爬虫. 一:爬虫准 ...

  5. python爬虫好学不_Python爬虫好学吗?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 二:开始爬虫 1.爬虫主要分为两个部分,第一个是网页界面的获取,第二个是网页界面的解析:爬虫的原理是利用代码模拟浏览器访问网站,与浏览器不同的是,爬虫获取 ...

  6. python爬虫案例-Python爬虫案例集合

    原标题:Python爬虫案例集合 urllib2 urllib2是Python中用来抓取网页的库,urllib2 是 Python2.7 自带的模块(不需要下载,导入即可使用) 在python2.x里 ...

  7. python培训好学吗-Python爬虫培训好学吗?

    原标题:Python爬虫培训好学吗? 好不好学要看你怎么学了.如果是自学,会难一些,毕竟有难题很难找到人帮你解答,很容易半途而废.要是你找到了一家靠谱的学校,就会容易很多.不过,这里我想教你入门Pyt ...

  8. python网络爬虫的基本步骤-python爬虫入门需要哪些基础/python 网络爬虫教程

    如何入门 Python 爬虫 入门个吊,放弃 python爬虫入门需要哪些基础 现在之所以有多的小伙伴热衷于爬虫技术,无外乎是因为爬我们做很多事情,比如搜索引擎.采集数据.广告过滤等,以Python为 ...

  9. 不会这几个库,都不敢说我会Python爬虫

    很多朋友不知道Python爬虫怎么入门,怎么学习,到底要学习哪些内容.今天我来给大家说说学习爬虫,我们必须掌握的一些第三方库. 废话不多说,直接上干货. 1 请求库 1. requests GitHu ...

最新文章

  1. java queue 线程安全_java并发编程之线程安全方法
  2. javascript+HTMl5游戏下载,开发一个都能月薪上万!舅服你
  3. matlab padarray函数零,matlab padarray函数
  4. less、Element-UI等安装配置
  5. win server 2008 r2设置teamviewer13无人值守和开机自启动
  6. php最新参考文献_php论文参考文献
  7. 内存和flash区别
  8. 软件的行业适配性:进销存软件与五金行业
  9. Android Studio运行项目
  10. 【学术】英文写作中值得参考的语法、句式(二)
  11. java poi pdf 导出
  12. Sicily 1031. Campus
  13. 【联机对战】一张图看懂联机对战服务
  14. Fortify漏洞之Path Manipulation(路径篡改)
  15. docker搭建 JRebel 验证服务器 和 IDEA 验证服务器
  16. 嵌入式arm学习总结(一)--电子基础知识
  17. 电脑管理android手机版下载失败怎么办,腾讯手机管家PC版轻松解决Android文件管理难题...
  18. python入门指南 许半仙txt百度云-《漩涡》TXT全本 百度云网盘下载 by就不告诉你...
  19. 是时候更新Android Studio 3.5了!不信,你看~
  20. 技术分享 | 黑盒测试方法论—边界值

热门文章

  1. selenium.common.exceptions
  2. 【信息学奥赛一本通】1206:放苹果(递归)
  3. 高阶系统降阶matlab程序,高阶系统的降阶控制研究
  4. android功耗测试方法,手机功耗测试指南
  5. “行式存储”和“列式存储”的区别
  6. 计算二叉树的深度和宽度
  7. 音频服务器未响应怎么修复,win10音频服务未响应未修复教程?win10音频服务未响应未修复要怎么办?...
  8. 89C51单片机之寄存器
  9. Anaconda3修改默认环境保存路径
  10. 2020西安邮电大学linux兴趣小组补录