Python多线程下载英雄联盟所有英雄皮肤

本文记录了一名土木工程学生使用Python进行爬虫的实战经历,目标是下载英雄联盟所有英雄的皮肤图片。通过分析网站,解决了请求数据不全的问题,采用多线程和队列技术,成功获取并下载了皮肤链接。
摘要由CSDN通过智能技术生成

土木工程在校学生一枚,对编程没什么了解,之前唯一接触过的编程类软件是Matlab,然而鼎鼎有名的科研大杀器在我手中却沦落成了计算器。
上周从导师那里了解到了python这个软件,感觉挺酷炫,再一查资料,莫名自信了起来,撸起袖子准备大干一场,各种百度google后才明白一个道理,纸上得来终觉浅,绝知此事要躬行!


一、选择目标

看了一些书籍的案例,不是很感兴趣,看的也是一头雾水,思前想后还是决定对英雄联盟这个网站下手,爬取所有英雄的皮肤图片。

二、网站分析

1.访问网页

英雄列表url:https://lol.qq.com/data/info-heros.shtml

F12一开,源代码好像很简单,非常清晰规律,直接开干!!!
requests请求后一番操作后我开始意识到不对劲,get请求获得的结果和网页源代码不一样,少了亿点内容???

import requests

HEADERS = {
   
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/87.0.4 280.88 Safari/537.36",
}
url = 'https://lol.qq.com/data/info-heros.shtml'
res = requests.get(url, headers=HEADERS).content.decode('gbk')
print(res)

各种百度google后在Network中找到了真实的请求地址
https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js

再次请求,这一次终于获取到了所有英雄的信息,好家伙就这一个小问题折腾了一个上午!!!

2.获取所有英雄名称并创建对应的文件夹

预定的结果是在桌面建一个LOL文件夹,子目录中放每个英雄的皮肤。

请求返回的数据转换使用json.loads加载成dict类型,然后就方便获取数据了.

text = json.loads(res)
hero_info = text['hero']
for hero in hero_info:
    path = f"C:/Users/xiang/Desktop/LOL/{hero['name'] + hero['title']}"
    folder = os.path.exists(path)
    if not folder:
        os.mkdir(path)

自动创建了以英雄名称命名的文件夹后,下一步就是要把每个英雄的访问地址拿到,然后获取其皮肤图片。

3.获取单个英雄URL并放进队列中

访问英雄页面时又出现了一开始的数据不全问题,还是老样子从Network中找到真实的请求地址,以第一个英雄《黑暗之女-安妮》为例,其真实请求地址如下:

https://game.gtimg.cn/images/lol/act/img/js/hero/1.js

如果你以为1是序号,按顺寻排下去的那就错了,这个数字1是英雄ID,刚开始是按顺序的,后面的就不是了,所以要先拿到英雄ID,然后拼接成地址。

英雄ID信息在一开始请求的英雄列表中就有,因此在请求时可以顺带把ID获取了,拼接成单个英雄的URL

为了便于多线程操作,创建了一个队列来存放这些英雄的URL

 hero_id = hero['heroId']
            hero_url = hero_base_url + hero_id + '.js'
            print(hero_url)
            self.urls_queue.put(hero_url)

4.访问单个英雄网页获取皮肤下载地址

接下来只需要从队列中拿URL去请求,获取到皮肤下载链接即可,通过对请求返回结果分析,可以看到结果有很多个,需要去手动进行筛选
在这里插入图片描述
仔细观察一下,发现每个皮肤信息中有好几个链接,有的一个链接也没有,那么一个个链接点进去看,发现只有‘mainImg’对应的URL才是真正的皮肤链接,所以就获取这个链接即可,通过关键词[.jpg]去mainImg中查找有没

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值