python使用selenium爬英雄联盟/王者荣耀壁纸 附源码

之前看到好多爬王者荣耀和英雄联盟壁纸的,现在有时间,自己也搞个玩玩
记录一下,也帮助一下想要学习的朋友

艾琳-女武神
阿狸-灵魂莲华

LOL壁纸

英雄联盟壁纸我只找到了这个位置的海报,清晰度不是很高,用来做壁纸有点勉强了,如果有好的位置欢迎留言
lol皮肤海报

分析

进入官网资料库之后会看到所有的英雄,打开控制台发现都是li标签组成的,每个li下面都有一个a标签,这就是详情页的链接了

打开详情页,打开控制台,找到海报所在位置
在这里插入图片描述
会发现只有一个img标签,需要点击一下第二个皮肤才会全部加载出来,也是li标签组成的,每个li下面都有一个img标签,这就是图片所在位置了
在这里插入图片描述

写代码

其中用到的包有time、os、requests、selenium,可自行安装

  1. 先创建一个文件夹,用来存放壁纸:
if not os.path.exists('./LOL壁纸'):
    os.mkdir('./LOL壁纸')
  1. 初始化webdriver,我用的是谷歌浏览器,需要下载chromedriver.exe
options = Options()
# 禁止图片和css加载
prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2}
options.add_experimental_option("prefs", prefs)
wb = webdriver.Chrome('./driver/chromedriver.exe', chrome_options=options)
wb.get('https://lol.qq.com/data/info-heros.shtml')
  1. 获取所有英雄详情页的链接,我用的是执行js方法,用js返回链接的列表:
# 找到并返回链接
js = """
    let hrefs=[];
    let a = $('#jSearchHeroDiv').find('a');
    for(var i=0;i<a.length;i++){
        hrefs.push(a[i].href)
    }
    return hrefs;
"""
# 调用js方法,同时执行javascript脚本, hrefs接收返回的列表
hrefs = wb.execute_script(js)
  1. 进入详情页,找到图片地址
# 这里使用 range 是为了后面方便计数
for i in range(len(hrefs)):
    wb.get(hrefs[i])
    # 等待全部加载完成
    time.sleep(.5)
    
    # 获取英雄名字,我也不会玩这个游戏,不知道怎么区分这两个名字,,,
    hero_name = wb.find_element_by_css_selector('#DATAtitle').text	# 安妮
    # hero_name = wb.find_element_by_css_selector('#DATAname').text	# 黑暗之女
    # 创建英雄文件夹
    if not os.path.exists('./LOL壁纸'+hero_name):
        os.mkdir('./LOL壁纸/'+hero_name)
    # 点击第二个皮肤加载全部
    wb.find_element_by_css_selector('#skinNAV > li:nth-child(2) > a').click()
    time.sleep(.2)

	# 同样使用js进行查找,但是返回的每组数据包含链接和皮肤名称
    js = """
        let imgs = [];
        let img = $('#skinBG').find('img');
        for(var i=0;i<img.length;i++){
            imgs.push({
                href: img[i].src,
                name: img[i].alt
            })
        }
        return imgs;
    """
    # 调用js方法,同时执行javascript脚本imgs接收列表
    imgs = wb.execute_script(js)
  1. 最后就是下载了,使用for循环单个下载
	headers = {
	    "Referer": "https://lol.qq.com/",
	    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
	}
    for i in range(len(imgs)):
        name = imgs[i]['name']
        # 有个皮肤名称中含有 / 符号,不可作为文件名,需要替换掉,不然会报错
        name.replace('\\', '-').replace('/', '-')
        r = requests.get(imgs[i]['href'], headers=headers)
        with open(f'./LOL壁纸/{hero_name}/{name}.jpg', 'wb') as f:
            f.write(r.content)
        # 等待0.5s,免得访问太多被墙
        time.sleep(.5)

王者荣耀壁纸

分析

王者荣耀的壁纸就比较好找了,官网就有游戏壁纸的入口,基本上都是2k壁纸

还是一样,先打开控制台,发现方块是一个div,1920x1200的链接(a标签)隐藏的很深,但是每个div的结构是相同的
还有个1920x1440,但是感觉比1920x1200视野小,所以爬1920x1200的
一共有25页壁纸,所有还需要翻页
关于名称,有好几种展示方式,一般都是 英雄名-皮肤名 ,还有 英雄名·皮肤名、没有分隔符和 英雄名—皮肤名,这里‘—’并不是壹,是符号


写代码

其中用到的包有time、os、requests、selenium、re,可自行安装

  1. 先创建一个文件夹,用来存放壁纸:
if not os.path.exists('./王者荣耀壁纸'):
    os.mkdir('./王者荣耀壁纸')
  1. 初始化webdriver,我用的是谷歌浏览器,需要下载chromedriver.exe
options = Options()
# 禁止图片和css加载
prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2}
options.add_experimental_option("prefs", prefs)
wb = webdriver.Chrome('./driver/chromedriver.exe', chrome_options=options)
wb.get('https://pvp.qq.com/web201605/wallpaper.shtml')
  1. 由于直接写明了25页,直接for25次
