英雄联盟英雄信息【python爬虫】

2023-11-19

相信大家都知道撸啊撸这个游戏了吧,小时候偷偷跑去网吧和朋友们开黑的日子,那是我们逝去的青春。
在这里插入图片描述

学了爬虫课后终于按捺不住了,决定自己手动编写爬虫程序,就把自己用Python编程爬取五黑游戏英雄壁纸和英雄信息的过程整理了出来进行投稿,与大家一起分享,爬取了当前比较火的游戏壁纸,《开黑游戏》,这里展示爬取《hero》的过程,学会了这个,自己再去爬取其他游戏壁纸也就不成问题啦。好了下面进入正题
在这里插入图片描述

先看一下最终的效果,每个英雄的壁纸(包括炫彩皮肤)和想要的信息都被爬取下来了:
在这里插入图片描述

在这里插入图片描述

下面开始正式教学!

版本:Python 3.8
工具:pycharm

了解爬取对象,设计爬取流程
在使用爬虫前,先花一定时间对爬取对象进行了解,是非常有必要的,这样可以帮助我们科学合理地设计爬取流程,以避开爬取难点,节约时间。

1.1英雄基本信息

打开网址,看到游戏的信息:
在这里插入图片描述

若要爬取全部英雄,我们先要获取这些英雄的信息,在网页上“右击——检查——XHR”,就能在看到英雄的信息了,如下图所示,包括英雄昵称、英雄名称、英文名等等。由于这些信息是使用JavaScript动态加载的,普通爬取方法无法获取,我们只能用Ajax的方法来获取这些信息。
在这里插入图片描述

我们进入英雄的详情页来分析看看,我们发现进入英雄详情页后上面网址链接里的heroid会变化你把这个1换成其他数字网址会跳到其他英雄的详情页,这代表着这是英雄的ID,进入详情页会有一个ts?=2743的请求,打开后发现这是请求英雄皮肤或者英雄信息的,那么我们展开skins发现要的东西都在这里。

在这里插入图片描述

思路分析:

既然我们已经知道了hero的信息在哪里了,那么我们接下来就可以对详情页外面全部英雄header里面的这条URL发起请求获取它的json数据来个循环拿到需要英雄的信息和hero的ID再通过heroid和详情页的URL进行拼接不就可以进入详情页里面再下载皮肤或者取我们还需要的信息莫。
在这里插入图片描述

开始工作:

下面我们对网页发送请求,因为网页是动态的所以返回的是json数据
在这里插入图片描述
请求成功之后我们就进入到hero,循环列表就能提取我们所需要的信息了,这里我提取了英雄的名称,英雄的id,英雄的价格,英雄的选择声效,这里说一下英雄的ID后面要用到。
在这里插入图片描述

有了英雄id之后,接下来我们就可以进入到英雄详情页拿这个请求里面的URL和英雄的id进行拼接 然后发送请求进入详情页提取我们的皮肤链接和英雄的其他信息等…
在这里插入图片描述

拼接URL后就发起一个请求遍历提取英雄的皮肤,这里创建了一个item字典来储存我们获取下来的hero信息,另一个itemt字典来储存我们获取下来的英雄皮肤信息最后再嵌套到列表里。

这里要注意一下

从网页英雄皮肤的数据知道想要提取炫彩的皮肤就得加个判断,只有进行判读才能把hero全部皮肤包括(炫彩皮肤)一起下载到电脑。

在这里插入图片描述

完成到这里我们就离终点差不多了,想想拥有这么多图片就心动。
在这里插入图片描述
接下来就是把数据给保存到csv里,这里我写了两个csv,一个是保存hero英雄信息的,另一个是保存hero皮肤信息,
在这里插入图片描述

最后就是把hero皮肤图片发送请求创建文件夹给下载下来
在这里插入图片描述

实现

在这里插入图片描述

**到这里就大功告成啦!只要运行一下这个程序,所有hero的皮肤壁纸就都收入囊中了,运行代码时注意保持网络畅通,如果网速太慢可能会爬取失败。

以下是全部代码:

# @Author : 王同学
import requests
import json
import csv
import os.path
import re
import threading
from fake_useragent import UserAgent


ua = UserAgent()    # 伪造头


def get_content(url):
    headers = {'user-agent': ua.random,
               'referer': 'https://101.qq.com/'}
    try:
        response = requests.get(url=url,headers=headers)
        if response.status_code == 200:
            return response.json()
    except:
        print('NOD DATA')



