目录

  • 网络库urllib3
    • 网络请求
      • GET请求
      • POST请求
    • HTTP响应头
    • 上传文件
    • 超时处理

网络库urllib3

urllib3是比urllib库更强大的存在,目前已经有许多的原生系统已经开始使用urllib3。

urllib3具有如下优点:

  1. 支持HTTP和SOCKS代理
  2. 支持压缩编码
  3. 100%测试覆盖率
  4. 具有链接池
  5. 线程安全
  6. 客户端SLL/TLS验证
  7. 协助处理重复请求和HTTP重定位
  8. 使用multipart编码上传文件

因为urllib3并不是Python的标准库,所以我们使用之前,需要进行下载安装,具体命令如下所示:

pip install urllib3
#或
conda install urllib3

下面,我们来讲解urllib3库的使用方式。

网络请求

GET请求

首先,在我们使用urllib3库进行网络请求时,需创建PoolManager类的实例,该类用于管理线程池。

下面,我们来通过urllib访问百度,并返回查询的结果,示例如下:

import urllib3http = urllib3.PoolManager()
url = 'http://www.baidu.com/s'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = http.request('GET', url, fields={'wd': '机器学习'}, headers=headers)
result = response.data.decode('UTF-8')
print(result)

运行之后,效果如下:

这里,我们通过fields参数指定GET的请求字段。不过,这里先一步讲解了请求头,其实是百度有安全机制,读者可以去掉headers参数试试。会返回百度的安全验证页面。

POST请求

如果需要向服务器提交表单或者比较复杂的数据,就需要使用到POST请求。POST请求比较简单,仅仅只是将请求的第一个参数改为“POST”即可。

示例如下:

import urllib3http = urllib3.PoolManager()
url = 'http://httpbin.org/post'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = http.request('POST', url, fields={'username': 'name', 'age': '123456'}, headers=headers)
result = response.data.decode('UTF-8')
print(result)

运行之后,返回如下数据:

HTTP响应头

使用urllib3库进行网络访问时,其返回的HTTPResponse。默认有一些携带的参数,其中就包括info方法。它能返回响应头数据,示例如下:

import urllib3http = urllib3.PoolManager()
url = 'http://www.baidu.com/s'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = http.request('POST', url, fields={'wd': '机器学习'}, headers=headers)
for key in response.info().keys():print('key:',response.info()[key])

运行之后,返回的响应数据如下:

上传文件

首先,我们需要简单的实现一个文件上传的服务器代码,这里我们使用Flask搭建一个简单的服务器Python程序,代码如下:

import flask
import osUPLOAD_FILE = 'uploads'
app = flask.Flask(__name__)
@app.route('/', methods=['POST'])
def upload_file():file = flask.request.files['file']if file:file.save(os.path.join(UPLOAD_FILE, os.path.basename(file.filename)))return '文件上传成功'else:return '文件上传失败'if __name__ == '__main__':app.run()

运行之后,它会一直等待客户端上传文件。

这个时候,我们再来实现urllib3是如何上传文件的,示例如下:

import urllib3http = urllib3.PoolManager()
with open('1.jpg', 'rb') as f:fileData = f.read()
url = 'http://127.0.0.1:5000'
response = http.request('POST', url, fields={'file': ('1.jpg', fileData, 'image/jpeg')})
print(response.data.decode('UTF-8'))

默认flask搭建的服务器,其接口为5000,也就是通过127.0.0.1:5000进行访问。运行之后,就会在uploads文件夹下创建一个1.jpg的图片。

同时,控制台会输出文件上传成功,而服务器会返回状态码200。

这里,上传文件就1一个键值对,其中file代表服务器上传文件的字段。值的元组里,fileData为文件的二进制形式,'image/jpeg’代表上传文件的格式(可以省略)。

超时处理

urllib3库其HTTP的底层都是基于Socket实现的,而Socket超时又分为连接超时与读超时。

其中,连接超时表示在连接的过程中,由于服务器的问题或域名弄错了,而导致的无法连接的情况抛出的异常。

读超时表示从服务器读取数据时由于服务器的问题,导致长时间无法正常读取数据而导致的异常。

通常,我们超时的设置有2种,一种是通过http.request(timeout)进行设置,一种是通过PoolManager()连接池进行设置。示例如下:

from urllib3 import *http = PoolManager(timeout=Timeout(connect=2.0, read=2.0))
with open('1.jpg', 'rb') as f:fileData = f.read()
url = 'http://127.0.0.1:5000'
try:response = http.request('POST', url, timeout=Timeout(connect=2.0, read=4.0))print(response.data.decode('UTF-8'))
except Exception as e:print(e)

