1. 简介

urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了urllib。

而urllib3则是增加了连接池等功能,两者互相都有补充的部分。

2. urllib

urllib作为Python的标准库,基本上涵盖了基础的网络请求功能。


2.1. urllib.request

urllib中,request这个模块主要负责构造和发起网络请求,并在其中加入Headers、Proxy等。

2.1.1. 发起GET请求

主要使用urlopen()方法来发起请求:

from urllib import requestresp = request.urlopen('http://www.baidu.com')
print(resp.read().decode())

urlopen()方法中传入字符串格式的url地址,则此方法会访问目标网址,然后返回访问的结果。

访问的结果会是一个http.client.HTTPResponse对象,使用此对象的read()方法,则可以获取访问网页获得的数据。但是要注意的是,获得的数据会是bytes的二进制格式,所以需要decode()一下,转换成字符串格式。

2.1.2. 发起POST请求

urlopen()默认的访问方式是GET,当在urlopen()方法中传入data参数时,则会发起POST请求。注意:传递的data数据需要为bytes格式。

设置timeout参数还可以设置超时时间,如果请求时间超出,那么就会抛出异常。

from urllib import requestresp = request.urlopen('http://httpbin.org/post', data=b'word=hello', timeout=10)
print(resp.read().decode())

2.1.3. 添加Headers

通过urllib发起的请求会有默认的一个Headers:"User-Agent":"Python-urllib/3.6",指明请求是由urllib发送的。

所以遇到一些验证User-Agent的网站时,我们需要自定义Headers,而这需要借助于urllib.request中的Request对象。

from urllib import requesturl = '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())

2.1.4. Request对象

如上所示,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。

2.1.5. 添加Cookie

为了在请求时能带上Cookie信息,我们需要重新构造一个opener。

使用request.build_opener方法来进行构造opener,将我们想要传递的cookie配置到opener中,然后使用这个opener的open方法来发起请求。

from http import cookiejar
from urllib import requesturl = 'https://www.baidu.com'
# 创建一个cookiejar对象
cookie = cookiejar.CookieJar()
# 使用HTTPCookieProcessor创建cookie处理器
cookies = request.HTTPCookieProcessor(cookie)
# 并以它为参数创建Opener对象
opener = request.build_opener(cookies)
# 使用这个opener来发起请求
resp = opener.open(url)# 查看之前的cookie对象,则可以看到访问百度获得的cookie
for i in cookie:print(i)

或者也可以把这个生成的opener使用install_opener方法来设置为全局的。

则之后使用urlopen方法发起请求时,都会带上这个cookie。

# 将这个opener设置为全局的opener
request.install_opener(opener)
resp = request.urlopen(url)

2.1.6. 设置Proxy代理

使用爬虫来爬取数据的时候,常常需要使用代理来隐藏我们的真实IP。

from urllib import requesturl = 'http://httpbin.org/ip'
proxy = {'http':'218.18.232.26:80','https':'218.18.232.26:80'}
# 创建代理处理器
proxies = request.ProxyHandler(proxy)
# 创建opener对象
opener = request.build_opener(proxies)resp = opener.open(url)
print(resp.read().decode())

2.1.7. 下载数据到本地

在我们进行网络请求时常常需要保存图片或音频等数据到本地,一种方法是使用python的文件操作,将read()获取的数据保存到文件中。

urllib提供了一个urlretrieve()方法,可以简单的直接将请求获取的数据保存成文件。

from urllib import requesturl = 'http://python.org/'
request.urlretrieve(url, 'python.html')

urlretrieve()方法传入的第二个参数为文件保存的位置,以及文件名。

注:urlretrieve()方法是python2直接移植过来的方法,以后有可能在某个版本中弃用。


2.2. urllib.response

在使用urlopen()方法或者opener的open()方法发起请求后,获得的结果是一个response对象。

这个对象有一些方法和属性,可以让我们对请求返回的结果进行一些处理。

  • read()

    获取响应返回的数据,只能使用一次。

  • getcode()

    获取服务器返回的状态码。

  • getheaders()

    获取返回响应的响应报头。

  • geturl()

    获取访问的url。


2.3. urllib.parse

urllib.parse是urllib中用来解析各种数据格式的模块。

2.3.1. urllib.parse.quote

在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')
'南北'

2.3.2. urllib.parse.urlencode

在访问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'

2.4. urllib.error

urllib中主要设置了两个异常,一个是URLError,一个是HTTPErrorHTTPErrorURLError的子类。

HTTPError还包含了三个属性:

  • code:请求的状态码
  • reason:错误的原因
  • headers:响应的报头

例子:

In [1]: from urllib.error import HTTPErrorIn [2]: try:...:     request.urlopen('https://www.jianshu.com')...: except HTTPError as e:...:     print(e.code)403

3. urllib3

Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库。许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库urllib里所没有的重要特性:

  1. 线程安全
  2. 连接池
  3. 客户端SSL/TLS验证
  4. 文件分部编码上传
  5. 协助处理重复请求和HTTP重定位
  6. 支持压缩编码
  7. 支持HTTP和SOCKS代理

