草庐IT

python对王者荣耀英雄皮肤进行图片采集~

颜狗一只 2023-10-07 原文

前言

嗨喽~大家好呀,这里是魔王呐

环境使用:

  • Python 3.8

  • Pycharm

模块使用:

  • requests ---> 数据请求模块 需要安装 pip install requests

  • re 正则表达式 内置模块 不需要安装

  • os 文件操作模块 内置模块 不需要安装 --> 自动创建文件夹 把每个英雄都自动创建对应文件

基本套路

一. 数据来源分析

  1. 确定需求, 确定采集目标

  2. 通过开发者工具抓包分析, 分析我们想要数据内容来自于那个url地址

  • F12 或者 鼠标右键点击检查 选择 network(网络) 刷新网页

  • 去分析图片url地址是什么 ---> 选择 Img 可以查找图片url地址

505 表示英雄ID

2 皮肤第几个 ---> 通过皮肤名字对应他的皮肤链接

想要获取 yao 皮肤数据

  1. 向网址发送请求
  2. 获取response响应数据
  3. 提取皮肤名字
  4. 构建 皮肤 url地址
  5. 保存数据

二. 代码实现步骤

  1. 发送请求, 模拟浏览器对于url地址发送请求
  2. 获取数据, 获取服务器返回响应数据
  3. 解析数据, 提取我们想要内容, 皮肤名字
  4. 保存数据, 数据保存本地

代码

# 导入数据请求模块  ---> 第三方模块 需要 在cmd里面进行安装 pip install requests
import requests
# 导入正则模块  ---> 内置模块 不需要安装
import re
# 导入文件操作模块  ---> 内置模块 不需要安装
import os

# 确定网址
link = 'https://pvp.qq.com/web201605/js/herolist.json'
# 模拟伪装浏览器 ---> 请求头
headers = {
    # user-agent 用户代理 表示浏览器基本身份标识
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 发送请求
json_data = requests.get(url=link, headers=headers).json()
# for循环遍历
for index in json_data:
    # 字典键值对取值 根据冒号左边的内容[键],提取冒号右边的内容[值]
    hero_id = index['ename']
    hero_name = index['cname']
    # 设定文件夹路径 相对路径
    file = f'img\\{hero_name}\\'
    if not os.path.exists(file):
        os.makedirs(file)
    """
    1. 发送请求, 模拟浏览器对于url地址发送请求
        - headers 字典数据类型, 构建完整键值对
        - 请求头参数 可以直接在开发者工具复制粘贴
        - 使用什么请求方法, 根据开发者工具来
    """
    # 确定请求url地址
    url = f'https://pvp.qq.com/web201605/herodetail/{hero_id}.shtml'
    # 模拟伪装浏览器 ---> 请求头
    headers = {
        # user-agent 用户代理 表示浏览器基本身份标识
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
    }
    # 发送请求 ---> <Response [200]> 响应对象: <>表示对象 response 响应回复 200 状态码 表示请求成功
    response = requests.get(url=url, headers=headers)
    # 乱码了 怎么办? ---> 你要根据网页编码来 response.encoding = 'gbk'
    # 自动识别编码
    response.encoding = response.apparent_encoding
    # 获取数据, 获取服务器返回响应数据 文本数据 print(response.text)
    """
    解析数据 re正则  会1 不会2
        re.findall()  从什么地方 去找什么数据
        从 response.text 里面 去找 data-imgname="(.*?)"> 其中 (.*?) 就是我们要的数据
    """
    title_list = re.findall('data-imgname="(.*?)">', response.text)[0]
    # 鹿灵守心&0|森&0|遇见神鹿&71|时之祈愿&94|时之愿境&42
    title_list = re.sub('&\d+', '', title_list).split('|')
    print(title_list)
    # for循环 for num in range(1, 6): len() 统计列表元素个数
    for num in range(1, len(title_list) +1):
        # 列表取值, 根据索引位置,索引位置从0开始计数
        img_name = title_list[num-1]
        # 构建图片url地址
        img_url = f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{hero_id}/{hero_id}-bigskin-{num}.jpg'
        print(img_name, img_url)
        # 保存数据 ---> 发送请求 获取数据 二进制数据
        img_content = requests.get(url=img_url, headers=headers).content
        with open(file + img_name + '.jpg', mode='wb') as f:
            f.write(img_content)

有关python对王者荣耀英雄皮肤进行图片采集~的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  4. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  5. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  6. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  7. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  8. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  9. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  10. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

随机推荐