《王者荣耀》游戏皮肤用python免费“偷”

《王者荣耀》游戏皮肤用python免费“偷”

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

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

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

《王者荣耀》游戏皮肤用python免费“偷”

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

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

  • 《王者荣耀》

  • 所有英雄

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

    《王者荣耀》游戏皮肤用python免费“偷”

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

  • 单个英雄

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

    《王者荣耀》游戏皮肤用python免费“偷”

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

  • 英雄数字

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

    《王者荣耀》游戏皮肤用python免费“偷”

    这时就会看到所有英雄对应的数字了。在上图所示的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下刷新并找到英雄的皮肤图片(记住是大图)。如图所示:

    《王者荣耀》游戏皮肤用python免费“偷”

    然后在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()

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

    《王者荣耀》游戏皮肤用python免费“偷”

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

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

  • 第一种

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

    #导入模块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="http://www.smitegame.com/gods/"head={"User-Agent":"你的head"}html = requests.get(url,headers = head)reg=re.compile(r"href="http://www.gunmi.cn/v/(.*?)">    <img")  #返回的是文本不用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((.*?))">",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中这些英雄的名称改对即可(我没有改,所以没有下全)。

  • 最后--美图欣赏

  • 蔡文姬:

    《王者荣耀》游戏皮肤用python免费“偷”

    狄仁杰:

    《王者荣耀》游戏皮肤用python免费“偷”

    贾克斯:

    《王者荣耀》游戏皮肤用python免费“偷”

    阿兹尔:

    《王者荣耀》游戏皮肤用python免费“偷”

    阿格尼:

    《王者荣耀》游戏皮肤用python免费“偷”

    嫦娥:

    《王者荣耀》游戏皮肤用python免费“偷”

    敖广:

    《王者荣耀》游戏皮肤用python免费“偷”

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

    《王者荣耀》游戏皮肤用python免费“偷”

    ————广告时间————

    《马哥Linux云计算及架构师》课程,由知名Linux布道师马哥创立,经历了8年的发展,联合阿里巴巴、唯品会、大众点评、腾讯、陆金所等大型互联网一线公司的马哥课程团队的工程师进行深度定制开发,课程采用 Centos7.2系统教学,加入了大量实战案例,授课案例均来自于一线的技术案例,培养过20%的学员月薪超过3万。

    开课时间:11月06号

    《王者荣耀》游戏皮肤用python免费“偷”
    《王者荣耀》游戏皮肤用python免费“偷”
    扫描二维码领取学习资料《王者荣耀》游戏皮肤用python免费“偷”
    《王者荣耀》游戏皮肤用python免费“偷”

    《王者荣耀》游戏皮肤用python免费“偷”

    感谢您抽出  · 来阅读此文

    更多Linux好文请点击【阅读原文】哦

    ↓↓↓