3.1. 安装

urllib3是一个第三方库,安装非常简单,pip安装即可:

pip install urllib3

3.2. 使用

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'

3.2.1. 设置headers

headers={'X-Something': 'value'}
resp = http.request('GET', 'http://httpbin.org/headers', headers=headers)

3.2.2. 设置url参数

对于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)

3.2.3. 设置代理

>>> 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中

转载地址:https://www.jianshu.com/p/f05d33475c78

Python网络请求urllib和urllib3详解相关推荐

  1. python网络爬虫的基本步骤-详解Python网络爬虫功能的基本写法

    网络爬虫,即Web Spider,是一个很形象的名字.把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 1. 网络爬虫的定义 网络蜘蛛是通过网页的链接地址来寻找网页的.从网站某一个 ...

  2. 安卓项目实战之强大的网络请求框架okGo使用详解(一):实现get,post基本网络请求,下载上传进度监听以及对Callback自定义的深入理解

    1.添加依赖 //必须使用 compile 'com.lzy.net:okgo:3.0.4'//以下三个选择添加,okrx和okrx2不能同时使用,一般选择添加最新的rx2支持即可 compile ' ...

  3. android网络请求库volley方法详解

    使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列     ...

  4. Flutter 网络请求框架dio使用详解

    前言 dio是一款Flutter 网络请求框架,在GitHub上目前有超过5.9k个star.由国人(Flutter中文网)开发,所以中文文档非常完善. 这里copy了dio官方的文档,便于自己开发时 ...

  5. pythonurllib模块-Python中的urllib模块使用详解

    urllib模块提供的上层接口,使我们可以像读取本地文件一样读取www和ftp上的数据.每当使用这个模块的时候,老是会想起公司产品的客户端,同事用C++下载Web上的图片,那种"痛苦&quo ...

  6. Android 网络请求HttpURLConnection 和 HttpClient详解

    Android一般通过http协议向服务端接口发送请求,常用有POST和GET传输方式.这种请求通常借助于HttpClient,HttpClient 是 Apache Jakarta Common 下 ...

  7. SpringBoot - 网络请求客户端WebClient使用详解

    在 Spring 5 之前,如果我们想要调用其他系统提供的 HTTP 服务,通常可以使用 Spring 提供的 RestTemplate 来访问,不过由于 RestTemplate 是 Spring ...

  8. Flutter 网络请求 Dio 拦截器详解

    老王的烦恼 昔日的小王凭借这他的小心谨慎和借助漂亮能干的女友 Dio 的辅助,终于干下了一番事业,成为中华大地响当当的人物,小王也变成老王.如今,老王已经年近花甲,看似迈上了人生巅峰,却也遇到了人生的 ...

  9. Python中的select、epoll详解

    Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...

最新文章

  1. 在NOILINUX下的简易VIM配置
  2. flash _currentframe+指定帧步 控制线程
  3. Android获取相册中图片的路径 4.4版本前后的变化
  4. 我的HTTP/3学习笔记
  5. 深度学习 500 问!一份火爆 GitHub 的面试手册
  6. Maven 进行多环境配置,使用profile文件进行配置
  7. 叙述计算机网络拓扑结构的定义,计算机网络拓扑结构的定义
  8. 微软发布IoT应用现状报告:88%国内企业已使用IoT;技术人才仍为最大需求;三分之一企业死于构想阶段...
  9. java中地图查询比较慢,在java中缓慢的地图
  10. Leetcode 101.对称二叉树
  11. HashTable 源码解析 jdk1.8
  12. vue-quasar-admin 一个包含通用权限控制的后台管理系统
  13. Flash builder 4.6 下载 破解 序列号【你懂的】
  14. 神经网络的优缺点是什么,深度神经网络的优缺点
  15. windbg内核诊断方式--转载
  16. 数据库表中的数据显示在网页上
  17. 【R语言数据科学】(十三):有趣的概率学(下)
  18. 计算机休眠快还是关机快,电脑关机、休眠、睡眠、快速启动模式的区别介绍
  19. 【调剂】上海电力大学控制工程 、通信工程、人工智能等专业调剂信息
  20. 【C语言】贪吃蛇游戏的实现(一)

热门文章

  1. Redis配置主从数据,实现主从库之间数据同步
  2. web.xml 中的listener、 filter、servlet 加载顺序及其详解(转)
  3. Asp.net设计模式笔记之一:理解设计模式
  4. 《WinForm开发系列之控件篇》Item22 HelpProvider(暂无)
  5. BZOJ1449[JSOI2009]球队收益BZOJ2895球队预算——最小费用最大流
  6. onsubmit校验表单时利用ajax的return false无效解决方法
  7. 框架之---Django
  8. 200多位阿里工程师齐聚“光明顶”,双11模拟演习怎么搞?
  9. lucene修改索引——(六)
  10. QT STUDY 模型-视图-控制器