u=4012717948,1091859348&fm=173&app=49&f=JPEG.jpg
一.來自官方網(wǎng)站的解釋:
urllib3
是一個功能強大磕昼,對SAP
健全的 HTTP
客戶端爽蝴。許多Python生態(tài)系統(tǒng)已經(jīng)使用了urllib3蝎亚,你也應(yīng)該這樣做。
二. 安裝urllib3庫
pip install urllib3
不懂的請百度(開個玩笑梅惯,都是基礎(chǔ)怎么可能不會~~~)
通過urllib3訪問一個網(wǎng)頁,那么必須首先構(gòu)造一個PoolManager
對象,然后通過PoolMagent中的request方法或者 urlopen()方法來訪問一個網(wǎng)頁劣针,兩者幾乎沒有任何區(qū)別从祝。
class urllib3.poolmanager.PoolManager(num_pools = 10擎浴,headers = None骏融,** connection_pool_kw )
生成一個PoolManager所需要的參數(shù):
參數(shù) | 描述 |
---|---|
num_pools |
代表了緩存的池的個數(shù),如果訪問的個數(shù)大于num_pools误趴,將按順序丟棄最初始的緩存,將緩存的個數(shù)維持在池的大小。 |
headers |
代表了請求頭的信息,如果在初始化PoolManager的時候制定了headers贮缅,那么之后每次使用PoolManager來進(jìn)行訪問的時候,都將使用該headers來進(jìn)行訪問。 |
** connection_pool_kw |
是基于connection_pool 來生成的其它設(shè)置 |
解釋來自:[https://blog.csdn.net/qq_42415326/article/details/90794150](https://blog.csdn.net/qq_42415326/article/details/90794150)
當(dāng)訪問網(wǎng)頁完成之后昌跌,將會返回一個HTTPResponse對象答恶,可以通過如下的方法來讀取獲取GET請求的響應(yīng)內(nèi)容:
import urllib3
http = urllib3.PoolManager()
resp1 = http.request('GET', 'http://httpbin.org')
print(resp1.status)
print(resp1.data.decode())
三.詳解
構(gòu)造請求(request)
1導(dǎo)入包
import urllib3
2.實例化一個PoolManager對象構(gòu)造請求污呼。
http = urllib3.PoolManager()
3.用request方法發(fā)送一個請求
resp1 = http.request('GET', 'http://httpbin.org')
3.1.用request方法發(fā)送任意一個http請求
resp1 = http.request(
'POST',
'http://httpbin.org/post',
fields={'hello':'weixin'}
)
四.小案例
這個是自己寫的....很渣渣的感覺
import urllib3
import re
import os
for i in range(1,4):
#創(chuàng)建空字典苗缩,列表準(zhǔn)備把名字,圖片url裝進(jìn)字典
dict_img={}
list_name=[]
list_img=[]
# 網(wǎng)址
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)
# 將標(biāo)題丟進(jìn)列表
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丟進(jìn)列表
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'
##構(gòu)造請求數(shù)據(jù)
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):
# 對圖片進(jìn)行請求
print('正在請求{}'.format(url))
image_content = req.request('GET', url) # 網(wǎng)絡(luò)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
# 構(gòu)造圖片存儲路徑
image_path = './images/{}'.format(item[1])
# 判斷文件夾是否存在膏萧,不存在就創(chuàng)建
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])
# 創(chuàng)建線程實例
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('正在下載第{}頁的圖片數(shù)據(jù)...'.format(page))
data = req.request('GET','http://www.weimeitupian.com/page/{}'.format(page))
# 通過正則表達(dá)式 匹配標(biāo)題和圖片地址
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))
真的是沒有對比就沒有傷害......看來自己的路還長著呢......加油~~~~