python爬虫学习手册-服务器渲染(基础库urllib3)熟悉

昨天我们说了urllib库是原生的底层库,我觉得原生的东西是好,但是都会有一个统一的缺点,就是用起来繁琐,使用者不如一些其他的库方便,功能也不如其他的库强大,我们今天就来说一说一个功能强大的Python HTTP库-------urllib3库

urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3。

它也提供了一些python标准库里面没有的一些新特性:

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

一、安装

urllib3有两种安装方式,都是非常简单好用

1.使用pip方式安装

pip install urllib3

2.使用源码进行安装

需要先下载源码 urllib3源码,在使用如下命令

python setup.py install

如果还是不明白请参照---》python源码安装详细步骤

二、使用

1.导入urllib3包

import urllib3

2.创建PoolManager

使用urllib3需要创建一个叫PoolManager实例的东西,不需要知道这是什么,你只要记住有这么个东西,你以后的各种操作PoolManager是基础,使用如下命令创建

http = urllib3.PoolManager()

3.生成第一个GET请求

有了HTTP之后我们就可以来生成第一个请求,使用如下命令

r = http.request('GET', 'https://www.baidu.com/') #请求方式为GET,如果使用POST换成POST即可
print(r.status)#如果请求成功,返回200
print(r.data.decode())#获得html编码

4.请求里的其他参数

  • 设置headers
header = {
   'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
             }
r = http.request('GET',
             'https://www.baidu.com/',
             headers=header) #请求里设置headers头
  • Timeout
r = http.request('GET',
                 'https://www.baidu.com/',timeout=3.0)

也可以设置全局的timeout

http = urllib3.PoolManager(timeout=3.0)

这样所有的request都使用一个timeout

5.POST请求

我们可以使用POST方法向链接和服务器提交一些东西

  • 向链接里添加一些东西
 r = http.request('POST',
                     'https://www.baidu.com/',
                     fields={'hello':'world'})

这样链接里就包含了我们提交的信息

  • 发送JSON数据
    在发起请求时,可以通过定义body 参数并定义headers的Content-Type参数来发送一个已经过编译的JSON数据
import json
data={'attribute':'value'}
encode_data= json.dumps(data).encode()
r = http.request('POST',
                     'https://www.baidu.com/',
                     body=encode_data)
  • 上传文件,上传文件分两种一种是本地文本文件,另一种是本地二进制文件
    上传本地文本文件
with open('test.txt','r+',encoding='UTF-8') as f:
    file_read = f.read()
r = http.request('POST',
                 'https://www.baidu.com/',
                 fields={'filefield':('test.txt', file_read, 'text/plain')
                         })

上传二进制文件

with open('test.jpg','rb') as f2:
    binary_read = f2.read()
r = http.request('POST',
                 'https://www.baidu.com/',
                 body=binary_read
                })

6.编码方式

对于POST和PUT请求,需要手动对传入数据进行编码,然后加在URL之后

encode_arg = urllib.parse.urlencode({'arg': 'value'})
print(encode_arg.encode())
r = http.request('POST',
                 'https://www.baidu.com/'+encode_arg,
                 headers=header)

7.重定向,请求重试相关

  • 可以通过设置retries参数来控制重定向次数,默认是3次
r = http.request('GET',
                 'https://www.baidu.com/',retries=6)

设置重定向次数为6次

  • 关闭重定向,但是保留请求重试
r = http.request('GET',
                 'https://www.baidu.com/',redirect=False)

只需要将redirect设置为False即可

  • 关闭重定向及请求重试
r = http.request('GET',
                 'https://www.baidu.com/',retries=False,redirect=False)

如上所示,全部设置为False即可
ps(上面添加的东西,如timeout、headers、重定向及重试次数,想全局生效只需要在PoolManager里面设置即可,设置方式和正常设置一样)
那么会有的朋友问了,如果在全局和局部都设置了怎么办?局部设置>全局设置

三、后记

学习了这个库,是不感觉比作态你对urllib强大了很多,但是这还不是最好用,最方便的,后面我们会将到
惯例 urllib3官方文档

你可能感兴趣的:(python爬虫学习手册-服务器渲染(基础库urllib3)熟悉)