def get_data(response):
    hero_data = []
    skins_data = []
    n = 1
    all_hero = response["hero"]
    print(f'共有{len(all_hero)}个英雄')  # 打印一下列表长度
    for hero in all_hero:   # 遍历这个列表里面的内容
        print(f'=================================================正在获取第{n}个英雄的信息===========================================')
        hero_title = hero['name']   # 名称
        hero_id = hero['heroId']    # ID
        hero_price = hero['goldPrice']  #价格
        hero_audio = hero['selectAudio']    #声效
        n += 1

        # 详情页
        hero_diail = f'https://101.qq.com/#/hero-detail?heroid={hero_id}'
        hero_ditaill = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{hero_id}.js?'
        # 请求详情页获取皮肤内容
        new_ditail = requests.get(url=hero_ditaill).json()
        hero_shor = new_ditail['hero']['shortBio']  # 背景故事
        item = {
            '名称': hero_title,
            'id': hero_id,
            '价格': hero_price,
            '声效': hero_audio,
            '详情页': hero_diail,
            '背景故事': hero_shor
        }
        print(item)
        hero_data.append(item)
        # 获取皮肤
        all_skins = new_ditail['skins']
        for skins in all_skins:
            if skins["chromaImg"] == '':    # 判断如果为空值,则跳过空值
                skins_name = skins["name"]
                skins_Images = skins["mainImg"]
                itemt = {
                    '皮肤名字': skins_name,
                    '图片链接': skins_Images
                }
                save_images(skins_name, skins_Images)
                skins_data.append(itemt)
                continue    # 继续往下
            save_skins(skins_data)
    return hero_data

# 保存hero信息
def save_csv(hero_data):
    # 表头
    headers = ['名称','id','价格','声效','详情页','背景故事']

    with open('联盟.csv','w',encoding='utf-8',newline="")as f:
        fitl = csv.DictWriter(f,headers)
        fitl.writeheader()
        fitl.writerows(hero_data)


# 保存皮肤信息
def save_skins(skins_data):
    headers = ['皮肤名字','图片链接']

    with open('皮肤.csv','w',encoding='utf-8',newline="")as f:
        fitl = csv.DictWriter(f,headers)
        fitl.writeheader()
        fitl.writerows(skins_data)


# 保存皮肤
def save_images(skins_name,skins_Images):
    if not os.path.exists("皮肤"):
        os.mkdir("皮肤")
    bug = '[/\<>|":?]'   # 剔除特殊字符
    new_title = re.sub(bug,"",skins_name)
    images = requests.get(url=skins_Images).content
    with open("皮肤\\" + new_title + ".jpg",mode="wb")as f:
        f.write(images)
        print("正在保存图片:" + skins_name)




def main():
    url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js?'
    response = get_content(url)
    hero_data = get_data(response)
    save_csv(hero_data)


if __name__ == '__main__':
    thred = threading.Thread(target=main)
    thred.start()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

英雄联盟英雄信息【python爬虫】 的相关文章

  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • Pandas/Google BigQuery:架构不匹配导致上传失败

    我的谷歌表中的架构如下所示 price datetime DATETIME symbol STRING bid open FLOAT bid high FLOAT bid low FLOAT bid close FLOAT ask open
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • .live() 或 .livequery()

    我有一个Ajaxed的网站 Ajax的内容来自其他页面 例如about html contact html ajax 从名为 main content 的 div 获取内容 但是在 ajax 调用之后 我的其余脚本就中断了 比如tinysc
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • Numpy - 根据表示一维的坐标向量的条件替换数组中的值

    我有一个data多维数组 最后一个是距离 另一方面 我有距离向量r 例如 Data np ones 20 30 100 r np linspace 10 50 100 最后 我还有一个临界距离值列表 称为r0 使得 r0 shape Dat
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside

