重拾python爬虫之urllib3

作者 : 开心源码 本文共3655个字,预计阅读时间需要10分钟 发布时间: 2022-05-11 共102人阅读

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

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

一、get请求

urllib3主要用连接池进行网络请求的访问,所以访问之前我们需要创立一个连接池对象,如下所示:

import  urllib3url = "http://httpbin.org"http = urllib3.PoolManager();r = http.request('GET',url+"/get")print(r.data.decode())print(r.status)带参数的getr = http.request('get','http://www.baidu.com/s',fields={'wd':'周杰伦'})print(r.data.decode())

经查看源码:

def request(self, method, url, fields=None, headers=None, **urlopen_kw):
  • 第一个参数method 必选,指定是什么请求,'get''GET''POST''post''PUT''DELETE'等,不区分大小写。
  • 第二个参数url,必选
  • 第三个参数fields,请求的参数,可选
  • 第四个参数headers 可选

request请求的返回值是<urllib3.response.HTTPResponse object at 0x000001B3879440B8>

我们能通过dir()查看其所有的属性和方法。dir(r)直截取了一部分#'data', 'decode_content', 'enforce_content_length', 'fileno', 'flush', 'from_httplib',# 'get_redirect_location', 'getheader', 'getheaders', 'headers', 'info', 'isatty',# 'length_remaining', 'read', 'read_chunked', 'readable', 'readinto', 'readline',# 'readlines', 'reason', 'release_conn', 'retries', 'seek', 'seekable', 'status',# 'stream', 'strict', 'supports_chunked_reads', 'tell', 'truncate', 'version', 'writable',# 'writelines']

二、post请求

import  urllib3url = "http://httpbin.org"fields = {    'name':'xfy'}http = urllib3.PoolManager()r = http.request('post',url+"/post",fields=fields)print(r.data.decode())

能看到很简单,只是第一个参数get换成了post
并且参数不需要再像urllib一样转换成byte型了。

三、设置headers

import  urllib3headers = {     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}http = urllib3.PoolManager();r = http.request('get',url+"/get",headers = headers)print(r.data.decode())

四、设置代理商

import  urllib3url = "http://httpbin.org"headers = {     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}proxy = urllib3.ProxyManager('http://101.236.19.165:8866',headers = headers)r = proxy.request('get',url+"/ip")print(r.data.decode())

五、当请求的参数为json

在发起请求时,能通过定义body 参数并定义headers的Content-Type参数来发送一个已经过编译的JSON数据

import  urllib3url = "http://httpbin.org"import jsondata = {'name':'徐繁韵'}json_data = json.dumps(data)http = urllib3.PoolManager()r = http.request('post',url+"/post",body = json_data,headers = {'Content-Type':'application/json'})print(r.data.decode('unicode_escape'))

六、上传文件

#元组形式with open('a.html','rb') as f:    data = f.read()http = urllib3.PoolManager()r = http.request('post','http://httpbin.org/post',fields = {'filefield':('a.html',data,'text/plain')})print(r.data.decode())#二进制形式r = http.request('post','http://httpbin.org/post',body = data,headers={'Content-Type':'image/jpeg'})print(r.data.decode())

七、超时设置

# 1全局设置超时# http = urllib3.PoolManager(timeout = 3)# 2在request里设置# http.request('post','http://httpbin.org/post',timeout = 3)

八、重试和重定向

import urllib3http = urllib3.PoolManager()#重试r = http.request('post','http://httpbin.org/post',retries = 5) #请求重试测次数为5次  ,默认为3ciprint(r.retries) #Retry(total=5, connect=None, read=None, redirect=0, status=None)#关闭重试http.request('post','http://httpbin.org/post',retries = False) #请求重试测次数为5次  ,默认为3cir = http.request('get','http://httpbin.org/redirect/1',redirect = False)print(r.retries)# Retry(total=3, connect=None, read=None, redirect=None, status=None)print(r.status)print(r.data.decode())print("--------------------")print(r.get_redirect_location())#302不是异常

九、urllib3 本身设置了https的解决,但是有警告

尽管能请求,但是报如下警告:

InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings  InsecureRequestWarning)

禁使用警告:

import urllib3urllib3.disable_warnings()  #禁使用各种警告url = "https://www.12306.cn/mormhweb/"http = urllib3.PoolManager()r = http.request('get',url)print(r.data.decode())

urllib3很强大,但是并没有requests好使用。理解为主。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 重拾python爬虫之urllib3

发表回复