【python+selenium】LOL全英雄全皮肤爬虫--给电脑每天换张壁纸

这篇具有很好参考价值的文章主要介绍了【python+selenium】LOL全英雄全皮肤爬虫--给电脑每天换张壁纸。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

1.1 需求来源

很多英雄联盟的元老级玩家都认可 LOL 的美工做得很好,不乏玩家将英雄的皮肤设为手机、电脑的壁纸或个人社交账号的头像。
作为 LOL 发烧友,如果想每天换一张电脑壁纸,该如何爬取 LOL 全英雄的全部皮肤呢?由于皮肤数量过多,最好能按英雄名分文件夹存储,找起来也比较方便。

1.2 准备工作

python:3.11.3(≥3.7)
selenium 库:4.9.1
Firefox 浏览器:114.0.2 (64 位)
geckodriver:geckodriver-v0.33.0-win64.zip
如何安装 geckodriver?

1.3 思路解析

LOL 英雄界面上有全部英雄的信息,点击头像图片,可以进入个英雄主页,点击主页下的一排小图标,可以切换不同的皮肤,右键皮肤可以查看高清皮肤的下载链接。
其中,英雄主页可以由英雄的 id (后端设定)来映射;高清皮肤的链接跟小图的链接可以互相转换。

1.4 算法流程设计

  1). 从 LOL 英雄界面获取每个英雄的全名和 id
  2). 遍历全部英雄,对每个英雄:
  ① 根据全称创建文件夹
  ② 根据 id 定位到主页面
  ③ 获取全部皮肤小图标的链接
  ④ 将小图标链接转化为高清皮肤链接
  ⑤ 将高清皮肤保存到该英雄的文件夹中

1.5 算法实现方案

  1). 使用列表保存数据用于遍历
  2). 使用 webdriver(geckodriver)获取网页信息、定位元素、下载资源
  3). 使用 try-except 处理异常情景
  4). 使用 time.sleep 反爬
  5). 使用 str.replace 替换 “K//DA” 中特殊字符

二、代码解析

2.1 获取全部英雄姓名、id

【python+selenium】LOL全英雄全皮肤爬虫--给电脑每天换张壁纸,Python趣味应用,python,selenium,爬虫,自动化
使用 “imgtextlist” 类定位到全部英雄的元素块,再获取所有 “li” 标签的信息,存入列表中等待进一步解析。

# 获取全部英雄概览信息
def getHeros(driver):
    # 英雄联盟英雄信息前置界面
    driver.get('https://lol.qq.com/data/info-heros.shtml')
    # 获取全部英雄的信息概览
    heros_res = driver.find_element(By.CLASS_NAME, "imgtextlist")
    # 获取每个英雄信息的列表
    heros = heros_res.find_elements(By.TAG_NAME, "li")
    return heros

【python+selenium】LOL全英雄全皮肤爬虫--给电脑每天换张壁纸,Python趣味应用,python,selenium,爬虫,自动化
进一步解析可以获得英雄的全称和 id ,这里使用两个函数分别返还结果:

# 获取英雄名称,用于单独建立文件夹存储
def getHerosName(heros):
    hero_name = []  # 记录英雄全名,如“德邦总管 赵信”
    for h in heros:
        hero_name.append(h.find_element(By.TAG_NAME, "a").get_attribute("title"))  # 获取英雄全名
    print("hero_name:", hero_name)
    return hero_name
# 获取英雄排名id,用于后续获取皮肤图片等
def getHerosId(heros):
    hero_id = []  # 记录英雄的排名id
    for h in heros:
        hero_href = h.find_element(By.TAG_NAME, "a").get_attribute("href")  # 获取英雄个人链接
        hero_id.append(hero_href.split('=')[1])  # 获取英雄的排名id
    return hero_id

注意:获取id是很重要的,因为id并不是和英雄的推出顺序是一致的,如新英雄明烛的id是902,而LOL显然没有那么多英雄。获取皮肤是必须要有英雄id的。(不知道这是不是官方刻意设置的一种反爬机制?)也可以直接保存英雄的跳转链接进行跳转

2.2 遍历全部英雄

    total_num = len(hero_name)
    for i in range(total_num):

2.2.1 创建各英雄的文件夹

