天天看點

python使用selenium爬英雄聯盟/王者榮耀桌面 附源碼LOL桌面王者榮耀桌面源碼

文章目錄

  • LOL桌面
    • 分析
    • 寫代碼
  • 王者榮耀桌面
    • 分析
    • 寫代碼
  • 源碼
      • lol
      • 王者榮耀

之前看到好多爬王者榮耀和英雄聯盟桌面的,現在有時間,自己也搞個玩玩

記錄一下,也幫助一下想要學習的朋友

python使用selenium爬英雄聯盟/王者榮耀桌面 附源碼LOL桌面王者榮耀桌面源碼
python使用selenium爬英雄聯盟/王者榮耀桌面 附源碼LOL桌面王者榮耀桌面源碼

LOL桌面

英雄聯盟桌面我隻找到了這個位置的海報,清晰度不是很高,用來做桌面有點勉強了,如果有好的位置歡迎留言
python使用selenium爬英雄聯盟/王者榮耀桌面 附源碼LOL桌面王者榮耀桌面源碼

分析

進入官網資料庫之後會看到所有的英雄,打開控制台發現都是

li

标簽組成的,每個

li

下面都有一個

a

标簽,這就是詳情頁的連結了

打開詳情頁,打開控制台,找到海報所在位置

python使用selenium爬英雄聯盟/王者榮耀桌面 附源碼LOL桌面王者榮耀桌面源碼

會發現隻有一個img标簽,需要點選一下第二個皮膚才會全部加載出來,也是

li

标簽組成的,每個

li

下面都有一個

img

标簽,這就是圖檔所在位置了

python使用selenium爬英雄聯盟/王者榮耀桌面 附源碼LOL桌面王者榮耀桌面源碼

寫代碼

其中用到的包有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頁桌面,所有還需要翻頁

關于名稱,有好幾種展示方式,一般都是 英雄名-皮膚名 ,還有 英雄名·皮膚名、沒有分隔符和 英雄名—皮膚名,這裡‘—’并不是壹,是符号

python使用selenium爬英雄聯盟/王者榮耀桌面 附源碼LOL桌面王者榮耀桌面源碼
python使用selenium爬英雄聯盟/王者榮耀桌面 附源碼LOL桌面王者榮耀桌面源碼
python使用selenium爬英雄聯盟/王者榮耀桌面 附源碼LOL桌面王者榮耀桌面源碼
python使用selenium爬英雄聯盟/王者榮耀桌面 附源碼LOL桌面王者榮耀桌面源碼

寫代碼

其中用到的包有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循環的最後還要點選下一頁,加入下一個循環

源碼

lol

"""

    Code by xian
    email: [email protected]

"""
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: [email protected]

"""
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========================================")