Python爬虫--urllib3
首先,导入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', ...}
查询参数
对于GET
,HEAD
和DELETE
请求,您只需将参数作为参数中的字典传递fields
给request()
:
>>> r = http.request(
... 'GET',
... 'http://httpbin.org/get',
... fields={'arg': 'value'})
>>> json.loads(r.data.decode('utf-8'))['args']
{'arg': 'value'}
对于POST
和PUT
请求,您需要在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'}
表格数据
对于PUT
和POST
请求,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
, cryptography
,idna
,和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))
您仍然通过指定timeout
to来 覆盖此池级超时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))
您仍然通过指定retries
to来 覆盖此池级重试策略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相关推荐
- python爬虫urllib3模块详解
鉴于urllib请求模块的功能已经无法满足开发者的需求,出现了功能更强大的urllib3模块,urllib3模块是一个第三方的网络请求模块. 安装命令:pip install urllib3 1.发送 ...
- python爬虫入门教程--优雅的HTTP库requests(二)
requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive.连接池.Cookie持久化.内容自动解压.HTTP代理.SSL认证等很多特性,下面这篇文章主要给大家介绍 ...
- python免费自学爬虫_这套Python爬虫学习教程,不到一天即可新手到进阶!免费领...
想用Python做爬虫,而你却还不会Python的话,那么这些入门基础知识必不可少.很多小伙伴,特别是在学校的学生,接触到爬虫之后就感觉这个好厉害的样子,我要学.但是却完全不知道从何开始,很迷茫,学的 ...
- 零基础学习python爬虫_教你零基础如何入门Python爬虫!
Python爬虫好学吗?看你怎么学了.如果是自学,会难一些,毕竟有难题很难找到人帮你解答,很容易半途而废.要是你找到了一家靠谱的学校,就会容易很多.不过,这里我想教你入门Python爬虫. 一:爬虫准 ...
- python爬虫好学不_Python爬虫好学吗?
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 二:开始爬虫 1.爬虫主要分为两个部分,第一个是网页界面的获取,第二个是网页界面的解析:爬虫的原理是利用代码模拟浏览器访问网站,与浏览器不同的是,爬虫获取 ...
- python爬虫案例-Python爬虫案例集合
原标题:Python爬虫案例集合 urllib2 urllib2是Python中用来抓取网页的库,urllib2 是 Python2.7 自带的模块(不需要下载,导入即可使用) 在python2.x里 ...
- python培训好学吗-Python爬虫培训好学吗?
原标题:Python爬虫培训好学吗? 好不好学要看你怎么学了.如果是自学,会难一些,毕竟有难题很难找到人帮你解答,很容易半途而废.要是你找到了一家靠谱的学校,就会容易很多.不过,这里我想教你入门Pyt ...
- python网络爬虫的基本步骤-python爬虫入门需要哪些基础/python 网络爬虫教程
如何入门 Python 爬虫 入门个吊,放弃 python爬虫入门需要哪些基础 现在之所以有多的小伙伴热衷于爬虫技术,无外乎是因为爬我们做很多事情,比如搜索引擎.采集数据.广告过滤等,以Python为 ...
- 不会这几个库,都不敢说我会Python爬虫
很多朋友不知道Python爬虫怎么入门,怎么学习,到底要学习哪些内容.今天我来给大家说说学习爬虫,我们必须掌握的一些第三方库. 废话不多说,直接上干货. 1 请求库 1. requests GitHu ...
最新文章
- java queue 线程安全_java并发编程之线程安全方法
- javascript+HTMl5游戏下载,开发一个都能月薪上万!舅服你
- matlab padarray函数零,matlab padarray函数
- less、Element-UI等安装配置
- win server 2008 r2设置teamviewer13无人值守和开机自启动
- php最新参考文献_php论文参考文献
- 内存和flash区别
- 软件的行业适配性:进销存软件与五金行业
- Android Studio运行项目
- 【学术】英文写作中值得参考的语法、句式(二)
- java poi pdf 导出
- Sicily 1031. Campus
- 【联机对战】一张图看懂联机对战服务
- Fortify漏洞之Path Manipulation(路径篡改)
- docker搭建 JRebel 验证服务器 和 IDEA 验证服务器
- 嵌入式arm学习总结(一)--电子基础知识
- 电脑管理android手机版下载失败怎么办,腾讯手机管家PC版轻松解决Android文件管理难题...
- python入门指南 许半仙txt百度云-《漩涡》TXT全本 百度云网盘下载 by就不告诉你...
- 是时候更新Android Studio 3.5了!不信,你看~
- 技术分享 | 黑盒测试方法论—边界值
热门文章
- selenium.common.exceptions
- 【信息学奥赛一本通】1206:放苹果(递归)
- 高阶系统降阶matlab程序,高阶系统的降阶控制研究
- android功耗测试方法,手机功耗测试指南
- “行式存储”和“列式存储”的区别
- 计算二叉树的深度和宽度
- 音频服务器未响应怎么修复,win10音频服务未响应未修复教程?win10音频服务未响应未修复要怎么办?...
- 89C51单片机之寄存器
- Anaconda3修改默认环境保存路径
- 2020西安邮电大学linux兴趣小组补录