python爬虫之urllib3的使用示例
Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库。许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库urllib里所没有的重要特性:
- 线程安全
- 连接池
- 客户端SSL/TLS验证
- 文件分部编码上传
- 协助处理重复请求和HTTP重定位
- 支持压缩编码
- 支持HTTP和SOCKS代理
一、get请求
urllib3主要使用连接池进行网络请求的访问,所以访问之前我们需要创建一个连接池对象,如下所示:
importurllib3 url="http://httpbin.org" http=urllib3.PoolManager(); r=http.request('GET',url+"/get") print(r.data.decode()) print(r.status) 带参数的get r=http.request('get','http://www.baidu.com/s',fields={'wd':'周杰伦'}) print(r.data.decode())
经查看源码:
defrequest(self,method,url,fields=None,headers=None,**urlopen_kw):
- 第一个参数method必选,指定是什么请求,'get'、'GET'、'POST'、'post'、'PUT'、'DELETE'等,不区分大小写。
- 第二个参数url,必选
- 第三个参数fields,请求的参数,可选
- 第四个参数headers可选
request请求的返回值是
我们可以通过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请求
importurllib3 url="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
importurllib3 headers={ 'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3112.113Safari/537.36' } http=urllib3.PoolManager(); r=http.request('get',url+"/get",headers=headers) print(r.data.decode())
四、设置代理
importurllib3 url="http://httpbin.org" headers={ 'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3112.113Safari/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数据
importurllib3 url="http://httpbin.org" importjson data={'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'))
六、上传文件
#元组形式 withopen('a.html','rb')asf: 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)
八、重试和重定向
importurllib3 http=urllib3.PoolManager() #重试 r=http.request('post','http://httpbin.org/post',retries=5)#请求重试测次数为5次,默认为3ci print(r.retries)#Retry(total=5,connect=None,read=None,redirect=0,status=None) #关闭重试 http.request('post','http://httpbin.org/post',retries=False)#请求重试测次数为5次,默认为3ci r=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:UnverifiedHTTPSrequestisbeingmade.Addingcertificateverificationisstronglyadvised.See:https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
禁用警告:
importurllib3 urllib3.disable_warnings()#禁用各种警告 url="https://www.12306.cn/mormhweb/" http=urllib3.PoolManager() r=http.request('get',url) print(r.data.decode())
urllib3很强大,但是并没有requests好用。了解为主。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。