urllib3是一个功能强大,对SAP健全的 HTTP客户端,许多Python生态系统已经使用了urllib3。

一、安装

sudo pips install urllib3

二、创建PoolManager对象

  通过urllib3访问网页,首先需要构造一个PoolManager实例对象用于处理与线程池的连接以及线程安全的所有细节,然后通过request()方法来发送请求

  • import urllib3
    
    #创建PoolManager对象,用于处理与线程池的连接以及线程安全的所有细节
    http = urllib3.PoolManager() #对需要爬取的网页发送请求
    resp = http.request(method,url,...)

    method和url两个参数必选,并且method需要大写

三、基本GET请求(headers参数和fields参数)

  • 最基本的GET请求

    import urllib3
    
    #创建PoolManager对象,用于处理与线程池的连接以及线程安全的所有细节
    http = urllib3.PoolManager() #对需要爬取的网页发送请求
    resp = http.request('GET','https://www.baidu.com/') print(resp.data.decode())#响应数据
    print(resp.headers)#响应头信息
    print(resp.status)#状态码
    resp.release_conn()#释放这个http连接
  • 添加headers和查询参数

   可以传入headers参数(dict类型)来增加请求头中的headers信息。可以利用fields参数传递查询参数(dict类型),并且url后面的'?‘一定不能带上

  • import urllib3
    
    http = urllib3.PoolManager()
    
    kw = {"wd":"长城"}
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
    resp = proxy.request('GET','https://www.baidu.com/s',fields=kw,headers = headers)
    print(resp.data.decode())

四、基本POST请求(fields参数)

  • 最基本的POST请求需要传入fields参数(dict类型),urllib3会自动将其转换成表单数据类型

    import urllib3
    
    http = urllib3.PoolManager()
    
    #需要提交的数据
    data = {'word':'hello'}
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
    response = http.request('POST','http://httpbin.org/post',fields = data,headers = headers)
    print(response.data.decode())
  • url中携带查询参数

    • 需要先通过urlencode()编码,然后附加在url后面,这和GET方式有所不同(示例略)
  • 传递json数据(body参数)

    • 利用body参数进行传递,但是数据需要先序列化成json字符串,然后headers中需要设置'Content-Type':'application/json'
  • import urllib3
    import json http = urllib3.PoolManager()
    url = 'https://openapi.vmall.com/mcp/offlineshop/getShopList'
    data = {
    "portal":2,"lang":"zh-CN","country":"CN","brand":1,"province":"山西","city":"太原","pageNo":1,"pageSize":20
    } # 将字典类型数据序列化成json字符串
    json_data = json.dumps(data) #headers中设置Conten-Type为application/json
    headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
    'Content-Type':'application/json'
    }
    resp = http.request('POST',url,body = json_data,headers = headers)
    print(resp.data.decode())

    注意:body参数和fields参数不能同时使用

五、文件上传

  • 普通文件上传

    • 使用multipart/form-data编码方式上传文件,可以使用和传入Form data数据一样的方法进行,并将文件定义为一个二元元组(文件名,数据)或三元元组(文件名,数据,MIME类型),文件名的定义虽然不是严格要求的,但是推荐使用,以使得表现得更像浏览器

      import urllib3
      
      http = urllib3.PoolManager()
      
      #打开文件test.txt
      with open('test.txt','r') as f:
      file_data = f.read() headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} #三元元组的方式传入
      resp = http.request('POST','http://httpbin.org/post',fields={'filefield':('test.txt',file_data,'text/plain')},headers=headers)
      #二元元组的方式传入
      #resp = http.request('POST','http://httpbin.org/post',fields={'filefield':('test.txt',file_data)},headers=headers)
      print(resp.data.decode('unicode_escape'))
  • 二进制文件上传

    • 原始二进制数据,只要将其定义为body参数即可。同时,建议对header的Content-Type参数进行设置

      import urllib3
      
      http = urllib3.PoolManager()
      
      with open('test.jpg','rb') as f:
      binary_data = f.read()
      headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",'Content-Type':'image/jpeg'}
      resp = http.request('POST','http://httpbin.org/post',body = binary_data,headers = headers)
      print(resp.data.decode())

