臨下班前,看到羣裏有人在討論用王者農藥的一些皮膚做爲電腦的壁紙,什麼高清的,什麼像素稍低的,網上查了一手,也有,但像素都不同,因此,我就想着,本身去官網直接爬他的高清皮膚就行了,而後就有了這邊文章說的主題了。html
進入官網,而後進入英雄介紹,查看更多英雄,就能看到所有的英雄了,也就是下面的這個連接python
英雄列表:https://pvp.qq.com/web201605/herolist.shtmlgit
點擊每一個英雄進來,就能夠看到每一個英雄的詳細信息,基本介紹以及皮膚展現,而咱們須要爬取的皮膚,就在右下角那裏,鼠標放上去,就能夠逐個展現該皮膚了github
小魯班的詳細信息:https://pvp.qq.com/web201605/herodetail/112.shtmlweb
從上面的這張魯班的圖片中咱們能夠看到,經過F12定位到皮膚的小圖片位置,li元素裏有一個img的元素,其中img的src和data-imgname這兩個屬性,查看一下,就不難知道,src的屬性值是小圖,而data-imgname則是咱們須要的大圖URL,可是查看源碼,就會發現,在html中,並無這個屬性,因此,須要咱們分析這個URL的規律來獲得其餘英雄的皮膚圖片,分析也不難發現,112就是英雄的id,而bigskin-2裏面的2即表示這個英雄的第幾張皮膚圖片json
第一步:定義一些經常使用變量網站
第二步:抓取全部英雄列表ui
第三步:循環遍歷,分析每一個英雄皮膚節點url
第四步:下載圖片spa
第五步:爬蟲結束
感受上面七七八八的,說了些啥呀,真是墨跡,還不如直接上代碼實在,好吧,我錯了,立刻交出源碼,請各位看官饒恕,同時,代碼我也上傳了交友網站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 = 1 # 循環下載皮膚圖片 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()
其實思路就是這麼簡單,固然了,若是有其餘思路以及想法的,歡迎留言交流。額,差點忘了,你們有興趣的,能夠嘗試一下爬取英雄聯盟的全部英雄皮膚高清圖片,有其餘任何問題,也歡迎留言和交流。