# 为每一个英雄单独创建文件夹,来保存皮肤
def createPath(name):
    global savePath
    filepath = f"{savePath}{name}\\"  # 为每一个英雄单独创建一个路径,以其全名命名
    if not os.path.exists(filepath):
        os.makedirs(filepath)
        print(filepath + "文件夹创建成功!")

2.2.2 根据 id 定位到主页面

根据 id 跳转到英雄主界面:

url = "https://lol.qq.com/data/info-defail.shtml?id=" + str(n)  # 根据 id 可以获取英雄的个人链接

【python+selenium】LOL全英雄全皮肤爬虫--给电脑每天换张壁纸,Python趣味应用,python,selenium,爬虫,自动化
进而可以定位到小图标及其链接:

driver.get(url)
skins_res = driver.find_element(By.ID, "skinNAV")  # 定位到皮肤栏
skins = skins_res.find_elements(By.TAG_NAME, "img")  # 获取小图标的列表
for skin in skins:
    skin_name = skin.get_attribute("alt")
    skin_link_small = skin.get_attribute("src")  # 获取每个小图的链接
    # https://game.gtimg.cn/images/lol/act/img/skin/small_0b940af1-bd04-4f9a-a909-427cabea21b1.jpg

2.2.3 转换小图标链接为高清图链接

小图标的链接为:
https://game.gtimg.cn/images/lol/act/img/skin/small_0b940af1-bd04-4f9a-a909-427cabea21b1.jpg
高清图的链接为:
https://game.gtimg.cn/images/lol/act/img/skin/big_0b940af1-bd04-4f9a-a909-427cabea21b1.jpg

通过简单的字符串替换即可实现:

skin_link_big = str(skin_link_small).replace("small", "big")  # 替换为大图的链接
# https://game.gtimg.cn/images/lol/act/img/skin/big_0b940af1-bd04-4f9a-a909-427cabea21b1.jpg

2.2.4 保存高清皮肤图片

给图片确定存储路径时,要考虑 “K/DA” 字符串的影响,替换掉 “/” 为 “” 避免识别为路径而报错:

filename = f"{savePath}{hero_name[i]}\\{str(skin_name).replace('/', '')}.jpg"  # 防止 K/DA 下载出错

之后就可以开始下载了:

try:
    urlretrieve(skin_link_big, filename=filename)
except urllib.error.ContentTooShortError:
    driver.sleep(5)
    urlretrieve(skin_link_big, filename=filename)
except:
    print("未知错误!")
print(skin_name + "图片下载完成!")  # 输出提示:英雄的该个皮肤图片下载完成

三、运行截图

运行过程中打印提示数据:
【python+selenium】LOL全英雄全皮肤爬虫--给电脑每天换张壁纸,Python趣味应用,python,selenium,爬虫,自动化
文件夹中查看保存皮肤:
【python+selenium】LOL全英雄全皮肤爬虫--给电脑每天换张壁纸,Python趣味应用,python,selenium,爬虫,自动化
【python+selenium】LOL全英雄全皮肤爬虫--给电脑每天换张壁纸,Python趣味应用,python,selenium,爬虫,自动化文章来源地址https://www.toymoban.com/news/detail-613748.html

四、完整代码

import os
import time
import urllib
from selenium import webdriver
from urllib.request import urlretrieve
from selenium.webdriver.common.by import By

# 模拟请求头
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/" \
             "605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15"
# 配置 webdriver
opt = webdriver.FirefoxOptions()
opt.add_argument('--user-agent=%s' % user_agent)


# opt.add_argument("--headless")      # 开启此选项,浏览器不会显示动作


# 获取全部英雄概览信息
def getHeros(driver):
    # 英雄联盟英雄信息前置界面
    driver.get('https://lol.qq.com/data/info-heros.shtml')
    # 获取全部英雄的信息概览
    heros_res = driver.find_element(By.CLASS_NAME, "imgtextlist")
    # 获取每个英雄信息的列表
    heros = heros_res.find_elements(By.TAG_NAME, "li")
    return heros


# 获取英雄名称,用于单独建立文件夹存储
def getHerosName(heros):
    hero_name = []  # 记录英雄全名,如“德邦总管 赵信”
    for h in heros:
        hero_name.append(h.find_element(By.TAG_NAME, "a").get_attribute("title"))  # 获取英雄全名
    print("hero_name:", hero_name)
    return hero_name