六、超时设置

  • 使用timeout,可以控制请求的总超时时间(连接超时和读取超时时间总和),timeout参数为一个浮点数:

    resp = http.request('GET','http://httpbin.org/delay/3',timeout = 4.0)
  • 也可以分别设置总超时、连接超时和读取超时时间,这时候需要使用Timeout()实例,里面有3个关键字参数total,connect和read:

    #设置总超时时间为3.0秒,连接超时不超过1.5秒,读取超时不超过2.0秒
    resp = http.request('GET','http://httpbin.org/delay/3',timeout = urllib3.Timeout(total=3.0,connect=1.5,read=2.0))
  • 如果想让所有的request都遵循一个timeout,可以将timeout参数定义在PoolManager中,当在具体的request中再次定义timeout时,会覆盖PoolManager层面上的timeout。

    http = urllib3.PoolManager(timeout = urllib3.Timeout(total=3.0,connect=1.5,read=2.0))
    
    #http = urllib3.PoolManager(timeout = 4.0)

七、重试(retries参数)以及重定向(redirect参数)设置

  • urllib3默认进行3次请求重试,3次重定向

  • 通过retries来自定义请求重试次数

    #设置请求重试次数10次
    resp = http.request('GET','http://httpbin.org/ip',retries = 10)
  • 将参数retries设为False,请求重试和重定向会同时关闭

    #同时关闭请求重试和重定向
    resp = http.request('GET','http://httpbin.org/redirect/1',retries = False)
  • 将参数redirect设为False,仅关闭重定向,保持请求重试

    #仅关闭重定向
    resp = http.request('GET','http://httpbin.org/redirect/1',redirect = False)
  • 通过Retry()实例可以精细控制重试和重定向次数,该实例默认总重试次数为10次,比如我们设置3次重试,2次重定向

    resp = http.request('GET','http://httpbin.org/redirect/3',retries = urllib3.Retry(3,redirect = 2))
  • 如果想让所有的request都遵循一个请求重试和重定向策略,可以在PoolManager中定义retries参数,当在具体的request中再次定义retries时,会覆盖 PoolManager层面上的retries。

    http = urllib3.PoolManager(retries = urllib3.Retry(3,redirect=2))
    #http = urllib3.PoolManager(retries = False)

八、ProxyManager(代理IP)

  • 如果你需要使用代理来访问某个网站的话, 那么你可以使用 ProxyManager 对象来进行设置
  • ProxyManager和PoolManager的方法基本完全相同,这里举个简单的小例子
    import urllib3
    
    #创建ProxyManager对象
    proxy_http = urllib3.ProxyManager('https://175.42.122.96:9999') headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} #利用代理对需要爬取的网页发送请求
    resp = proxy_http.request('GET','https://www.baidu.com/',headers=headers) print(resp.data.decode())#响应数据
    print(resp.headers)#响应头信息
    print(resp.status)#状态码
    resp.release_conn()#释放这个http连接

九、SSL证书验证

  • urllib3默认不验证HTTPS请求,如果想开启验证,最可靠的方法是使用提供Mozilla根证书包的certifi包

    sudo pip3 install certifi
  • 获得证书后,可以在PoolManager中定义cert_reqs参数和ca_certs参数,来自动处理证书验证

    import urllib3
    import certici #开启ssl证书自动验证
    http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED',ca_certs=certifi.where()) headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
    resp = http.request('GET','https://www.baidu.com/',headers=headers) print(resp.data.decode())
  • 如果需要,可以使用OS提供的证书。只需指定证书包的完整路径作为ca_certs参数而不是 certifi.where()。例如,大多数Linux系统都存储证书/etc/ssl/certs/ca-certificates.crt。

    import urllib3
    import certifi http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED',ca_certs='/etc/ssl/certs/ca-certificates.crt')

