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

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

作者: Wangthirteen | 来源:发表于2018-11-28 23:17 被阅读11次

    昨天我们说了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)熟悉

          本文链接:https://www.haomeiwen.com/subject/mudtcqtx.html