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多线程下载英雄联盟所有英雄皮肤相关推荐

  1. Python多线程下载网络URL图片的方法

    Python多线程下载网络URL图片的方法 采用多线程的方法,通过URL地址,下载资源图片 GitHub地址:https://github.com/PanJinquan/python-learning ...

  2. python多线程下载小姐姐图片

    python多线程下载小姐姐图片 闲谈 思路 实现过程 单线程实现代码功能 问题描述 多线程处理办法 完成效果 闲谈 今日闲来无事,翻看博客,看到一篇关于python自动下载图片的文章,就萌生了也写一 ...

  3. 英雄联盟:英雄台词翻译(我用双手成就你的梦想。)

    英雄联盟:英雄台词翻译(我用双手成就你的梦想.) 一.总结 一句话总结:李青:Your will,my hands. Your will my hands 1.一点寒芒先到,然后枪出如龙!? 德邦: ...

  4. python多线程下载大文件_Python threading多线程断点下载文件的方法

    这是玩蛇网一篇关于Python多线程下载文件方法的代码实例.文中应用到的python模块和方法有httplib.Python urllib2.Python threading多线程模块.python ...

  5. Python 多线程下载图片

    多线程下载图片 参考链接: Python标准库-urllib和urllib3 urllib实战2–urllib基础urlretrieve().urlcleanup().info().getcode() ...

  6. 【Python爬虫系列教程 18-100】Python网络爬虫实战:小姐姐手把手教你爬取并下载英雄联盟所有英雄皮肤高清大图

    文章目录 前言 一.分析页面 二.分析第二个页面 三.代码 四.下载结果 前言 上次教你怎么爬取王者荣耀,今天小姐姐教你使用几十行代码下载英雄联盟所有皮肤,你看我下载的九尾妖狐.

  7. python游戏辅助lol_Python爬虫实战,60行代码爬取英雄联盟全英雄全皮肤,找寻曾今那些被删除的绝版皮肤...

    学了一周多的爬虫课后终于按捺不住了,小编决定自己手动编写爬虫程序,刚好LJ在鼓励学员分享成果,优秀作品有奖励,就把自己用Python编程爬取各大游戏高清壁纸的过程整理了出来进行投稿,与大家一起分享. ...

  8. 教你用Python爬取由JavaScript产生的动态网页(以英雄联盟所有英雄的皮肤海报为例)

    常规开头:有一段时间没有写博客了,今天终于有时间来写一篇关于Python爬虫的博客.刚接触Python,我也是边学边写,如若有不对的地方也请大牛在下方留言赐教.来自神秘的作者的温馨提示:此篇文章适合一 ...

  9. Python爬取英雄联盟所有英雄皮肤

    一.得到所有英雄信息 通过查询英雄联盟首页上的英雄信息全英雄地址,发现所有英雄信息是存放在一个js下的json文件,文件地址所有英雄json 通过格式化此json文件,我们可以得到如下信息 通过分析得 ...

最新文章

  1. 哈啰程序员吐槽:试用期带5个人创造了部门历史最高成绩,结果却被辞退
  2. Oracle-No.04 Oracle视图加主键解决hibernate复合主键问题
  3. 传智学员信息登记表html代码_IT兄弟连 HTML5教程 HTML5文字版面和编辑标签 使用HTML表格...
  4. SAP Spartacus 如何重定义登录 Login Component
  5. 对程序实施精准手术!阿里安全猎户座实验室首创“自动逆向机器人”
  6. qt绘制一圈圆_Qt绘制圆
  7. 尚学堂科技_马士兵_设计模式
  8. Facebook 数据的横向扩展
  9. mysql系列:登陆和退出
  10. BZOJ.3489.A simple rmq problem(主席树 Heap)
  11. 深度学习优化算法大全系列7:NAdam,算法选择,调参
  12. python读conf配置文件完成登录_python conf配置文件
  13. nginx reload报错 ---nginx: [alert] kill(1668, 1) failed (3: No such process)
  14. PCIE协议免费分享
  15. Mac After Effects安装BodyMovin说明文档
  16. Springboot配置文件
  17. 揭示:为什么别人的超级浏览器防关联有效
  18. Windows下的发包工具推荐[Colasoft Packet Builder]含使用教程
  19. 安装docker提示“Another app is currently holding the yum lock; waiting for it to exit“之解决办法
  20. 让家长巧限孩子玩网络游戏、看网络电影

热门文章

  1. 小米air新电脑嵌入式开发环境搭建
  2. 使用LaTeX打造一个简历模板
  3. LeetCode解析------855.考场就座
  4. 疯狂动物城中英文字幕文本
  5. 人月神话札记:整体部分
  6. pygame实现百变魔方
  7. 亚马逊运营产品关键词确定的方法
  8. 计算机二级证书对审计应聘有什么帮助,计算机二级证书有什么用 含金量高吗...
  9. 【学习笔记10】JavaScript三元运算符和比较运算符
  10. 关于电压环误差放大器的认识