爬虫-urllib3模块的使用的更多相关文章

  1. 洗礼灵魂,修炼python(58)--爬虫篇—【转载】urllib3模块

    urllib3 1.简介 urllib3相比urllib,urlib2,又有些一些新的功能,可以实现很多东西,而这个模块有点特殊的是,并且还可以同时存在于python2和python3,但说实话,用的 ...

  2. python爬虫 urllib模块url编码处理

    案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...

  3. python 爬虫 urllib模块 目录

    python 爬虫 urllib模块介绍 python 爬虫 urllib模块 url编码处理 python 爬虫 urllib模块 反爬虫机制UA python 爬虫 urllib模块 发起post ...

  4. 爬虫 requests模块的其他用法 抽屉网线程池回调爬取+保存实例,gihub登陆实例

    requests模块的其他用法 #通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常见的有用的请求头如下 Host Referer #大型网站通常都会根据该参数判断请求的来源 ...

  5. 爬虫requests模块 1

    让我们从一些简单的示例开始吧. 发送请求¶ 使用 Requests 发送网络请求非常简单. 一开始要导入 Requests 模块: >>> import requests 然后,尝试 ...

  6. python爬虫-urllib模块

    urllib 模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web 协议,例如:HTTP.FTP.Gophe ...

  7. 爬虫 requests 模块

    requests 模块 介绍 使用requests可以模拟浏览器的请求, 比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) ps: requests库发 ...

  8. 爬虫-----selenium模块自动爬取网页资源

    selenium介绍与使用 1 selenium介绍 什么是selenium?selenium是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作.     sel ...

  9. 爬虫----requests模块

    一.介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网页内 ...

随机推荐

  1. sqli-labs less-24(二次注入)

    less-24 原理: 在网站处理用户提交的数据的时候,只是将某些敏感字符进行了转义.因而使得用户第一次提交的时候不会被当做代码执行.但是这些数据存入数据库的时候却没有转义,而网站程序默认数据库中的数 ...

  2. 移动端 better-scroll基础

    一.什么是better-scroll better-scroll 是一款重点解决移动端(已支持 PC)各种滚动场景需求的插件 #滚动原理 1. 与浏览器滚动原理一致,父容器高度固定,子元素内容撑开,必 ...

  3. 图像处理论文详解 | Deformable Convolutional Networks | CVPR | 2017

    文章转自同一作者的微信公众号:[机器学习炼丹术] 论文名称:"Deformable Convolutional Networks" 论文链接:https://arxiv.org/a ...

  4. JYadmin-react-antd react+antd封装的优秀后台模板集成方案("^1.0.0")

    版本:[ "JYadmin-react-antd": "^1.0.0"] 版权所有:微信公众号[微新悦] 原文链接:https://www.weixinyue. ...

  5. Python高级语法-私有属性-名字重整(4.7.1)

    @ 目录 1.说明 2.代码 关于作者 1.说明 使用__dict__魔法方法 可以看到所有的属性,包括公有的,私有的,保护的等等 不能调用的原因就是,解释器把名字属性给重组了 其实是可以访问到的 2 ...

  6. C# 中 ConcurrentDictionary 一定线程安全吗?

    根据 .NET 官方文档的定义:ConcurrentDictionary<TKey,TValue> Class 表示可由多个线程同时访问的线程安全的键/值对集合.这也是我们在并发任务中比较 ...

  7. 使用js方法将table表格中指定列指定行中相同内容的单元格进行合并操作。

    前言 使用js方法对html中的table表格进行单元格的行列合并操作. 网上执行此操作的实例方法有很多,但根据实际业务的区别,大多不适用. 所以在网上各位大神写的方法的基础上进行了部分修改以适合自己 ...

  8. Centos7.3 离线环境下修改时间

    运行以下命令 1.tzselect --命令确定时区 2.timedatectl set-timezone Asia/Shanghai  --设置系统时区为上海 3.timedatectl set-n ...

  9. 4.mysql profile的使用方法

    profile的使用 1.作用 使用profile可以对某一条sql性能进行分析 2.语法 mysql> show variables like '%profil%'; +----------- ...

  10. 将.Net Core发布至Docker,并连接 Redis、上传文件到本机、连接sqlserver数据库

    此片文章目标是将 .Net Core 发布到 Docker 上,并且连接到在 Docker上的 Redis .上传文件到本机文件夹和连接 sqlserver 数据库. 创建项目 创建项目就不用说了,我 ...