# 获取英雄排名id,用于后续获取皮肤图片等
def getHerosId(heros):
    hero_id = []  # 记录英雄的排名id
    for h in heros:
        hero_href = h.find_element(By.TAG_NAME, "a").get_attribute("href")  # 获取英雄个人链接
        hero_id.append(hero_href.split('=')[1])  # 获取英雄的排名id
    return hero_id


# 为每一个英雄单独创建文件夹,来保存皮肤
def createPath(name):
    global savePath
    filepath = f"{savePath}{name}\\"  # 为每一个英雄单独创建一个路径,以其全名命名
    if not os.path.exists(filepath):
        os.makedirs(filepath)
        print(filepath + "文件夹创建成功!")


# 获取英雄皮肤,规避反爬机制,并进行异常处理
def getAndSaveSkins(driver, hero_name, hero_id):
    global savePath
    # 遍历全部英雄
    total_num = len(hero_name)
    for i in range(total_num):
        createPath(hero_name[i])    # 为每个英雄单独开辟一个文件夹
        n = hero_id[i]  # 提取英雄对应的id。注意:id 和 name 列表顺序并不是一一对应的,因此有必要单独获取
        driver.implicitly_wait(10)
        url = "https://lol.qq.com/data/info-defail.shtml?id=" + str(n)  # 根据 id 可以获取英雄的个人链接
        driver.get(url)
        skins_res = driver.find_element(By.ID, "skinNAV")  # 定位到皮肤栏
        skins = skins_res.find_elements(By.TAG_NAME, "img")  # 获取小图标的列表

        for skin in skins:
            skin_name = skin.get_attribute("alt")
            skin_link_small = skin.get_attribute("src")  # 获取每个小图的链接
            # https://game.gtimg.cn/images/lol/act/img/skin/small_0b940af1-bd04-4f9a-a909-427cabea21b1.jpg
            skin_link_big = str(skin_link_small).replace("small", "big")  # 替换为大图的链接
            # https://game.gtimg.cn/images/lol/act/img/skin/big_0b940af1-bd04-4f9a-a909-427cabea21b1.jpg

            filename = f"{savePath}{hero_name[i]}\\{str(skin_name).replace('/', '')}.jpg"  # 防止 K/DA 下载出错
            try:
                urlretrieve(skin_link_big, filename=filename)
            except urllib.error.ContentTooShortError:
                driver.sleep(5)
                urlretrieve(skin_link_big, filename=filename)
            except:
                print("未知错误!")
            print(skin_name + "图片下载完成!")  # 输出提示:英雄的该个皮肤图片下载完成
        print("************" + hero_name[i] + "全部图片下载完毕!************\n")  # 输出提示:该英雄的全部高清皮肤下载完成
        # time.sleep(2)   # 设置时间间隔,规避反爬机制


if __name__ == "__main__":
    savePath = "D:\\lolSkins\\"
    driver = webdriver.Firefox(options=opt)  # 启动 webdriver
    # 如果 driver 文件没有放在系统路径下,可以指定文件路径,也可以不带“.exe”
    # driver = webdriver.Firefox(executable_path='D:/driver/geckodriver.exe', options=opt)
    # 新版 selenium 推荐使用 service 写法。个人推荐第一种,把 webdriver 放在系统路径下
    # service = Service(executable_path=executable_path='D:/driver/geckodriver.exe')
    # driver = webdriver.Firefox(service=service,options=opt)
    driver.implicitly_wait(10)  # 设置界面等待的最长时间
    heros = getHeros(driver)  # 获取英雄信息概览
    hero_name = getHerosName(heros)  # 获取英雄名,用于存储皮肤
    hero_id = getHerosId(heros)  # 获取英雄id,用于爬取皮肤
    getAndSaveSkins(driver, hero_name, hero_id)  # 获取皮肤并保存到对应的文件夹中

PS:请勿将此方法用于商业行为,在法律准许的范围内合理使用互联网资源!更多 python 有趣应用,敬请关注后续更新~