for k in range(25):
	# 获取此页所有div下的a标签
    hrefs = wb.find_elements_by_xpath('//*[@id="Work_List_Container_267733"]/div/ul/li[6]/a')
    for i in range(len(hrefs)):
    	# 获取图片名称
        full_name = wb.find_elements_by_xpath(f'//*[@id="Work_List_Container_267733"]/div[{i+1}]/h4/a').text
        # 对名称进行分割,分成英雄名和皮肤名
        if re.search('-', full_name):
            first_name = full_name.split('-')[0]
            last_name = full_name.split('-')[1]
        elif re.search('·', full_name):
            first_name = full_name.split('·')[0]
            last_name = full_name.split('·')[1]
        elif re.search('—', full_name):
            first_name = full_name.split('—')[0]
            last_name = full_name.split('—')[1]
        else:
            first_name = last_name = full_name
        # 创建英雄文件夹
        if not os.path.exists('./王者荣耀壁纸/' + first_name) and first_name != last_name:
            os.mkdir('./王者荣耀壁纸/' + first_name)
  1. 下载
	headers = {
	    "Referer": "https://pvp.qq.com/web201605/wallpaper.shtml###",
	    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
	}
	r = requests.get(hrefs[i].get_attribute('href'), headers=headers)
    file_dir = f'./王者荣耀壁纸/{first_name}/{last_name}.jpg' if first_name != last_name else f'./王者荣耀壁纸/{first_name}.jpg'
    with open(file_dir, 'wb') as f:
        f.write(r.content)
  1. for循环的最后还要点击下一页,加入下一个循环
wb.find_element_by_xpath('//*[@id="Page_Container_267733"]/a[13]').click()

源码

lol

"""

    Code by xian
    email: byxian7024@qq.com

"""
import time
import os
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

headers = {
    "Referer": "https://lol.qq.com/",
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
}


def main():
    options = Options()
    # 禁止图片和css加载
    prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2}
    options.add_experimental_option("prefs", prefs)

    wb = webdriver.Chrome('./driver/chromedriver.exe', chrome_options=options)
    wb.get('https://lol.qq.com/data/info-heros.shtml')
    js = """
        let hrefs=[];
        let a = $('#jSearchHeroDiv').find('a');
        for(var i=0;i<a.length;i++){
            hrefs.push(a[i].href)
        }
        return hrefs;
    """
    hrefs = wb.execute_script(js)  # 调用js方法,同时执行javascript脚本

    for i in range(len(hrefs)):
        wb.get(hrefs[i])
        time.sleep(1)
        hero_name = wb.find_element_by_css_selector('#DATAtitle').text
        if not os.path.exists('./LOL壁纸' + hero_name):
            os.mkdir('./LOL壁纸/' + hero_name)

        wb.find_element_by_css_selector('#skinNAV > li:nth-child(2) > a').click()
        time.sleep(.2)

        js = """
            let imgs = [];
            let img = $('#skinBG').find('img');
            for(var i=0;i<img.length;i++){
                imgs.push({
                    href: img[i].src,
                    name: img[i].alt
                })
            }
            return imgs;
        """
        imgs = wb.execute_script(js)  # 调用js方法,同时执行javascript脚本
        for j in range(len(imgs)):
            name = imgs[j]['name']
            name.replace('\\', '-').replace('/', '-')
            try:
                r = requests.get(imgs[j]['href'], headers=headers)
                with open(f'./LOL壁纸/{hero_name}/{name}.jpg', 'wb') as f:
                    f.write(r.content)
            except Exception as e:
                print(imgs[j], e)
            print(f"\r[{i + 1}/{len(hrefs)}||{j + 1}/{len(imgs)}]", end="")
            time.sleep(.5)


if __name__ == '__main__':
    if not os.path.exists('./LOL壁纸'):
        os.mkdir('./LOL壁纸')
    main()
    print("========================================\n\n")
    print("壁纸下载完成")
    print("\n\n========================================")

王者荣耀

"""

    Code by xian
    email: byxian7024@qq.com

"""
import re
import time
import os
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

headers = {
    "Referer": "https://pvp.qq.com/web201605/wallpaper.shtml###",
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
}


def main():
    options = Options()
    # 禁止图片和css加载
    prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2}
    options.add_experimental_option("prefs", prefs)
    wb = webdriver.Chrome('./driver/chromedriver.exe', chrome_options=options)
    wb.get('https://pvp.qq.com/web201605/wallpaper.shtml')
    time.sleep(1)
    for k in range(25):
        hrefs = wb.find_elements_by_xpath('//*[@id="Work_List_Container_267733"]/div/ul/li[6]/a')
        for i in range(len(hrefs)):
            full_name = wb.find_elements_by_xpath(f'//*[@id="Work_List_Container_267733"]/div[{i + 1}]/h4/a').text
            if re.search('-', full_name):
                first_name = full_name.split('-')[0]
                last_name = full_name.split('-')[1]
            elif re.search('·', full_name):
                first_name = full_name.split('·')[0]
                last_name = full_name.split('·')[1]
            elif re.search('—', full_name):
                first_name = full_name.split('—')[0]
                last_name = full_name.split('—')[1]
            else:
                first_name = last_name = full_name
            if not os.path.exists('./王者荣耀壁纸/' + first_name) and first_name != last_name:
                os.mkdir('./王者荣耀壁纸/' + first_name)

            try:
                r = requests.get(hrefs[i].get_attribute('href'), headers=headers)
                file_dir = f'./王者荣耀壁纸/{first_name}/{last_name}.jpg' if first_name != last_name else f'./王者荣耀壁纸/{first_name}.jpg'
                with open(file_dir, 'wb') as f:
                    f.write(r.content)
            except Exception as e:
                print(hrefs[i].get_attribute('href'), first_name, last_name, e)
            print(f"\r[{k + 1}/{25}||{i + 1}/{len(hrefs)}]", end="")
            time.sleep(.5)
        wb.find_element_by_xpath('//*[@id="Page_Container_267733"]/a[13]').click()
        time.sleep(1)


if __name__ == '__main__':
    if not os.path.exists('./王者荣耀壁纸'):
        os.mkdir('./王者荣耀壁纸')
    main()
    print("========================================\n\n")
    print("壁纸下载完成")
    print("\n\n========================================")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ByXian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值