最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3爬取英雄聯(lián)盟英雄皮膚大圖實(shí)例代碼

 更新時(shí)間:2018年11月14日 14:39:07   作者:gxcuizy  
這篇文章主要介紹了Python3爬取英雄聯(lián)盟英雄皮膚大圖的實(shí)例代碼,文中較詳細(xì)的給大家介紹了爬蟲思路及完整代碼,需要的朋友可以參考下

爬蟲思路

初步嘗試

我先查看了network,并沒有發(fā)現(xiàn)有可用的API;然后又用bs4去分析英雄列表頁,但是請(qǐng)求到html里面,并沒有英雄列表,在英雄列表的節(jié)點(diǎn)上,只有“正在加載中”這樣的字樣;同樣的方法,分析英雄詳情也是這種情況,所以我猜測(cè),這些數(shù)據(jù)應(yīng)該是Javascript負(fù)責(zé)加載的。

繼續(xù)嘗試

然后我就查看了 英雄列表的源代碼 ,查看外部引入的js文件,以及行內(nèi)的js腳本,大概在368行,發(fā)現(xiàn)了有處理英雄列表的js注釋,然后繼續(xù)往下讀這些代碼,發(fā)現(xiàn)了第一個(gè)彩蛋,也就是他引入了一個(gè)champion.js的文件,我猜測(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 =LOLherojs.champion[heroid].data.skins ,也就是,這個(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)境:python3.6

用到的模塊:requests、json、urllib、os

未安裝的模塊,請(qǐng)使用pip instatll進(jìn)行安裝,例如:pip install requests

完整代碼

其他啥的廢話就不多說了,直接上完整代碼,有問題,直接留言給我就行,另外,代碼已上傳 GitHub 。再說明一下,那些有問題的英雄詳情的js文件,大家有時(shí)間也可以琢磨下,或者有其他的更加快捷的爬取這些圖片的方法,也可以拿出來交流和討論,謝謝。

#!/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):
    """初始化變量"""
    self.hero_url = 'https://lol.qq.com/biz/hero/champion.js'
    self.hero_detail_url = 'http://lol.qq.com/biz/hero/'
    self.skin_folder = 'skin'
    self.skin_url = 'https://ossweb-img.qq.com/images/lol/web201310/skin/big'
  @staticmethod
  def get_html(url):
    """下載html"""
    request = requests.get(url)
    request.encoding = 'gbk'
    if request.status_code == 200:
      return request.text
    else:
      return "{}"
  def get_hero_list(self):
    """獲取英雄的完整信息列表"""
    hero_js = self.get_html(self.hero_url)
    # 刪除左右的多余信息,得到j(luò)son數(shù)據(jù)
    out_left = "if(!LOLherojs)var LOLherojs={};LOLherojs.champion="
    out_right = ';'
    hero_list = hero_js.replace(out_left, '').rstrip(out_right)
    return json.loads(hero_list)
  def get_hero_info(self, hero_id):
    """獲取英雄的詳細(xì)信息"""
    # 獲取js詳情
    detail_url = parse.urljoin(self.hero_detail_url, hero_id + '.js')
    detail_js = self.get_html(detail_url)
    # 刪除左右的多余信息,得到j(luò)son數(shù)據(jù)
    out_left = "if(!herojs)var herojs={champion:{}};herojs['champion'][%s]=" % hero_id
    out_right = ';'
    hero_info = detail_js.replace(out_left, '').rstrip(out_right)
    return json.loads(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'
      self.download_skin(skin_info['id'], hero_skin_name)
  def download_skin(self, skin_id, skin_name):
    """下載皮膚圖片"""
    # 下載圖片
    img_url = self.skin_url + skin_id + '.jpg'
    request = requests.get(img_url)
    if request.status_code == 200:
      print('downloading……%s' % skin_name)
      img_path = os.path.join(self.skin_folder, skin_name)
      with open(img_path, 'wb') as img:
        img.write(request.content)
    else:
      print('img error!')
  def make_folder(self):
    """初始化,創(chuàng)建圖片文件夾"""
    if not os.path.exists(self.skin_folder):
      os.mkdir(self.skin_folder)
  def run(self):
    # 獲取英雄列表信息
    hero_json = self.get_hero_list()
    hero_keys = hero_json['keys']
    # 循環(huán)遍歷英雄
    for hero_id, hero_code in hero_keys.items():
      hero_name = hero_json['data'][hero_code]['name']
      hero_info = self.get_hero_info(hero_id)
      if hero_info:
        skin_list = hero_info['result'][hero_id]['skins']
        # 下載皮膚
        self.download_skin_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()

總結(jié)

以上所述是小編給大家介紹的Python3爬取英雄聯(lián)盟英雄皮膚大圖實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 解決django 向mysql中寫入中文字符出錯(cuò)的問題

    解決django 向mysql中寫入中文字符出錯(cuò)的問題

    這篇文章主要介紹了解決django 向mysql中寫入中文字符出錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 基于Python和Tkinter實(shí)現(xiàn)高考倒計(jì)時(shí)功能

    基于Python和Tkinter實(shí)現(xiàn)高考倒計(jì)時(shí)功能

    隨著高考的臨近,每個(gè)考生都在緊鑼密鼓地復(fù)習(xí),這時(shí)候,一款實(shí)用的倒計(jì)時(shí)軟件能有效幫助你規(guī)劃剩余時(shí)間,提醒你不要浪費(fèi)每一分每一秒,今天,我們來聊聊一款基于Python和Tkinter開發(fā)的高考倒計(jì)時(shí)軟件,功能簡單卻極具實(shí)用性,讓你在緊張的備考過程中不再迷失
    2025-03-03
  • Python異常處理操作實(shí)例詳解

    Python異常處理操作實(shí)例詳解

    這篇文章主要介紹了Python異常處理操作,結(jié)合實(shí)例形式分析了Python常見的異常處理類型、相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • python中while循環(huán)語句用法簡單實(shí)例

    python中while循環(huán)語句用法簡單實(shí)例

    這篇文章主要介紹了python中while循環(huán)語句用法,以一個(gè)簡單實(shí)例形式分析了Python使用while循環(huán)語句使用方法,需要的朋友可以參考下
    2015-05-05
  • Python如何拆分ZIP文件

    Python如何拆分ZIP文件

    這篇文章主要介紹了Python如何拆分ZIP文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python中ModuleNotFoundError: No module named ‘timm’的錯(cuò)誤解決

    Python中ModuleNotFoundError: No module named&n

    本文主要介紹了Python中ModuleNotFoundError: No module named ‘timm’的錯(cuò)誤解決,錯(cuò)誤意味著你的Python環(huán)境中沒有安裝名為“timm”的模塊,下面就介紹一下幾種解決方法,感興趣的可以了解一下
    2025-03-03
  • Python mutiprocessing多線程池pool操作示例

    Python mutiprocessing多線程池pool操作示例

    這篇文章主要介紹了Python mutiprocessing多線程池pool操作,結(jié)合實(shí)例形式分析了Python多線程模塊multiprocessing進(jìn)程池相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • Python連接SQLite數(shù)據(jù)庫并進(jìn)行增冊(cè)改查操作方法詳解

    Python連接SQLite數(shù)據(jù)庫并進(jìn)行增冊(cè)改查操作方法詳解

    這篇文章主要介紹了Python對(duì)SQLite數(shù)據(jù)庫進(jìn)行增冊(cè)改查操作方法詳解,需要的朋友可以參考下
    2020-02-02
  • Flask框架實(shí)現(xiàn)的前端RSA加密與后端Python解密功能詳解

    Flask框架實(shí)現(xiàn)的前端RSA加密與后端Python解密功能詳解

    這篇文章主要介紹了Flask框架實(shí)現(xiàn)的前端RSA加密與后端Python解密功能,結(jié)合實(shí)例形式詳細(xì)分析了flask框架前端使用jsencrypt.js加密與后端Python解密相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • python SOCKET編程基礎(chǔ)入門

    python SOCKET編程基礎(chǔ)入門

    這篇文章主要介紹了python SOCKET編程基礎(chǔ)入門的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-02-02

最新評(píng)論

新巴尔虎右旗| 云林县| 凤庆县| 家居| 扶余县| 海城市| 金塔县| 津南区| 舟山市| 岫岩| 同德县| 绥宁县| 横峰县| 皋兰县| 钦州市| 襄城县| 霞浦县| 广东省| 沿河| 庆元县| 佛山市| 沂源县| 东安县| 兴文县| 荥经县| 英吉沙县| 潢川县| 梅州市| 津市市| 金坛市| 方正县| 墨江| 开平市| 驻马店市| 焦作市| 四子王旗| 邵武市| 香港| 中西区| 荣昌县| 阳信县|