標籤:from too apt-get 證明 work 轉化 future 運行
??儘管俄羅斯世界盃的熱度已經褪去,但這屆世界盃還是給全世界人民留下了無數難忘的回憶,不知你的回憶裡有沒有日本隊的身影?本次世界盃中,日本隊的表現讓人眼前一亮,很難想象,就是這樣一隻隊伍,二十幾年還是我們國家足球隊的水平一樣,也許還不如我們國足呢。
??足球小將(隊長小翼、キャプテン翼)由日本著名動漫家高橋陽一於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, 如下:
我們注意到,在這個網址中,只有卷數和動漫圖片的序號在發生改變,因此,我們只需要找到總共的卷數以及每一卷中所包含的圖片即可完成此爬蟲。
??不過稍微需要注意的是,爬蟲下載下來的圖片格式為webp格式。WebP(發音 weppy,項目首頁),是一種支援有損壓縮和無損壓縮的圖片檔案格式,派生自映像編碼格式 VP8。根據 Google 的測試,無損壓縮後的 WebP 比 PNG 檔案少了 45% 的檔案大小,即使這些 PNG 檔案經過其他壓縮公用程式壓縮之後,WebP 還是可以減少 28% 的檔案大小。
??我們希望能夠將webp格式的圖片轉化為png格式。因此,我們需要在Linux系統中安裝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.requestimport osimport timefrom concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETEDglobal COUNT # 下載失敗的圖片張數COUNT = 0# 參數:# dir: 圖片儲存的目錄# juanshu_num: 卷數# page: 頁數# 此函數的作用: 下載特定卷的特定頁的圖片到指定的儲存目錄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)# 參數:juanshu_num: 卷數# page_num: 該卷的圖片張數# 此函數的作用: 下載某一卷中的所有圖片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 += 1def main(): start_time = time.time() # 每一卷的圖片張數, 一共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] # 設定線程個數為10個 executor = ThreadPoolExecutor(max_workers=10) # 可以自己調整max_workers # submit()的參數: 第一個為函數, 之後為該函數的傳入參數,允許有多個 # 並發下載圖片 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(‘下載失敗的圖片張數為:%d‘%COUNT)main()
運行以上程式,靜靜地等待程式運行完畢,輸出的結果如下:
??我們再去Linux中查看已經下好的圖片:
一共下載了3577張圖片(沒有一張下載失敗),用了約1521秒,效率杠杠的,哈哈~~
??本文到此就要結束了,最後再加一句:中國足球,加油啊!
注意:本人現已開通兩個公眾號: 因為Python(號為:python_math)以及輕鬆學會Python爬蟲(號為:easy_web_scrape), 歡迎大家關注哦~~
Python爬蟲之足球小將動漫(圖片)下載