一.来自官方网站的解释:
urllib3
是一个功能强大,对SAP
健全的 HTTP
客户端。许多Python生态系统已经使用了urllib3,你也应该这样做。
二. 安装urllib3库
pip install urllib3
不懂的请百度(开个玩笑,都是基础怎么可能不会~~~)
通过urllib3访问一个网页,那么必须首先构造一个PoolManager
对象,然后通过PoolMagent中的request方法或者 urlopen()方法来访问一个网页,两者几乎没有任何区别。
class urllib3.poolmanager.PoolManager(num_pools = 10,headers = None,** connection_pool_kw )
生成一个PoolManager所需要的参数:
参数 | 描述 |
---|---|
num_pools |
代表了缓存的池的个数,如果访问的个数大于num_pools,将按顺序丢弃最初始的缓存,将缓存的个数维持在池的大小。 |
headers |
代表了请求头的信息,如果在初始化PoolManager的时候制定了headers,那么之后每次使用PoolManager来进行访问的时候,都将使用该headers来进行访问。 |
** connection_pool_kw |
是基于connection_pool 来生成的其它设置 |
解释来自:[https://blog.csdn.net/qq_42415326/article/details/90794150](https://blog.csdn.net/qq_42415326/article/details/90794150)
当访问网页完成之后,将会返回一个HTTPResponse对象,可以通过如下的方法来读取获取GET请求的响应内容:
import urllib3
http = urllib3.PoolManager()
resp1 = http.request('GET', 'http://httpbin.org')
print(resp1.status)
print(resp1.data.decode())
三.详解
构造请求(request)
1导入包
import urllib3
2.实例化一个PoolManager对象构造请求。
http = urllib3.PoolManager()
3.用request方法发送一个请求
resp1 = http.request('GET', 'http://httpbin.org')
3.1.用request方法发送任意一个http请求
resp1 = http.request(
'POST',
'http://httpbin.org/post',
fields={'hello':'weixin'}
)
四.小案例
这个是自己写的....很渣渣的感觉
import urllib3
import re
import os
for i in range(1,4):
#创建空字典,列表准备把名字,图片url装进字典
dict_img={}
list_name=[]
list_img=[]
# 网址
url = "http://www.weimeitupian.com/page/{}".format(i)
http = urllib3.PoolManager()
r = http.request('GET', url)
name= re.findall(b'target=.*?title="(.*?)"',r.data,re.S)
# 将标题丢进列表
for i in name:
i=i.decode()
list_name.append(i)
img_url = re.findall(b'<div class="postlist">.*?<img src="(.*?)".*?alt=.*?</div>',r.data,re.S)
# 将图片url丢进列表
for i in img_url:
i=i.decode()
list_img.append(i)
#合成字典
dict_img=dict(zip(list_name,list_img))
# print(dict_img)
#图片url的请求前面部分
head = 'http://www.weimeitupian.com'
for key in dict_img:
# print(dict_img[key])
# 判断是否需要加图片url的请求前面部分
if head in dict_img[key]:
url = dict_img[key]
else:
url='http://www.weimeitupian.com'.format(dict_img[key])
#判断图片格式
if dict_img[key][-4:] == '.jpg' or dict_img[key][-4:] =='jpeg':
geshi ='jpg'
elif dict_img[key][-4:] =='.gif':
geshi ='gif'
elif dict_img[key][-4:] =='.png':
geshi = 'png'
##构造请求数据
image = http.request('GET', url)
data = image.data
##尝试写入
try:
os.mkdir('{}'.format(key))
except FileExistsError as e:
print(e,':文件夹已存在')
with open('{0}\\{0}.{1}'.format(key,geshi),'wb+')as f:
f.write(data)
print('done!')
再看一下大佬写的......
import os
import re
import time
import urllib3
from threading import Thread
def image_request(url,item,image_path):
# 对图片进行请求
print('正在请求{}'.format(url))
image_content = req.request('GET', url) # 网络io请求
# 文件写入图片
print('开始写入图片')
# with open('{}/{}'.format(image_path, item[0].split('/')[-1]), 'wb') as f:
# f.write(image_content.data)
def save_images(items):
t_list = []
for item in items:
if not item[0]:
continue
# 构造图片存储路径
image_path = './images/{}'.format(item[1])
# 判断文件夹是否存在,不存在就创建
if not os.path.exists(image_path):
os.mkdir(image_path)
# 判断图片url地址是否包含域名
image_url = item[0]
if not 'http' in item[0]:
image_url = '{}{}'.format('http://www.weimeitupian.com',item[0])
# 创建线程实例
t = Thread(target=image_request,args=(image_url,item,image_path))
# 启动线程
# t.start()
# t.join()
#
t_list.append(t)
for t in t_list:
t.start()
for t in t_list:
t.join()
if __name__ == '__main__':
req = urllib3.PoolManager()
start_time = time.time()
for page in range(1,2):
print('正在下载第{}页的图片数据...'.format(page))
data = req.request('GET','http://www.weimeitupian.com/page/{}'.format(page))
# 通过正则表达式 匹配标题和图片地址
items = re.findall(r'</a></div>-->.*?<img src="(.*?)" alt="(.*?)" class="thumb" />',data.data.decode(),re.S)
save_images(items)
print('耗时:{}秒'.format(time.time()-start_time))
真的是没有对比就没有伤害......看来自己的路还长着呢......加油~~~~