爬蟲事故
初步嘗試
首先查看了網(wǎng)絡(luò),可用的API沒有發(fā)現(xiàn)。然后用bs4分析英雄列表頁(yè)面,但是html沒有英雄列表。英雄列表節(jié)點(diǎn)只有“正在加載”一詞。用同樣的方法分析英雄的細(xì)節(jié)也是這種情況,所以我猜這個(gè)數(shù)據(jù)應(yīng)該由Javascript負(fù)責(zé)加載。
繼續(xù)嘗試
然后我就查看了 英雄列表的源代碼 ,查看外部引入的js文件,以及行內(nèi)的js腳本,大概在368行,發(fā)現(xiàn)了有處理英雄列表的js注釋,然后繼續(xù)往下讀這些代碼,發(fā)現(xiàn)了第一個(gè)彩蛋,也就是他引入了一個(gè)c的文件,我猜測(cè),這個(gè)應(yīng)該就是英雄列表大全了,然后我打開了這個(gè)鏈接的js,一眼看過去,黑麻麻一片,然后格式化了一下壓縮的js,確定這就是英雄列表的js數(shù)據(jù)文件了。
接著嘗試
前面通過查看列表的源代碼,找到了英雄列表的js數(shù)據(jù)文件,那么,我繼續(xù)隨機(jī)點(diǎn)開了一個(gè)英雄的詳情,然后查看 英雄詳情源代碼 ,然后大概在568行看到有一個(gè)showskin的js方法,通過這里,發(fā)現(xiàn)了第二個(gè)彩蛋,也就是皮膚圖片的URL地址拼接方法。
最后嘗試
上面找到了皮膚圖片URL的拼接方法,并且發(fā)現(xiàn)了一行很關(guān)鍵的代碼 var skin =LOL[heroid].da ,也就是,這個(gè)skin變量,就是英雄皮膚的所有圖片數(shù)組,但是這個(gè)文件內(nèi),并沒有LOLherojs這個(gè)變量,也就是外部引入的,所以,需要繼續(xù)查看下面的源代碼,找到引入這個(gè)變量的位置,果不其然,在757行,發(fā)現(xiàn)了最后一個(gè)彩蛋,也就是,英雄皮膚的js文件,通過這里可以知道,每個(gè)英雄都有一個(gè)單獨(dú)的js文件,并且知道了這個(gè)js文件的URL拼接方法。
思路總結(jié)
通過上面的分析,我們就得到了爬取LOL皮膚圖片的所有數(shù)據(jù)準(zhǔn)備了,也就是,直接,只需要提取js中的英雄列表以及英雄詳情數(shù)據(jù),就可實(shí)現(xiàn)我們的需求了。下面是運(yùn)行后抓取到的圖片……
運(yùn)行環(huán)境
- Python運(yùn)行環(huán)境:
- 用到的模塊:requests、json、urllib、os
- 未安裝的模塊,請(qǐng)使用pip instatll進(jìn)行安裝,例如:pip install requests
完整代碼
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 抓取英雄聯(lián)盟英雄全皮膚 author: gxcuizy date: 2018-11-13 """ import requests import json from urllib import parse import os class GetLolSkin(object): """抓取LOL英雄皮膚""" def __init__(self): """初始化變量""" = 'https://lol.qq.com/biz/hero/c' = '; = 'skin' = 'https://ossweb-img.qq.com/images/lol/web201310/skin/big' @staticmethod def get_html(url): """下載html""" request = reque(url) reque = 'gbk' if reque == 200: return reque else: return "{}" def get_hero_list(self): """獲取英雄的完整信息列表""" hero_js = () # 刪除左右的多余信息,得到j(luò)son數(shù)據(jù) out_left = "if(!LOLherojs)var LOLherojs={};LOL=" out_right = ';' hero_list = (out_left, '').rstrip(out_right) return j(hero_list) def get_hero_info(self, hero_id): """獲取英雄的詳細(xì)信息""" # 獲取js詳情 detail_url = (, hero_id + '.js') detail_js = (detail_url) # 刪除左右的多余信息,得到j(luò)son數(shù)據(jù) out_left = "if(!herojs)var herojs={champion:{}};herojs['champion'][%s]=" % hero_id out_right = ';' hero_info = de(out_left, '').rstrip(out_right) return j(hero_info) def download_skin_list(self, skin_list, hero_name): """下載皮膚列表""" # 循環(huán)下載皮膚 for skin_info in skin_list: # 拼接圖片名字 if skin_info['name'] == 'default': skin_name = '默認(rèn)皮膚' else: if ' ' in skin_info['name']: name_info = skin_info['name'].split(' ') skin_name = name_info[0] else: skin_name = skin_info['name'] hero_skin_name = hero_name + '-' + skin_name + '.jpg' (skin_info['id'], hero_skin_name) def download_skin(self, skin_id, skin_name): """下載皮膚圖片""" # 下載圖片 img_url = + skin_id + '.jpg' request = reque(img_url) if reque == 200: print('downloading……%s' % skin_name) img_path = os.(, skin_name) with open(img_path, 'wb') as img: img.write) else: print('img error!') def make_folder(self): """初始化,創(chuàng)建圖片文件夾""" if not os.(): os.mkdir() def run(self): # 獲取英雄列表信息 hero_json = () hero_keys = hero_json['keys'] # 循環(huán)遍歷英雄 for hero_id, hero_code in (): hero_name = hero_json['data'][hero_code]['name'] hero_info = (hero_id) if hero_info: skin_list = hero_info['result'][hero_id]['skins'] # 下載皮膚 _list(skin_list, hero_name) else: print('英雄【%s】的皮膚獲取有問題……' % hero_name) # 程序執(zhí)行入口 if __name__ == '__main__': lol = GetLolSkin() # 創(chuàng)建圖片存儲(chǔ)文件 lol.make_folder() # 執(zhí)行腳本 lol.run()1.《Python爬取英雄聯(lián)盟官網(wǎng)皮膚圖片》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。
2.《Python爬取英雄聯(lián)盟官網(wǎng)皮膚圖片》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/gl/3022934.html