本文使用python的第三方模塊requests爬取王者榮耀所有英雄的圖片,並將圖片按每個英雄為一個目錄存入文件夾中,方便用作桌面壁紙 下麵時具體的代碼,已通過python3.6測試,可以成功運行: 對於所要爬取的網頁連接可以通過王者榮耀官網找到, 下麵是保存抓取到的圖片的文件夾樣例: 以上就是抓取 ...
本文使用python的第三方模塊requests爬取王者榮耀所有英雄的圖片,並將圖片按每個英雄為一個目錄存入文件夾中,方便用作桌面壁紙
下麵時具體的代碼,已通過python3.6測試,可以成功運行:
對於所要爬取的網頁連接可以通過王者榮耀官網找到,
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Wed Dec 13 13:49:52 2017 4 5 @author:KillerTwo 6 """ 7 import requests 8 import os 9 hero_list_url = 'http://pvp.qq.com/web201605/js/herolist.json' 10 hero_skin_root_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' 11 skin_base_dir = 'C:\\Users\\lwt27\\Pictures\\image\\heroskin\\' 12 13 14 def get_ename(hero_json):#傳入獲取到的python對象,如hero_list_json 15 '''獲取英雄名稱對應英雄編號的一個字典,例如{小喬:106,...}''' 16 cname_ename = {} 17 for hero in hero_json: 18 cname_ename[hero['cname']] = hero['ename'] 19 return cname_ename 20 21 def get_skin_name(hero_json): #傳入從網頁獲取到的json轉換為python字典的對象 22 '''獲取英雄名稱對應的皮膚的所有皮膚名稱的字典,例如 23 {'小喬':'戀之微風|萬聖前夜|天鵝之夢|純白花嫁|繽紛獨角獸',...}''' 24 cname_skin_name = {} 25 for hero in hero_json: 26 cname_skin_name[hero['cname']] = hero['skin_name'] 27 return cname_skin_name 28 29 def get_hero_skin_count(cname_skin_name): #傳入英雄名稱對應皮膚名稱的字典 30 '''獲取每個英雄對應的皮膚的個數,例如{'小喬':5,...}''' 31 cname_skin_count = {} 32 for item in cname_skin_name.items(): 33 cname_skin_count[item[0]] = len(item[1].split('|')) 34 return cname_skin_count 35 36 def get_skin_name_url(skin_base_rul,cname_skin_count,cname_ename): 37 #傳入皮膚根地址和名稱對應皮膚數量的字典和名稱對應編號的字典 38 '''返回英雄名稱對應的所有皮膚的url地址列表的字典,例如{小喬:[skin_url1,skin_url2],...}''' 39 cname_url_list = {} 40 for cname,count in cname_skin_count.items(): 41 #print(cname) 42 #print(count) 43 #print(skin_base_rul) 44 #print(cname_ename[cname]) 45 base_url = skin_base_rul+str(cname_ename[cname])+'/'+str(cname_ename[cname])+'-bigskin-' 46 #print(base_url) 47 skin_url_list = [str(base_url)+str(num)+'.jpg' for num in range(1,count+1)] 48 cname_url_list[cname] = skin_url_list 49 return cname_url_list 50 51 #print() 52 d = get_skin_name_url(hero_skin_root_url,get_hero_skin_count(get_skin_name(hero_list_json)),get_ename(hero_list_json)) 53 #print(d) 54 55 def get_cname_skin_name(cname_skin_name):#傳入名稱對應皮膚名稱字元串的字典 56 cname_skin_name_dict = {} #返回名稱對應【皮膚名稱的列表】的字典 57 for cname,skin_name_list in cname_skin_name.items(): 58 skin_list = [name for name in skin_name_list.split('|')] 59 cname_skin_name_dict[cname] = skin_list 60 return cname_skin_name_dict 61 62 #s = get_skin_name(hero_list_json) 63 #print(s) 64 #f = get_cname_skin_name(s) 65 #print(f) 66 67 def get_hero_skin(cname_url_list,cname_skin_name):#傳入名稱對應【皮膚名稱列表】的字典和名稱對應皮膚url列表的字典 68 # """獲取每個英雄的圖片""" 69 for cname,skin_url in cname_url_list.items(): 70 71 if mkdir(skin_base_dir+cname):#創建指定目錄 72 os.chdir(skin_base_dir+cname) #進入到創建的目錄 73 74 for i in range(len(skin_url)): 75 file_name = cname_skin_name[cname][i]+'.jpg' 76 r = requests.get(skin_url[i]) 77 with open(file_name,'wb') as f: 78 f.write(r.content) 79 #創建目錄 80 def mkdir(path): 81 # 引入模塊 82 import os 83 # 去除首位空格 84 path=path.strip() 85 # 去除尾部 \ 符號 86 path=path.rstrip("\\") 87 # 判斷路徑是否存在 88 # 存在 True 89 # 不存在 False 90 isExists=os.path.exists(path) 91 # 判斷結果 92 if not isExists: 93 # 如果不存在則創建目錄 94 # 創建目錄操作函數 95 os.makedirs(path) 96 print(path+' 創建成功') 97 return True 98 else: 99 # 如果目錄存在則不創建,並提示目錄已存在 100 print(path+' 目錄已存在') 101 return False 102 return 103 104 if __name__ == '__main__': 105 106 hero_list_body = requests.get(hero_list_url) #請求英雄列表 107 hero_list_json = hero_list_body.json() #將英雄列表的獲取的json數據轉換為python對象 108 109 cname_ename = {} #英雄名稱對應英雄編號的字典 110 cname__skin_name = {} #英雄名稱對應皮膚名稱字元串的字典 111 cname_skin_count = {} #英雄名稱對應皮膚數量的字典 112 113 cname_skin_name_str_list = get_skin_name(hero_list_json) 114 cname_skin_name_list = get_cname_skin_name(cname_skin_name_str_list) 115 cname_skin_count = get_hero_skin_count(cname_skin_name_str_list) 116 cname_ename = get_ename(hero_list_json) 117 cnam_skin_url_list = get_skin_name_url(hero_skin_root_url,cname_skin_count,cname_ename) 118 get_hero_skin(cnam_skin_url_list,cname_skin_name_list)
下麵是保存抓取到的圖片的文件夾樣例:
以上就是抓取王者榮耀所有英雄皮膚的簡單示例,上述的代碼並沒有使用python多線程執行抓取圖片的函數,所以在執行的時候可能需要花費幾分鐘的時間,
以後在進行改進,添加使用python多線程執行抓取任務。