文章目錄
- LOL桌面
-
- 分析
- 寫代碼
- 王者榮耀桌面
-
- 分析
- 寫代碼
- 源碼
-
-
- lol
- 王者榮耀
-
之前看到好多爬王者榮耀和英雄聯盟桌面的,現在有時間,自己也搞個玩玩
記錄一下,也幫助一下想要學習的朋友
LOL桌面
英雄聯盟桌面我隻找到了這個位置的海報,清晰度不是很高,用來做桌面有點勉強了,如果有好的位置歡迎留言
分析
進入官網資料庫之後會看到所有的英雄,打開控制台發現都是
li
标簽組成的,每個
li
下面都有一個
a
标簽,這就是詳情頁的連結了
打開詳情頁,打開控制台,找到海報所在位置
會發現隻有一個img标簽,需要點選一下第二個皮膚才會全部加載出來,也是
li
标簽組成的,每個
li
下面都有一個
img
标簽,這就是圖檔所在位置了
寫代碼
其中用到的包有time、os、requests、selenium,可自行安裝
- 先建立一個檔案夾,用來存放桌面:
if not os.path.exists('./LOL桌面'):
os.mkdir('./LOL桌面')
- 初始化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')
- 擷取所有英雄詳情頁的連結,我用的是執行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)
- 進入詳情頁,找到圖檔位址
# 這裡使用 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)
- 最後就是下載下傳了,使用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,可自行安裝
- 先建立一個檔案夾,用來存放桌面:
if not os.path.exists('./王者榮耀桌面'):
os.mkdir('./王者榮耀桌面')
- 初始化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')
- 由于直接寫明了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)
- 下載下傳
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)
- 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========================================")