python 爬取 blessing skin 的簡單實現

TNT_God發表於2020-03-04

用requests來爬取mc著名皮膚網站blessing skin

blessing skin網站介紹:blessing skin網址為https://skin.prinzeugen.net/ 是深受mc玩家喜愛的皮膚網站。它有著比之前我們爬取過的little skin還多的皮膚。

-blessing skin

需要準備的東西

  • python直譯器
  • 爬蟲庫requests

爬取blessing skin的思路:
通過https://skin.prinzeugen.net/skinlib/show/ + 皮膚號碼的形式獲得到皮膚的網址。在網頁原始碼裡獲得皮膚的詳細介紹。然後通過https://skin.prinzeugen.net/raw/ + 皮膚號碼.png的形式獲得到下載的網址,請求並儲存到本地。

程式的使用:
讓使用者輸入皮膚號碼,程式返回出皮膚的詳細介紹,並且詢問使用者是否要下載此皮膚。若不存在此皮膚號碼,將重新讓使用者輸入皮膚號碼。

import requests
import re

首先,匯入re和requests。re模組主要是幫我們來尋找出皮膚的詳細介紹,而requests就是我們這個爬蟲專案的主要爬蟲框架。

如果要獲取圖片連結,我們就需要讓使用者輸入一個號碼。之後,我們就可以拼接連結了!

str_id = input("請輸入要檢視的皮膚號碼:")
url = 'https://skin.prinzeugen.net/skinlib/show/' + str_id + 'png'

別忘了加上png喲!
接著再請求拼接之後的連結。

image = requests.get(url).content

我們已經以圖片的方式請求了url,這個時候,我們就可以用with關鍵字儲存到本地了! 不過在這之前,我們還需要一個儲存的名字,我們就拿1.png來做名字。

with open(儲存的路徑+'1.png','wb') as file:
    file.write(image)

開啟儲存的目錄,成功了!
本人還在空閒時間擴充套件了一下程式碼,大家可以參考一下。

import requests
import re
import os
import time
print("小提示:ctrl + c來快捷退出程式")
def catch():
    try:
        print("指定皮膚號檢視下載模式請輸入1,輸入其它鍵預設為批量下載模式。")
        word = input(">>>")
        if word == '1':
            while True:
                str_id = input("請輸入要檢視的皮膚號碼:")
                while str_id.isdigit() == False:
                    str_id = input("請輸入要檢視的皮膚號碼:")
                url = 'https://skin.prinzeugen.net/skinlib/show/' + str_id
                text = requests.get(url).text
                check = re.findall('<p>(.*?)</p>',text)
                if check[0] == 'Details: The requested texture was already deleted.' or check[0] == 'Details: The requested texture is private and only visible to the uploader and admins.':
                    print("無法訪問此皮膚!請重新輸入一個皮膚號碼!")
                    continue
                skin_name = re.findall('<title>(.*?) - Blessing Skin</title>',text)[0]
                likes = re.findall('<span id="likes">(.*?)</span>',text)[0]
                model = re.findall('<span id="model">(.*?)</span>',text)[0]
                size = re.findall('<td>(.*?)</td>',text)[3]
                print('''\n--皮膚內容--
名稱:%s
適用模型:%s
檔案大小:%s
收藏:%s\n'''%(skin_name,model,size,likes))
                choose = input("是否要下載此皮膚?(y/n):").lower()
                while choose != 'y' and choose != 'n':
                    choose = input("是否要下載此皮膚?(y/n):").lower()
                if choose == 'y':
                    path = input("皮膚儲存路徑(請使用斜槓“/”):")
                    while '/' not in path:
                        print("請使用斜槓“/”!")
                        path = input("皮膚儲存路徑:")
                    check = os.path.exists(path)
                    while check == False:
                        print("目錄不存在!")
                        path = input("皮膚儲存路徑(請使用斜槓“/”):")
                        while '/' not in path:
                            print("請使用斜槓“/”!")
                            path = input("皮膚儲存路徑:")
                        check = os.path.exists(path)   
                    skn_url = 'https://skin.prinzeugen.net/raw/' + str_id + '.png'
                    image = requests.get(skn_url).content
                    img_name = skn_url.split('/')[4]
                    print("下載中...")
                    with open(path + '/' + img_name,'wb') as file:
                        file.write(image)
                        success = True
                    if success:
                        print("下載成功!")
                    else:
                        print("下載失敗!")
                catch()
        else:
            print("注意:如果在批量下載的過程當中遇到不存在的皮膚,將不會下載!")
            id1 = input("請輸入批量下載的開頭皮膚號碼:")
            while id1.isdigit() == False:
                id1 = input("請輸入批量下載的開頭皮膚號碼:")
            id2 = input("請輸入批量下載的結尾皮膚號碼:")
            while id2.isdigit() == False:
                id2 = input("請輸入批量下載的結尾皮膚號碼:")
            check = False
            while check == False:
                path = input("皮膚儲存路徑(請使用斜槓“/”):")
                while '/' not in path:
                    print("請使用斜槓“/”!")
                    path = input("皮膚儲存路徑:")
                check = os.path.exists(path)
                if check == False:
                    print("目錄不存在!")
            id1 = int(id1)
            id2 = int(id2)
            print("下載中...")
            for i in range(id1,id2+1):
                url = 'https://skin.prinzeugen.net/skinlib/show/' + str(i)
                text = requests.get(url).text
                check = re.findall('<p>(.*?)</p>',text)
                if check[0] == 'Details: The requested texture was already deleted.' or check[0] == 'Details: The requested texture is private and only visible to the uploader and admins.':
                    continue
                img_url = 'https://skin.prinzeugen.net/raw/' + str(i) + '.png'
                image = requests.get(img_url).content
                img_name = img_url.split('/')[4]
                with open(path + '/' + img_name,'wb') as file:
                    file.write(image)

            print("下載完成!")
            catch()       
    except KeyboardInterrupt:
        print("您退出了程式!")
        time.sleep(3.5)
        exit()
    except requests.exceptions.ConnectionError:
        print("網路異常!")
        time.sleep(3.5)
        exit()

catch()
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章