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好用。了解为主。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。