需要注意的是,通过连接池PoolManager进行设置的超时,是全局超时时间,哪怕你后边的请求不设置,也是默认使用的这个超时。如果同时设置了request的超时,那么以request为准。

Python爬虫:urllib3与urllib到底有何区别?内行人告诉你答案相关推荐

  1. Python爬虫入门系列——Urllib详解

    Python爬虫入门系列--Urllib详解 1.背景 1.1 初识爬虫 1.2 合法性 1.3 robots协议 2.要求 2.1 当前开发环境 2.2 编程基础 3.快速上手Urllib 3.1 ...

  2. Python爬虫入门之Urllib库的基本使用

    那么接下来,小伙伴们就一起和我真正迈向我们的爬虫之路吧. 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解 ...

  3. Python爬虫技术栈 | urllib库urllib3库

    ❤️urllib库详解❤️ 每篇前言: 第一部分:urllib库 一.request模块:发送请求 1.urlopen() (1)简单使用: (2)高级使用:如果想给链接传递一些参数,就要用到urlo ...

  4. Python爬虫教程:urllib 基础使用(三)

    人生苦短,我用 Python 引言 前面两篇基础,我们介绍请求发送的过程. 不知道各位同学有没有想过这样一个问题,如果在爬虫运行的过程中,网络突然波动了下,比如突然网速很慢很慢,造成当前的请求超时,程 ...

  5. python爬虫urllib3模块详解

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

  6. Python爬虫--urllib3

    首先,导入urllib3模块: >>> import urllib3 您需要一个PoolManager实例来发出请求.此对象处理连接池和线程安全的所有详细信息,因此您不必: > ...

  7. Python 爬虫篇 - 通过urllib.request伪装成浏览器绕过反爬虫爬取网页所有连接实例演示,urllib2库的安装

    新版的 python 把 urllib2 改成了 urllib.request,所以直接导入 urllib2 会报错. 这是我通过 chrome92 版本的浏览器发送请求的时候抓到的头部信息,只要我在 ...

  8. Python爬虫入门四urllib库的高级用法

    1.设置headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些 Headers 的属性. 首先,打开我们的浏 ...

  9. Python爬虫入门三urllib库基本使用

    urllib是一个收集了多个涉及了URL的模块的包: URL获取网页 urllibtest.pyimport urllib2 response = urllib2.urlopen('http://ww ...

最新文章

  1. 『TensorFlow』数据读取类_data.Dataset
  2. python limit_Python MySQL Limit
  3. 什么是RPC?RPC框架dubbo的核心流程
  4. POJ2255Tree Recovery
  5. SRS流媒体服务器——Edge集群搭建
  6. YbOJ-网格序列【拉格朗日插值】
  7. 08_MySQL DQL_SQL99标准中的多表查询(内连接)
  8. android filehelper,为AndroidStudio开发mvp插件(MvpHelper)
  9. IOS ActivityIndicator 活动指示器使用
  10. jsoup解析和遍历一个html文档详解
  11. mysql 命令限制_MySQL 命令总结
  12. ASP.NET File.Delete只读文件引起的访问被拒绝,设置文件属性为Normal
  13. [转]Visual Studio 2005创建VC++智能设备项目失败的解决方法
  14. Ajax Session Timeout处理
  15. linux 批量解压war,图文处理war包解压【搞定方式】
  16. 【渝粤题库】广东开放大学 服务质量管理 形成性考核
  17. setResult(RESULT_OK, intent)回调不执行问题
  18. python+django高速公路收费管理系统的设计
  19. HTML+CSS静态页面网页设计作业——甜品奶茶店(19页) HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作
  20. Hive-beeline启动脚本

热门文章

  1. audioread.exceptions.NoBackendError in librosa
  2. onApplicationEvent调用了2次,3次,多次
  3. TCGA癌症中英文及缩写名称对应表
  4. 网络空间安全——攻防对抗 2.0
  5. KubeCon+CloudNativeCon 资料
  6. 玩转Android10源码开发定制(二)之基于Pixel 3手机超级详细演示fastboot刷机
  7. 特斯拉 开源_特斯拉开源其安全软件,好莱坞开源,更多新闻
  8. FineReport 连接 SAP HANA 数据库
  9. hana数据库异机恢复
  10. 开源同态加密库 HEhub 发布|首个由国内隐私计算团队研发的(全)同态加密算法库...