到了这里,关于【python+selenium】LOL全英雄全皮肤爬虫--给电脑每天换张壁纸的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫之用Selenium做爬虫

    我们在用python做爬虫的时候,除了直接用requests的架构,还有Scrapy、Selenium等方式可以使用,那么今天我们就来聊一聊使用Selenium如何实现爬虫。 Selenium是什么? Selenium是一个浏览器自动化测试框架,是一款用于Web应用程序测试的工具。框架底层使用JavaScript模拟真实用户对浏览

    2024年02月13日
    浏览(38)
  • Python爬虫基础之Selenium详解_python selenium

    from selenium import webdriver from selenium.webdriver.common.by import By browser= webdriver.Chrome() url = ‘https://www.baidu.com’ browser.get(url) button = browser.find_element(By.ID, ‘su’) print(button) button = browser.find_element(By.NAME, ‘wd’) print(button) button = browser.find_element(By.XPATH, ‘//input[@id=“su”]’) print(button)

    2024年04月15日
    浏览(53)
  • 【Python爬虫与数据分析】爬虫selenium工具

    目录 一、selenium工具安装 二、selenium打开浏览器测试 三、无头浏览器 四、元素定位 五、页面滑动 六、按键、填写登录表单 七、页面切换 八、实战爬取当当网书籍数据 Selenium是Web的自动化测试工具,为网站自动化测试而开发,Selenium可以直接运行在浏览器上,它支持所有主

    2024年02月15日
    浏览(50)
  • python spider 爬虫 之 Selenium 系列 (-) Selenium

    京东的 seckill 秒杀 专区 用 urllib 是获取不到的 回顾一下urllib 爬虫 Selenium Selenium定义 Selenium是一个用于Web应用程序测试的工具 Selenium测试 直接 运行在浏览器中,就像真实的用户在操作一样 支持通过各种driver ( FireFoxDriver, InternetExplorerDriver、OperaDriver、ChromeDriver)驱动真实浏

    2024年02月16日
    浏览(37)
  • python 配置 selenium爬虫

    这两天学习Python爬虫,记录一下这个折磨我一两个小时的配置。 值得注意的是,下载的chromedriver.exe文件必须放在和运行的.py文件同一目录下,否则就会报错: selenium.common.exceptions.WebDriverException: Message: ‘chromedriver’ executable needs to be in PATH. Please see https://chromedriver.chromium.or

    2024年02月03日
    浏览(40)
  • python爬虫-Selenium

    Selenium是一个用于Web应用程序测试的工具,Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。模拟浏览器功能,自动执行网页中的js代码,实现动态加载。 打开谷歌浏览器--右上角三个点--帮助--关于 下载地址:http://chromedriver.storage.googleapis.com/index.html 找到对应浏

    2024年02月09日
    浏览(39)
  • python爬虫——selenium

    目录 一、背景​编辑 1.1、selenium的发展 1.2、在爬虫中的应用 1.3selenium执行原理图 1.4、WebDriver,与WebElement 二、准备​编辑 2.1、下载驱动 2.2、安装Selenium库 2.3、简单使用 三、实用操作​编辑 3.1、查找节点 3.1.1、查找元素在网页中的位置(网址为www.baidu.com,代码中的注释很详

    2024年02月09日
    浏览(40)
  • python爬虫(selenium)

    目录 准备 体验示例 创建浏览器驱动对象 访问页面 查找节点 节点交互 切换Frame 延时等待 前进和后退 Cookies 选项卡管理 准备 (1)浏览器驱动 :http://chromedriver.storage.googleapis.com/index.html (2)selenium第三方库 :pip install selenium 注意: 浏览器驱动需要根据自身浏览器版本去下

    2024年02月03日
    浏览(42)
  • python selenium 爬虫教程

    Python和Selenium是很强大的爬虫工具,可以用于自动化地模拟浏览器行为,从网页中提取数据。下面是一个简单的使用Python和Selenium进行爬虫的案例。 1. 安装和配置: 首先,你需要安装Python和Selenium。可以使用pip命令来安装Selenium库: pip install selenium 。 然后,你还需要下载对应

    2024年02月09日
    浏览(86)
  • 程序员为什么不喜欢关电脑?揭秘背后的原因与“英雄”本色

    在许多人眼中,程序员似乎总是与电脑形影不离,甚至深夜时分,他们的电脑屏幕也依旧亮着。那么,为什么程序员们似乎从不喜欢关电脑呢?今天,就让我们一起走进程序员的世界,揭秘这背后的原因,看看他们真正的“英雄”本色! 在程序员的日常工作中,保持流畅且不

    2024年02月19日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包