社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用python爬取《王者荣耀》《英雄联盟》《神之浩劫》等游戏官网皮肤图片爬取

数据挖掘与大数据分析 • 7 年前 • 1220 次点击  

本文使用Python制作爬虫,来爬取《英雄联盟》《王者荣耀》《神之浩劫》等游戏官方网站的英雄皮肤图片。可以作为新手爬虫的练手实战案例!!

对于腾讯的这三款MOBA游戏,其中《王者荣耀》和《英雄联盟》大部分同学可能都不会陌生。对于MOBA游戏,总会让人感叹:不怕神一样的对手,就怕猪一样的队友。。。。。。当然自己也有一顿操作0:5的经历。。。。。。

在浏览这些游戏官方网站的时候发现英雄的皮肤很好看,例如这一张:

想拿来做电脑壁纸。于是就打开开发者工具找到了这张壁纸的地址下载下来。但是我还想要赵云的其他皮肤壁纸。。。。。。还想要其他英雄的所有皮肤壁纸。。。。。。还想要《英雄联盟》《神之浩劫》的皮肤壁纸。。。。。。这样就用到爬虫了!!

这里主要讲解《王者荣耀》的爬取方法,其他类似。

  • 《王者荣耀》

  • 所有英雄

首先进入所有英雄列表,你会看到下图:

在这个网页中包含了所有的英雄,头像及英雄名称。

  • 单个英雄

点击其中一个英雄的头像,例如第一个“百里守约”,进去后如下图:

“百里守约”里面有两个皮肤图片(如右下角所示)。我们就是要抓取这样的图片(注意:不是右下角那两张小图,而是如上图所示中的大图)。在这个网页中查看“百里守约”的网址,可以看到网址是:pvp.qq.com/web201605/he。其实网址中196.shtml以前的字符都是不变的,变化的只是196.shtml。那么196是什么呢?乍一看毫无意义,其实它是“百里守约”这个英雄所对应的数字(我也不知道为啥这样对应!!)。也就是说,要想爬取图片你就应该进入每个英雄皮肤图片所在的网址。就像上图所示的“百里守约”。而要爬取所有英雄的图片,就应该有所有单个英雄的网址。所有英雄的网址的关键就是每个英雄对应的数字。那么这些数字怎么找呢?

  • 英雄数字

在所有英雄列表中,打开浏览器的开发者工具(F12),刷新,找到一个json格式的文件,如图所示:

这时就会看到所有英雄对应的数字了。在上图所示的Headers中可以找到该json文件对应的网址形式。将其导入Python,把这些数字提取出来,然后模拟出所有英雄的网址即可(网址的格式在上一小节中已经提过了)。

前面几个小节的代码如下(我的是Ubuntu(Linux)系统):

#爬取王者荣耀英雄图片#导入所需模块import


    
 requestsimport reimport os#导入json文件(里面有所有英雄的名字及数字)url='http://pvp.qq.com/web201605/js/herolist.json'  #英雄的名字jsonhead={'User-Agent':'换成你自己的head'}html = requests.get(url,headers = head)html=requests.get(url)html_json=html.json()#提取英雄名字和数字hero_name=list(map(lambda x:x['cname'],html_json)) #名字hero_number=list(map(lambda x:x['ename'],html_json)) #数字
  • 下载图片

现在可以进入所有英雄的网址了,可以爬取网址下的图片了。进入一个英雄的网址,打开开发者工具,在NetWork下刷新并找到英雄的皮肤图片(记住是大图)。如图所示:

然后在Headers中查看该图片的网址。会发现皮肤图片是有规律的。我们可以用这样的方式来模拟图片网址:'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'+str(v)+'/'+str(v)+'-bigskin-'+str(u)+'.jpg',在该网址中只有str(v)与str(u)是改变的(str( )是Python中的一个函数),str(v)是英雄对应的数字,str(u)只是图片编号,例如第一个图片就是1,第二个就是2,第三个。。。。。。而一个英雄的皮肤应该不会超过12个(如果你不放心可以将这个值调到20等)。既然英雄皮肤的网址也有了,下面就是下载了!!

下载的代码如下(有些地址要换成你自己的):

def main():  #用于下载并保存图片
    ii=0
    for v in hero_number:
        os.mkdir("/home/wajuejiprince/图片/WZRY/"+hero_name[ii]) #换成你自己的
        os.chdir("/home/wajuejiprince/图片/WZRY/"


    
+hero_name[ii]) #换成你自己的
        ii=ii+1
        for u in range(12):
            onehero_links='http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'+str(v)+'/'+str(v)+'-bigskin-'+str(u)+'.jpg'
            im = requests.get(onehero_links)
            if im.status_code == 200:
               iv=re.split('-',onehero_links)
               open(iv[-1], 'wb').write(im.content)

执行完上面的代码后只需要执行main函数就行了

main()

爬取下来的图片是这样,每个文件夹里面是该英雄对应的图片,如下图:


  • 《英雄联盟》(美服)(两种方法)

这两种方法的区别就在于:第一种不用观察图片规律,直接提取图片网址;第二种和抓取《王者荣耀》类似,都是模拟图片地址。

  • 第一种

这一种是在提取图片网址的时候直接使用正则表达式来匹配出图片网址。代码如下:

#导入模块import requestsimport refrom bs4


    
 import BeautifulSoupimport os

