python爬取王者全皮肤
为了感谢天美爸爸让我新赛季连胜上王者,我决定——爬了你们!
知道有哪些英雄
这个比较难
对比几个网址:
蒙恬:
https://pvp.qq.com/web201605/herodetail/527.shtml
蒙犽:
https://pvp.qq.com/web201605/herodetail/524.shtml
镜:
https://pvp.qq.com/web201605/herodetail/531.shtml
就是https://pvp.qq.com/web201605/herodetail/+英雄id+.shtml
但是很遗憾的是,我们并不知道英雄id有哪些……
可是,经过一番寻找查看前辈文章 ,我最终发现了一个叫做herolist.json的文件,里面有保存英雄名字和id
url = 'https://pvp.qq.com/web201605/js/herolist.json'
herolist = requests.get(url) # 获取英雄列表json文件
herolist_json = herolist.json() # 转化为json格式
hero_name = list(map(lambda x: x['cname'], herolist.json())) # 提取英雄的名字
hero_number = list(map(lambda x: x['ename'], herolist.json())) # 提取英雄的编号
很好,那么就是很简单的下载了:
比如蒙恬:
他的图片下载网页就是
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/527/527-bigskin-1.jpg
以及
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/527/527-bigskin-2.jpg
那用requests.get就可以轻松下载了!
onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str(
j) + '-bigskin-' + str(k-2) + '.jpg'
im = requests.get(onehero_link) # 请求url
那么还有一个难题:怎么获取皮肤名字呢?
经过查找,我发现在这个地方可以知道有什么皮肤:
那就用正则吧!
额……很烦的哦!
那么就用上python的新库:requests_html
需要在cmd输入pip install requests_html或自行到官网下载
一行代码调出
from requests_html import HTMLSession
然后注意了!这个需要用的查找方式,既不是正则,也不是xpath,是我之前基本没怎么学过的方法:
selector
使用requests_html的方法也很简单:
def get_ski_name(url):
session = HTMLSession()
r = session.get(url)
r_codes = r.html.find('body > div.wrapper > div.zk-con1.zk-con > div > div > div.pic-pf > ul')
r_code = r_codes[0]
#返回信息<Element 'ul' class=('pic-pf-list', 'pic-pf-list3') data-imgname='秩序统将&0|秩序猎龙将&0'>
ski_name = str(r_code)[66:-2]
ski_name = ski_name.replace("&","")
global ski_list
for i in range(10):#去数字
ski_name = ski_name.replace(str(i),'')
ski_list = ski_name.split('|')#得到皮肤名字列表
它会返回列表,注意不能直接使用哦!
最后,附上源码:
import os
import requests
import time
import shutil
import xlwt
from bs4 import BeautifulSoup
from lxml import etree
from requests_html import HTMLSession
#url = 'https://cpppatterns.com/patterns/copy-range-of-elements.html'
#获取皮肤 名字
def get_ski_name(url):
session = HTMLSession()
r = session.get(url)
r_codes = r.html.find('body > div.wrapper > div.zk-con1.zk-con > div > div > div.pic-pf > ul')
r_code = r_codes[0]
#<Element 'ul' class=('pic-pf-list', 'pic-pf-list3') data-imgname='秩序统将&0|秩序猎龙将&0'>
ski_name = str(r_code)[66:-2]
ski_name = ski_name.replace("&","")
global ski_list
for i in range(10):#去数字
ski_name = ski_name.replace(str(i),'')
ski_list = ski_name.split('|')#得到皮肤名字列表
# 下载图片
def downloadPic():
skin_name_list = []
skin_name = []
i = 0
x = -1
if not os.path.exists("王者全皮肤"):
os.mkdir('王者全皮肤')
else:
shutil.rmtree('王者全皮肤')
os.mkdir('王者全皮肤')
for j in hero_number:
# 创建文件夹
path = "王者全皮肤\\" + hero_name[i]
# 进入创建好的文件夹
os.mkdir("C:\\Users\\陈睿轩\\Desktop\\编程作品\\python\\requests\\"+path)
time.sleep(0.2)
os.chdir("C:\\Users\\陈睿轩\\Desktop\\编程作品\\python\\requests\\"+path)
i += 1
#https://pvp.qq.com/web201605/herodetail/196.shtml
print("获取"+hero_name[i-1]+"的皮肤中!")
ski_url = "https://pvp.qq.com/web201605/herodetail/" + str(j) + ".shtml"
get_ski_name(ski_url)
_len = len(ski_list) + 3
print("获取成功:",ski_list)
for k in range(1,_len):
# 拼接url
x += 1
#basic_url = 'https://pvp.qq.com/web201605/herodetail/'+str(j)+'.shtml'
#headers = {
# 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
#}
#发送请求
#response = requests.get(basic_url, headers=headers, timeout=10) #requests请求;
#response.encoding = 'utf-8' #设置编码
#htm = response.text #返回text文本;
#selector = etree.HTML(htm) #利用 etree.HTML 初始化
#skin = selector.xpath('/html/body/div[3]/div[1]/div/div/div[2]/ul')
#sk_in = skin[0]
#skin = sk_in.replace("&0","")
#ski_n = skin.split("|")
#skin_name_list.append(ski_n)
onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str(
j) + '-bigskin-' + str(k-2) + '.jpg'
im = requests.get(onehero_link) # 请求url
if im.status_code == 200:
ski_name = ski_list[k-3]
print("正在下载 "+hero_name[i-1]+" 的"+str(k-2)+"号皮肤—— "+ski_name)
open(hero_name[i-1] + "——" + ski_name + '.jpg', 'wb').write(im.content) # 写入文件
print(hero_name[i-1]+" 的皮肤下载完毕!")
print()
#skin_name.append(long)
#os.chdir(format(os.path.abspath(os.path.join(os.getcwd(), ".."))))
if __name__ == "__main__":
start_time = time.time()
url = 'https://pvp.qq.com/web201605/js/herolist.json'
herolist = requests.get(url) # 获取英雄列表json文件
herolist_json = herolist.json() # 转化为json格式
hero_name = list(map(lambda x: x['cname'], herolist.json())) # 提取英雄的名字
hero_number = list(map(lambda x: x['ename'], herolist.json())) # 提取英雄的编号
downloadPic()
end_time = time.time()
all_time = end_time - start_time
print("已完成全部的皮肤海报爬取,共用时"+str(all_time)+"秒")
程序运行中截图:
这是2020.7.24的帖子,100个英雄,最新的李信皮肤一念神魔和张飞皮肤虎魂都有哦!
记得点赞关注赞赏哦!爱你么么哒!