python爬取王者全皮肤

python爬取王者全皮肤

为了感谢天美爸爸让我新赛季连胜上王者,我决定——爬了你们!
知道有哪些英雄
这个比较难
在这里插入图片描述
对比几个网址:
蒙恬:
https://pvp.qq.com/web201605/herodetail/527.shtml
蒙犽:
https://pvp.qq.com/web201605/herodetail/524.shtml
镜:
https://pvp.qq.com/web201605/herodetail/531.shtml
就是https://pvp.qq.com/web201605/herodetail/+英雄id+.shtml
但是很遗憾的是,我们并不知道英雄id有哪些……
可是,经过一番寻找查看前辈文章 ,我最终发现了一个叫做herolist.json的文件,里面有保存英雄名字和id
在这里插入图片描述

url = 'https://pvp.qq.com/web201605/js/herolist.json'
herolist = requests.get(url)  # 获取英雄列表json文件
herolist_json = herolist.json()  # 转化为json格式
hero_name = list(map(lambda x: x['cname'], herolist.json()))  # 提取英雄的名字
hero_number = list(map(lambda x: x['ename'], herolist.json()))  # 提取英雄的编号

很好,那么就是很简单的下载了:
比如蒙恬:
在这里插入图片描述
他的图片下载网页就是
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/527/527-bigskin-1.jpg
以及
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/527/527-bigskin-2.jpg
那用requests.get就可以轻松下载了!

            onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str(
                j) + '-bigskin-' + str(k-2) + '.jpg'
            im = requests.get(onehero_link)  # 请求url

那么还有一个难题:怎么获取皮肤名字呢?
经过查找,我发现在这个地方可以知道有什么皮肤:
在这里插入图片描述
那就用正则吧!
额……很烦的哦!
那么就用上python的新库:requests_html
需要在cmd输入pip install requests_html或自行到官网下载
一行代码调出

from requests_html import HTMLSession

然后注意了!这个需要用的查找方式,既不是正则,也不是xpath,是我之前基本没怎么学过的方法:
在这里插入图片描述
selector
使用requests_html的方法也很简单:

def get_ski_name(url):
    session = HTMLSession()
    r = session.get(url)
    r_codes = r.html.find('body > div.wrapper > div.zk-con1.zk-con > div > div > div.pic-pf > ul')
    r_code = r_codes[0]
    #返回信息<Element 'ul' class=('pic-pf-list', 'pic-pf-list3') data-imgname='秩序统将&0|秩序猎龙将&0'>
    ski_name = str(r_code)[66:-2]
    ski_name = ski_name.replace("&","")
    global ski_list
    for i in range(10):#去数字
        ski_name = ski_name.replace(str(i),'')
    ski_list = ski_name.split('|')#得到皮肤名字列表

它会返回列表,注意不能直接使用哦!
最后,附上源码:

import os
import requests
import time
import shutil
import xlwt
from bs4 import BeautifulSoup
from lxml import etree
from requests_html import HTMLSession
#url = 'https://cpppatterns.com/patterns/copy-range-of-elements.html'
#获取皮肤 名字
def get_ski_name(url):
    session = HTMLSession()
    r = session.get(url)
    r_codes = r.html.find('body > div.wrapper > div.zk-con1.zk-con > div > div > div.pic-pf > ul')
    r_code = r_codes[0]
    #<Element 'ul' class=('pic-pf-list', 'pic-pf-list3') data-imgname='秩序统将&0|秩序猎龙将&0'>
    ski_name = str(r_code)[66:-2]
    ski_name = ski_name.replace("&","")
    global ski_list
    for i in range(10):#去数字
        ski_name = ski_name.replace(str(i),'')
    ski_list = ski_name.split('|')#得到皮肤名字列表

# 下载图片
def downloadPic():
    skin_name_list = []
    skin_name = []
    i = 0
    x = -1
    if not os.path.exists("王者全皮肤"):
            os.mkdir('王者全皮肤') 
    else:
        shutil.rmtree('王者全皮肤')
        os.mkdir('王者全皮肤')
    for j in hero_number:
        # 创建文件夹
        path = "王者全皮肤\\" + hero_name[i]
        # 进入创建好的文件夹
        os.mkdir("C:\\Users\\陈睿轩\\Desktop\\编程作品\\python\\requests\\"+path)
        time.sleep(0.2)
        os.chdir("C:\\Users\\陈睿轩\\Desktop\\编程作品\\python\\requests\\"+path)
        i += 1
        #https://pvp.qq.com/web201605/herodetail/196.shtml
        print("获取"+hero_name[i-1]+"的皮肤中!")
        ski_url = "https://pvp.qq.com/web201605/herodetail/" + str(j) + ".shtml"
        get_ski_name(ski_url)
        _len = len(ski_list) + 3
        print("获取成功:",ski_list)
        for k in range(1,_len):
            # 拼接url
            x += 1
            #basic_url = 'https://pvp.qq.com/web201605/herodetail/'+str(j)+'.shtml'
            #headers = {
            #    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
            #}
            #发送请求
            #response = requests.get(basic_url, headers=headers, timeout=10)     #requests请求;
            #response.encoding = 'utf-8'     #设置编码
            #htm = response.text     #返回text文本;
            #selector = etree.HTML(htm)      #利用 etree.HTML 初始化
            #skin = selector.xpath('/html/body/div[3]/div[1]/div/div/div[2]/ul')
            #sk_in = skin[0]
            #skin = sk_in.replace("&0","")
            #ski_n = skin.split("|")
            #skin_name_list.append(ski_n)
            onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str(
                j) + '-bigskin-' + str(k-2) + '.jpg'
            im = requests.get(onehero_link)  # 请求url
            if im.status_code == 200:
                ski_name = ski_list[k-3]
                print("正在下载 "+hero_name[i-1]+" 的"+str(k-2)+"号皮肤—— "+ski_name)
                open(hero_name[i-1] + "——" + ski_name + '.jpg', 'wb').write(im.content)  # 写入文件
        print(hero_name[i-1]+" 的皮肤下载完毕!")
        print()
        #skin_name.append(long)
        #os.chdir(format(os.path.abspath(os.path.join(os.getcwd(), ".."))))
if __name__ == "__main__":
    start_time = time.time()
    url = 'https://pvp.qq.com/web201605/js/herolist.json'
    herolist = requests.get(url)  # 获取英雄列表json文件
    herolist_json = herolist.json()  # 转化为json格式
    hero_name = list(map(lambda x: x['cname'], herolist.json()))  # 提取英雄的名字
    hero_number = list(map(lambda x: x['ename'], herolist.json()))  # 提取英雄的编号
    downloadPic()
    end_time = time.time()
    all_time = end_time - start_time 
    print("已完成全部的皮肤海报爬取,共用时"+str(all_time)+"秒")
    

程序运行中截图:
在这里插入图片描述
这是2020.7.24的帖子,100个英雄,最新的李信皮肤一念神魔和张飞皮肤虎魂都有哦!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
记得点赞关注赞赏哦!爱你么么哒!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值