得到英雄的名字:

url='http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_US/champion.json'  #json里面含有所有英雄的名字def get_hero_name(url):    
    head={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/59.0.3071.109 Chrome/59.0.3071.109 Safari/537.36'}
    html = requests.get(url,headers = head)
    heml_json=html.json()
    hero_name=heml_json['data'].keys()
    list_of_nameMax=list(hero_name)  #此时的英雄名字的首字母是大写

    list_of_nameMin=[]  #此时的名字就是小写了
    for ii in list_of_nameMax:
        name=ii.lower()
        list_of_nameMin.append(name)    
    return list_of_nameMin   

定义下载一个英雄图片的函数:

def get_onehero_img(name):  #下载一个英雄的所有皮肤图片
    url2='http://gameinfo.na.leagueoflegends.com/en/game-info/champions/'+name+'/'
    head={'User-Agent':'你自己的headers'}
    html = requests.get(url2,headers=head)
    contents=html.text
    soup=BeautifulSoup(contents)


    

    hero_img=soup.findAll('img')
    reg=re.compile(r'"http://ddragon.leagueoflegends.com/cdn/img/.*?.jpg"',re.S)
    hero_img_links=re.findall(reg,str(hero_img))
    return hero_img_links

下载保存图片(保存地址要改):

def main():  #用于下载并保存图片
    list_name=list_of_name
    for i in list_name:
        os.mkdir("/home/wajuejiprince/图片/LOL/"+i)
        os.chdir("/home/wajuejiprince/图片/LOL/"+i)  
        ashe=get_onehero_img(i)
        for j in ashe:
            im=re.sub('"','',j)
            ir = requests.get(im)
            if ir.status_code == 200:
                ip=re.sub('"','',j)
                iu=re.split('/',im)
                open(iu[-1], 'wb').write(ir.content)

执行:

if __name__ == "__main__":
    list_of_name=get_hero_name(url)
    main()
  • 第二种

import requestsimport reimport os

得到英雄名字:

url='http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_US/champion.json'  #json里面含有所有英雄的名字def get_hero_nameMax(url):    
    head={'User-Agent':'你自己的headers'}
    html = requests.get(url,headers = head)
    heml_json=html.json()
    hero_name=heml_json['data'].keys()
    list_of_nameMax=list(hero_name)  #此时的英雄名字的首字母是大写
    return list_of_nameMax

下载图片(保存地址要改):

onehero_links=[]list_of_nameMax=get_hero_nameMax(url)def main():  #用于下载并保存图片
    for fn in list_of_nameMax:
        os.mkdir("/home/wajuejiprince/图片/LOL2/"+fn)
        os.chdir("/home/wajuejiprince/图片/LOL2/"


    
+fn) 
        for v in range(20):            
            onehero_links='http://ddragon.leagueoflegends.com/cdn/img/champion/splash/'+fn+'_'+str(v)+'.jpg'
            im = requests.get(onehero_links)
            if im.status_code == 200:
               iv=re.split('/',onehero_links)
               open(iv[-1], 'wb').write(im.content)

执行:

main()
  • 《神之浩劫》(美服)

import requestsimport reimport osurl='https://www.smitegame.com/gods/'head={'User-Agent':'你的head'}html = requests.get(url,headers = head)reg=re.compile(r'href="(.*?)">\n    )  #返回的是文本不用re.Shero_url=re.findall(reg,html.text)  #得到所有英雄的网址def one_hero_picture(ul):
    html_hero = requests.get


    
(ul,headers = head)
    if html_hero.status_code == 200:
        reg2=re.compile(r'"background-image:url\((.*?)\)">\n',re.S)
        items2=re.findall(reg2,html_hero.text)
        del items2[0]
    return items2#每个英雄的名字hero_name=list(map(lambda x:re.split('/',x)[-2],hero_url))def main():  #用于下载并保存图片
    ii=0
    for v in hero_url:
        os.mkdir("/home/wajuejiprince/图片/Smite/"+hero_name[ii])
        os.chdir("/home/wajuejiprince/图片/Smite/"+hero_name[ii]) 
        ii=ii+1
        one_hero=[]
        one_hero=one_hero_picture(v)   
        for u in one_hero:
            im = requests.get(u)
            if im.status_code == 200:
               iv=re.split('/',u)
               open(iv[-1], 'wb').write


    
(im.content)main()

对于《神之浩劫》的代码有些英雄在json文件中的名字还不是该英雄网址的名字,记得应该是孙悟空等,只需将hero_name中这些英雄的名称改对即可(我没有改,所以没有下全)。

  • 最后--美图欣赏

蔡文姬:

狄仁杰:

贾克斯:

阿兹尔:

阿格尼:

嫦娥:

敖广:

声明:本爬虫仅供个人娱乐学习,请不要用于任何商业目的或违法行为!!

第一期学习已满,现在二三期正在招募,课程体系任你选,全部免费,终身学习,点击了解  那些人都在爱数圈(第一期)


加入数据君高效数据分析社区,2种加人方式:


1:扫码加入


2、加入方式:


加我微信:seedata      

转账298,先拉微信群,再邀请进小密圈

犹豫的、不懂的、咨询的不要加,加了也是僵尸,时间宝贵,你我都珍惜


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/jCO57B6BtQ
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/3535
 
1220 次点击