1. 程式人生 > >利用Python一鍵獲取王者榮耀英雄面板

利用Python一鍵獲取王者榮耀英雄面板

爬圖思路

找到英雄列表

進入官網,然後進入英雄介紹,檢視更多英雄,就能看到全部的英雄了,也就是下面的這個連結

英雄列表: pvp.qq.com/web201605/h…

利用Python一鍵獲取王者榮耀英雄面板

 

英雄詳情

點選每個英雄進來,就可以看到每個英雄的詳細資訊,基本介紹以及面板展示,而我們需要爬取的面板,就在右下角那裡,滑鼠放上去,就可以逐個展示該面板了

小魯班的詳細資訊: pvp.qq.com/web201605/h…

利用Python一鍵獲取王者榮耀英雄面板

 

分析面板圖片URL

從上面的這張魯班的圖片中我們可以看到,通過F12定位到面板的小圖片位置,li元素裡有一個img的元素,其中img的src和data-imgname這兩個屬性,檢視一下,就不難知道,src的屬性值是小圖,而data-imgname則是我們需要的大圖URL,但是檢視原始碼,就會發現,在html中,並沒有這個屬性,所以,需要我們分析這個URL的規律來得到其他英雄的面板圖片,分析也不難發現,112就是英雄的id,而bigskin-2裡面的2即表示這個英雄的第幾張面板圖片

開始編寫爬蟲指令碼

第一步:定義一些常用變數

第二步:抓取所有英雄列表

第三步:迴圈遍歷,分析每個英雄面板節點

第四步:下載圖片

第五步:爬蟲結束

完整原始碼

感覺上面七七八八的,說了些啥呀,真是墨跡,還不如直接上程式碼實在,好吧,我錯了,馬上交出原始碼,請各位看官饒恕,同時,程式碼我也上傳了交友網站 GitHub 。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
抓取王者榮耀面板
author: gxcuizy
date: 2018-11-06
"""
import requests
from bs4 import BeautifulSoup
from urllib import parse
import os
class Skin(object):
 def __init__(self):
 # 英雄的json資料
 self.hero_url = 'https://pvp.qq.com/web201605/js/herolist.json'
 # 英雄詳細頁的通用url字首資訊
 self.base_url = 'https://pvp.qq.com/web201605/herodetail/'
 # 英雄詳細頁url字尾資訊
 self.detail_url = ''
 # 圖片儲存資料夾
 self.img_folder = 'skin'
 # 圖片url的通用字首
 self.skin_url = 'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'
 # 圖片url的字尾資訊
 self.skin_detail_url = ''
 def get_hero(self):
 """獲取英雄的json資料"""
 request = requests.get(self.hero_url)
 hero_list = request.json()
 return hero_list
 def get_hero_skin(self, hero_name, hero_no):
 """獲取詳細頁英雄面板展示的資訊,並爬圖"""
 url = parse.urljoin(self.base_url, self.detail_url)
 request = requests.get(url)
 request.encoding = 'gbk'
 html = request.text
 # 獲取面板資訊的節點
 soup = BeautifulSoup(html, 'lxml')
 skip_list = soup.select('.pic-pf-list3')
 for skin_info in skip_list:
 # 獲取面板名稱
 img_names = skin_info.attrs['data-imgname']
 name_list = img_names.split('|')
 skin_no = len(name_list)
 # 迴圈下載面板圖片
 for skin_name in name_list:
 self.skin_detail_url = '%s/%s-bigskin-%s.jpg' % (hero_no, hero_no, skin_no)
 skin_no -= 1
 img_name = hero_name + '-' + skin_name + '.jpg'
 self.download_skin(img_name)
 def download_skin(self, img_name):
 """下載面板圖片"""
 img_url = parse.urljoin(self.skin_url, self.skin_detail_url)
 request = requests.get(img_url)
 if request.status_code == 200:
 print('download-%s' % img_name)
 img_path = os.path.join(self.img_folder, img_name)
 with open(img_path, 'wb') as img:
 img.write(request.content)
 else:
 print('img error!')
 def make_folder(self):
 """建立圖片儲存資料夾"""
 if not os.path.exists(self.img_folder):
 os.mkdir(self.img_folder)
 def run(self):
 """指令碼執行入口"""
 self.make_folder()
 hero_list = self.get_hero()
 for hero in hero_list:
 hero_no = str(hero['ename'])
 self.detail_url = hero_no + '.shtml'
 hero_name = hero['cname']
 self.get_hero_skin(hero_name, hero_no)
# 程式執行入口
if __name__ == '__main__':
 skin = Skin()
 skin.run()
複製程式碼

最後

其實思路就是這麼簡單,當然了,如果有其他思路以及想法的,歡迎留言交流。額,差點忘了,大家有興趣的,可以嘗試一下爬取英雄聯盟的所有英雄面板高清圖片,有其他任何問題,也歡迎留言和交流。