Python多线程下载英雄联盟所有英雄皮肤
Python多线程爬取英雄联盟所有英雄皮肤
- 一、选择目标
- 二、网站分析
- 1.访问网页
- 2.获取所有英雄名称并创建对应的文件夹
- 3.获取单个英雄URL并放进队列中
- 4.访问单个英雄网页获取皮肤下载地址
- 5.完整代码
- 6.结果展示
- 总结
土木工程在校学生一枚,对编程没什么了解,之前唯一接触过的编程类软件是Matlab,然而鼎鼎有名的科研大杀器在我手中却沦落成了计算器。
上周从导师那里了解到了python这个软件,感觉挺酷炫,再一查资料,莫名自信了起来,撸起袖子准备大干一场,各种百度google后才明白一个道理,纸上得来终觉浅,绝知此事要躬行!
一、选择目标
看了一些书籍的案例,不是很感兴趣,看的也是一头雾水,思前想后还是决定对英雄联盟这个网站下手,爬取所有英雄的皮肤图片。
二、网站分析
1.访问网页
英雄列表url:https://lol.qq.com/data/info-heros.shtml
F12一开,源代码好像很简单,非常清晰规律,直接开干!!!
requests请求后一番操作后我开始意识到不对劲,get请求获得的结果和网页源代码不一样,少了亿点内容???
import requestsHEADERS = {"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中查找有没有链接
具体的代码如下:
res = requests.get(self.urls_queue.get()).content.decode('gbk')text = json.loads(res)skins = text['skins']for skin in skins:if '.jpg' in skin['mainImg']:skin_url = requests.get(skin['mainImg']).contentif '[/:*?"<>|·]' in skin['name'] or skin['heroTitle']:skin['name'] = re.sub('[/:*?"<>|·]', '-', skin['name'])skin['heroTitle'] = re.sub('[/:*?"<>|·]', '', skin['heroTitle'])file_name = f"C:/Users/xiang/Desktop/LOL/{skin['heroName'] + skin['heroTitle']}/" + skin['name'] + '.jpg 'if os.path.exists(file_name):print(skin['heroName'] + skin['heroTitle'] + '的皮肤:' + skin['name'] + '已存在')passelse:with open(file_name, 'wb') as f:f.write(skin_url)print('正在下载' + skin['heroName'] + skin['heroTitle'] + '的皮肤:' + skin['name'])
5.完整代码
import requests
import threading
from queue import Queue
import json
import os
import re
import timeclass Producer(threading.Thread):def __init__(self, url_queue, *args, **kwargs):super(Producer, self).__init__(*args, **kwargs)self.target_url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'self.urls_queue = url_queuedef run(self):res = requests.get(self.target_url).content.decode('gbk') # 访问英雄列表,获取所有英雄名字和IDtext = json.loads(res)hero_info = text['hero']hero_base_url = f'https://game.gtimg.cn/images/lol/act/img/js/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)else:passhero_id = hero['heroId'] # 获取到英雄IDhero_url = hero_base_url + hero_id + '.js' # 拼接单个英雄访问链接print(hero_url)self.urls_queue.put(hero_url) # 将链接存储到队列中class Consumer(threading.Thread):def __init__(self, url_queue, *args, **kwargs):super(Consumer, self).__init__(*args, **kwargs)self.urls_queue = url_queuedef run(self):time.sleep(1) # 好像不停1s也可以,但是我在多次调试运行时发现会报403错误while True:if self.urls_queue.empty(): # 当队列中没有链接了就停止循环breakres = requests.get(self.urls_queue.get()).content.decode('gbk')text = json.loads(res)skins = text['skins']for skin in skins:if '.jpg' in skin['mainImg']: # 通过.jpg关键词来筛选mainIMG中有没有链接存在,不要用None来判断,有一些mainIMG下虽然是没东西,但有空格存在,会报错skin_url = requests.get(skin['mainImg']).contentif '[/:*?"<>|·]' in skin['name'] or skin['heroTitle']: # 这里是把一些皮肤名字中的特殊字符去掉,防止命名错误skin['name'] = re.sub('[/:*?"<>|·]', '-', skin['name'])skin['heroTitle'] = re.sub('[/:*?"<>|·]', '', skin['heroTitle'])file_name = f"C:/Users/xiang/Desktop/LOL/{skin['heroName'] + skin['heroTitle']}/" + skin['name'] + '.jpg 'if os.path.exists(file_name):print(skin['heroName'] + skin['heroTitle'] + '的皮肤:' + skin['name'] + '已存在')passelse:with open(file_name, 'wb') as f:f.write(skin_url)print('正在下载' + skin['heroName'] + skin['heroTitle'] + '的皮肤:' + skin['name'])if __name__ == '__main__':urls_queue = Queue(200)for i in range(1): t = Producer(urls_queue) # 我发现这个地方用多线程会报错,而且队列中有很多重复的链接,应该是要加锁,但是我没学会,只能用1个线程了t.start()for i in range(5):t = Consumer(urls_queue)t.start()
6.结果展示
总结
学习最重要的还是实践,只有独立思考,独立操作了才知道会遇到什么问题!
这个小案例花了我差不多一周的时间,遇到问题基本上就是各种百度、google、贴吧、论坛到处找答案,虽然是做出来了,感觉还是有很多问题存在,仅供参考,欢迎指正!
Python多线程下载英雄联盟所有英雄皮肤相关推荐
- Python多线程下载网络URL图片的方法
Python多线程下载网络URL图片的方法 采用多线程的方法,通过URL地址,下载资源图片 GitHub地址:https://github.com/PanJinquan/python-learning ...
- python多线程下载小姐姐图片
python多线程下载小姐姐图片 闲谈 思路 实现过程 单线程实现代码功能 问题描述 多线程处理办法 完成效果 闲谈 今日闲来无事,翻看博客,看到一篇关于python自动下载图片的文章,就萌生了也写一 ...
- 英雄联盟:英雄台词翻译(我用双手成就你的梦想。)
英雄联盟:英雄台词翻译(我用双手成就你的梦想.) 一.总结 一句话总结:李青:Your will,my hands. Your will my hands 1.一点寒芒先到,然后枪出如龙!? 德邦: ...
- python多线程下载大文件_Python threading多线程断点下载文件的方法
这是玩蛇网一篇关于Python多线程下载文件方法的代码实例.文中应用到的python模块和方法有httplib.Python urllib2.Python threading多线程模块.python ...
- Python 多线程下载图片
多线程下载图片 参考链接: Python标准库-urllib和urllib3 urllib实战2–urllib基础urlretrieve().urlcleanup().info().getcode() ...
- 【Python爬虫系列教程 18-100】Python网络爬虫实战:小姐姐手把手教你爬取并下载英雄联盟所有英雄皮肤高清大图
文章目录 前言 一.分析页面 二.分析第二个页面 三.代码 四.下载结果 前言 上次教你怎么爬取王者荣耀,今天小姐姐教你使用几十行代码下载英雄联盟所有皮肤,你看我下载的九尾妖狐.
- python游戏辅助lol_Python爬虫实战,60行代码爬取英雄联盟全英雄全皮肤,找寻曾今那些被删除的绝版皮肤...
学了一周多的爬虫课后终于按捺不住了,小编决定自己手动编写爬虫程序,刚好LJ在鼓励学员分享成果,优秀作品有奖励,就把自己用Python编程爬取各大游戏高清壁纸的过程整理了出来进行投稿,与大家一起分享. ...
- 教你用Python爬取由JavaScript产生的动态网页(以英雄联盟所有英雄的皮肤海报为例)
常规开头:有一段时间没有写博客了,今天终于有时间来写一篇关于Python爬虫的博客.刚接触Python,我也是边学边写,如若有不对的地方也请大牛在下方留言赐教.来自神秘的作者的温馨提示:此篇文章适合一 ...
- Python爬取英雄联盟所有英雄皮肤
一.得到所有英雄信息 通过查询英雄联盟首页上的英雄信息全英雄地址,发现所有英雄信息是存放在一个js下的json文件,文件地址所有英雄json 通过格式化此json文件,我们可以得到如下信息 通过分析得 ...
最新文章
- 哈啰程序员吐槽:试用期带5个人创造了部门历史最高成绩,结果却被辞退
- Oracle-No.04 Oracle视图加主键解决hibernate复合主键问题
- 传智学员信息登记表html代码_IT兄弟连 HTML5教程 HTML5文字版面和编辑标签 使用HTML表格...
- SAP Spartacus 如何重定义登录 Login Component
- 对程序实施精准手术!阿里安全猎户座实验室首创“自动逆向机器人”
- qt绘制一圈圆_Qt绘制圆
- 尚学堂科技_马士兵_设计模式
- Facebook 数据的横向扩展
- mysql系列:登陆和退出
- BZOJ.3489.A simple rmq problem(主席树 Heap)
- 深度学习优化算法大全系列7:NAdam,算法选择,调参
- python读conf配置文件完成登录_python conf配置文件
- nginx reload报错 ---nginx: [alert] kill(1668, 1) failed (3: No such process)
- PCIE协议免费分享
- Mac After Effects安装BodyMovin说明文档
- Springboot配置文件
- 揭示:为什么别人的超级浏览器防关联有效
- Windows下的发包工具推荐[Colasoft Packet Builder]含使用教程
- 安装docker提示“Another app is currently holding the yum lock; waiting for it to exit“之解决办法
- 让家长巧限孩子玩网络游戏、看网络电影