admin管理员组文章数量:1619289
文章目录
- 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/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/",
'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/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/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循环的最后还要点击下一页,加入下一个循环
wb.find_element_by_xpath('//*[@id="Page_Container_267733"]/a[13]').click()
源码
lol
"""
Code by xian
email: byxian7024@qq
"""
import time
import os
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
headers = {
"Referer": "https://lol.qq/",
'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/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
"""
import re
import time
import os
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
headers = {
"Referer": "https://pvp.qq/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/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========================================")
版权声明:本文标题:python使用selenium爬英雄联盟王者荣耀壁纸 附源码 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728795146a1174095.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论