??盡管俄羅斯世界杯的熱度已經褪去,但這屆世界杯還是給全世界人民留下了無數(shù)難忘的回憶猾浦,不知你的回憶里有沒有日本隊的身影录淡?本次世界杯中何缓,日本隊的表現(xiàn)讓人眼前一亮,很難想象洛退,就是這樣一只隊伍对嚼,二十幾年還是我們國家足球隊的水平一樣夹抗,也許還不如我們國足呢。
??足球小將(隊長小翼纵竖、キャプテン翼)由日本著名動漫家高橋陽一于1981年開始連載漠烧,從此這部動漫就伴隨著一代又一代的日本靡砌,甚至全世界的少年兒童成長,也在無形有形中促進了日本足球的進步度液。本屆世界杯中堕担,在日本與比利時的比賽中霹购,日本球迷們高舉隊長小翼的畫面就足以證明這部動漫對日本足球的深遠影響齐疙。
??本文將介紹如何利用Python爬蟲來下載足球小將的動漫圖片贞奋。
??首先忆矛,我們需要下載的網址為:https://mhpic.samanlehua.com/comic/Z%2F%E8%B6%B3%E7%90%83%E5%B0%8F%E5%B0%86%E7%BF%BC%2F%E7%AC%AC01%E5%8D%B7%2F2.jpg-noresize.webp催训, 截圖如下:
我們注意到漫拭,在這個網址中采驻,只有卷數(shù)和動漫圖片的序號在發(fā)生改變礼旅,因此痘系,我們只需要找到總共的卷數(shù)以及每一卷中所包含的圖片即可完成此爬蟲汰翠。
??不過稍微需要注意的是复唤,爬蟲下載下來的圖片格式為webp格式佛纫。WebP(發(fā)音 weppy跟磨,項目主頁)抵拘,是一種支持有損壓縮和無損壓縮的圖片文件格式僵蛛,派生自圖像編碼格式 VP8充尉。根據(jù) Google 的測試衣形,無損壓縮后的 WebP 比 PNG 文件少了 45% 的文件大小驼侠,即使這些 PNG 文件經過其他壓縮工具壓縮之后姿鸿,WebP 還是可以減少 28% 的文件大小。
??我們希望能夠將webp格式的圖片轉化為png格式倒源。因此苛预,我們需要在Linux系統(tǒng)中安裝webp軟件,安裝的方式如下:
- Ubuntu: sudo apt-get install webp
- CentOS: yum -y install libwebp-devel libwebp-tools
安裝完后笋熬,通過以下命令就可以講webp格式的圖片轉化為png格式了:
dwebp picture.webp -o picture.png
??整個爬蟲的思路就講完了热某,我們利用多線程進行下載圖片以及圖片格式轉換的操作,完整的Python代碼如下(需要事先安裝webp胳螟, 以及保存目錄需要設置好):
# -*- coding: utf-8 -*-
import urllib.request
import os
import time
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED
global COUNT # 下載失敗的圖片張數(shù)
COUNT = 0
# 參數(shù):
# dir: 圖片保存的目錄
# juanshu_num: 卷數(shù)
# page: 頁數(shù)
# 此函數(shù)的作用: 下載特定卷的特定頁的圖片到指定的保存目錄
def get_webp(dir, juanshu_num, page):
# 拼接下載的圖片的網址
base_url = 'https://mhpic.samanlehua.com/comic/Z%2F'
name = urllib.parse.quote('足球小將翼')
juanshu = '0'+str(juanshu_num) if juanshu_num<10 else str(juanshu_num)
juanshu = urllib.parse.quote('第%s卷'%juanshu)
format = '.jpg-noresize.webp'
url = base_url+name+'%2F'+juanshu+'%2F'+str(page)+format
# print(url)
try:
urllib.request.urlretrieve(url, '%s/%d.webp'%(dir, page)) # 下載圖片
print('開始轉化圖片格式:')
os.system('dwebp %s/%d.webp -o %s/%d.png'%(dir, page, dir, page)) # 將圖片由webp格式轉化為png格式
print('轉化圖片格式完畢昔馋。')
os.system('rm -rf %s/%d.webp'%(dir, page)) # 刪除webp格式的圖片
except Exception as err:
print(err)
# 參數(shù):juanshu_num: 卷數(shù)
# page_num: 該卷的圖片張數(shù)
# 此函數(shù)的作用: 下載某一卷中的所有圖片
def download(juanshu_num, page_num):
# 如果目錄不存在,則新建這個目錄
if not os.path.exists('/home/tsubasa/卷%s'%juanshu_num):
os.mkdir('/home/tsubasa/卷%s'%juanshu_num)
dir = '/home/tsubasa/卷%s'%juanshu_num
# 下載每一卷中的所有圖片
for page in range(1, page_num+1):
try:
get_webp(dir, juanshu_num, page)
except urllib.error.HTTPError:
print('該圖片不存在或者網絡連接錯誤糖耸。')
COUNT += 1
def main():
start_time = time.time()
# 每一卷的圖片張數(shù), 一共21卷
page_num_list = [175, 175, 165, 171, 169, 172, 170, 170, 168, 174, 171,
168, 168, 168, 176, 169, 171, 167, 166, 172, 172]
# 設置線程個數(shù)為10個
executor = ThreadPoolExecutor(max_workers=10) # 可以自己調整max_workers
# submit()的參數(shù): 第一個為函數(shù)秘遏, 之后為該函數(shù)的傳入參數(shù),允許有多個
# 并發(fā)下載圖片
future_tasks = [executor.submit(download, juanshu_num+1, page_num)
for juanshu_num,page_num in enumerate(page_num_list)]
wait(future_tasks, return_when=ALL_COMPLETED) # 等待所有的任務結束
end_time = time.time()
print('圖片下載完畢!一共耗時%s秒嘉竟。'%(end_time-start_time))
print('下載失敗的圖片張數(shù)為:%d'%COUNT)
main()
運行以上程序垄提,靜靜地等待程序運行完畢,輸出的結果如下:
??我們再去Linux中查看已經下好的圖片:
一共下載了3577張圖片(沒有一張下載失斨芄铡),用了約1521秒凰兑,效率杠杠的妥粟,哈哈~~
??本文到此就要結束了,最后再加一句:中國足球吏够,加油肮锤!
注意:本人現(xiàn)已開通兩個微信公眾號: 因為Python(微信號為:python_math)以及輕松學會Python爬蟲(微信號為:easy_web_scrape)锅知, 歡迎大家關注哦~~