随机推荐

  • MATLAB算法实战应用案例精讲-【自然语言处理】语义分割模型-DeepLabV3

    目录 1 DeepLab系列简介 1 1 DeepLabV1 1 1 1创新点 1 1 2 动机 1 1 3 应对策略 1 2 DeepLabV2
  • PowerDesigner显示Comment注释

    PowerDesigner默认显示的列是Name及类型 如下图示 现在需要显示注释列 以便使得ER图更加清晰 但是PowerDesigner勾选Comment显示没有效果 所以通过以下几步来处理 双击表 弹出表属性对话框 切到Columns
  • Java安全知识share

    这里简单的介绍一下自己创建的知识星球 为什么要用知识星球呢 一方面他有APP然后方便使用里面的文章标签等功能 另一方面可能有一点点 哈哈哈 总的来说是方便使用 该知识星球包括Java相关的安全知识和其他相关的安全知识php nodejs C
  • labuladong的算法小抄pdf_真漂亮!这份GitHub上爆火的算法面试笔记,助你圆满大厂梦...

    前言 Github作为程序员们的后花园 一直以来都是程序员最喜欢逛逛 学习的地方 小编也不例外 最近看到一份对标BAT等一线大厂的算法面试笔记 已经标星68 K了 很是惊讶 看了一下 觉得知识点整理得非常的详细 也不愧能获得这么多星 资料已
  • Nginx配置及使用个人总结

    Nginx配置及使用个人总结 文章目录 Nginx配置及使用个人总结 1 前言 2 个人使用简单模板文件 3 常用nginx命令 1 前言 根据使用场景 可能会将前后端分离 一些小的工具式web分离反而麻烦 直接打成一个程序包更好 这时Li
  • jdk1.8笔记(1)-函数式接口

    文章目录 1 函数式接口 1 1 概念 1 2 格式 1 3 FunctionalInterface注解 例子 2 函数式编程 2 1 Lambda的延迟执行 2 2 使用Lambda作为参数和返回值 3 常用的函数式接口 3 1 Supp
  • C++ 嵌套类使用

    C 嵌套类 1 嵌套类的名字只在外围类可见 2 类的私有成员只有类的成员和友元可以访问 因此外围类不可以访问嵌套类的私有成员 嵌套类可以访问外围类的成员 通过对象 指针或者引用 3 一个好的嵌套类设计 嵌套类应该设成私有 嵌套类的成员和方法
  • 【云知识】云计算平台都有那些,涨涨云概念

    2023年 第36周 给自己一个目标 然后坚持总会有收货 不信你试试 云计算平台是指为企业和个人提供云计算服务的基础架构和环境 它提供了一系列的硬件 软件和网络设施 用于支持应用程序的部署 管理和运行 以及数据的存储 处理和传输 目录 一
  • vue中的修饰符作用详细讲解

    一 Vue的修饰符是什么 Vue中的修饰符分为以下五种 表单修饰符 事件修饰符 鼠标按键修饰符 键值修饰符 v bind修饰符 二 修饰符的作用 1 表单修饰符 修饰符 作用 使用 lazy 填完信息 光标离开标签的时候 才会将值赋予给va
  • 基于FFmpeg和Screen Capturer Recorder实现屏幕和声音的录制

    当我们看到一些精彩的视频画面 但无法下载时 可以通过录屏的方式将视频和音频录制下来 这个时候我们需要安装采集视频和音频的工具screen capture recorder 以下是在windows10环境下 基于FFmpeg和Screen C
  • electron-vue 树莓派armv7l打包踩坑记录

    1 unsupported arch arm 报错 Unsupported arch arm failedTask build stackTrace Error Unsupported arch arm 解决办法 在package json
  • c语言 二叉树的链式存储

    先序遍历 根左右 中序遍历 左根右 后序遍历 左右根 include
  • Kotlin和Android:JetBrains和Google落后于一种语言

    Google I O 2017 宣布了几项重要公告 但对我而言 最有趣的一个是Android上的 对Kotlin的一流支持 关于此公告的Kotlin博客文章讨论了这给Kotlin用户带来的好处 如果您担心Kotlin支持的其他平台 用于服务
  • 比较和合并实时脚本和函数

    比较和合并实时脚本和函数 实时脚本 Live Script 和函数 Function 是 MATLAB 中常用的两种代码组织形式 它们在代码编写 调试和重用方面有着不同的特点 本文将比较这两种形式 并探讨如何将实时脚本和函数合并使用 实时脚
  • html 中的正则(基础)

    正则表达式 1 什么是 正则表达式就是专门规定一个字符串中字符出现的规律的一套规则 2 何时 2大类场景 a 验证字符串格式 b 查找敏感词 如何在js中创建正则表达式 用于查找和匹配 2种 1 标准写法 a var 变量 new RegE
  • python列表中的字典怎么遍历_Python循环遍历列表中的嵌套字典或字典

    我有一些我需要处理的数据 它看起来像字典中字典中的字典 所有字典都存储在列表中 这是解析的JSON数据 所以我无法控制它的格式 以下是一些数据 我删除了很多数据 因为它不相关且简洁 devices server device base ph
  • 阿里云盘正式上架,速度25MB/s!(附下载链接+邀请码)

    今年 8 月 阿里巴巴推出了一款名为 阿里云网盘 的独立 App 定位为C端用户提供服务 网盘空间更大 下载速度更快 但之后很快这款App就下架了 也许是阿里没有准备好 在经历过几个月的完善之后现在又重新上架了 11月18日消息 阿里云网盘
  • matlab2019a中深度学习网络的训练方法(Deep Learning Toolbox系列篇7)

    在matlab2019a中 有一个trainNetwork的函数 可以直接对一个自己构建的深度学习网络模型及数据集进行训练拟合 下面讲一下具体的网络构建语法 数据集输入以及网络超参数的设定等问题 在官方的介绍文档里面 trainNetwor
  • java抽象类与接口的区别(谈谈自己的理解)

    抽象类 什么是抽象类 从名字上来讲 我觉得就是对类的一个抽象 把类 事物 抽象出来 当做模板 也就是说在有很多类的时候 我们把一些相似的类的某些方法 某些成员变量抽象出来作为一个模板 让这些类更方便的去继承 所以 在抽象类中 有抽象方法也有
  • 英雄联盟英雄信息【python爬虫】

    文章目录 下面开始正式教学 思路分析 开始工作 这里要注意一下 实现 以下是全部代码 相信大家都知道撸啊撸这个游戏了吧 小时候偷偷跑去网吧和朋友们开黑的日子 那是我们逝去的青春 学了爬虫课后终于按捺不住了 决定自己手动编写爬虫程序 就把自己