爬取LOL全皮肤打造蒙太奇拼图
2018-10-31 本文已影响73人
泡泡坪
今年很有幸看到S8,LPL夺冠了,S3入坑的我,还默默的关注着今年这场比赛。一直被看好的RNG大意失荆州,而从不被看好的IG最终却能站在了决赛舞台上,最终拿到了冠军!人生也一样,对于我来说,写好每一行代码,不负今日才是人生最重要的事。
进入正题,今天就用python爬取LOL全皮肤,最后做个蒙太奇效果拼图致我大学青春
寒冰射手进入官网,通过查看web元素,可得知这张图的src是http://ossweb-img.qq.com/images/lol/web201310/skin/big22000.jpg。在这里图片的id是22000,22是英雄id,000表示第一张,以此类推。那么目的就很明确了,找到全英雄对应下皮肤ID。
在英雄列表界面,可发现通过http://lol.qq.com/biz/hero/champion.js,可以得到全英雄ID以及名称,如下图
英雄列表拿到英雄名称,则可以通过另外一个地址获取该英雄的所有皮肤详情,例如:http://lol.qq.com/biz/hero/Ashe.js
英雄详情至此完成了皮肤id和皮肤名称的获取。
下面是详细代码
import requests
import re
import json
import os
import time
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:63.0) Gecko/20100101 Firefox/63.0'}
#获取源数据
def parse_url(url):
response = requests.get(url, headers=headers)
return response.content.decode()
#获取英雄联盟源数据
def get_js(url):
data = parse_url(url)
return data
def get_heros(data_js):
#正则表达式,加括号是为了能够返回括号中的内容
req = '"keys":(.*?),"data"'
list_js = re.findall(req, data_js)[0]
hero_json = json.loads(list_js)
#key为英雄ID,value为英雄名称
for key, value in hero_json.items():
hero = value
get_skin(hero)
#延时,保证每次下载都存在延时,不会对服务器造成负担
time.sleep(2)
def get_skin(hero):
url = 'http://lol.qq.com/biz/hero/' + hero + '.js'
data = get_js(url)
req = '"id":"(\d.*?)","num"'
list_js = re.findall(req, data)
for i in list_js:
url_image = 'http://ossweb-img.qq.com/images/lol/web201310/skin/big' + str(i) + '.jpg'
skin_name = hero + '-' + str(i) + '.jpg'
write_local(url_image,hero, skin_name)
def write_local(url_image, hero, skin_name):
print(hero + '的' + url_image + '正在下载')
skin = requests.get(url_image)
folder_path = 'F:\\BiliBili\\LOL\\' + hero
isCreated = os.path.exists(folder_path)
if not isCreated:
os.makedirs(folder_path)
img_path = folder_path + '\\' + skin_name
with open(img_path, 'wb') as f:
f.write(skin.content)
def run():
url = 'http://lol.qq.com/biz/hero/champion.js'
data = get_js(url)
heros = get_heros(data)
print("下载完成")
run()
整个过程主要的点是一个正则表达式。
最后成功获取所有皮肤,包括原图,总共1048张图片
LOL全皮肤对爬取的图片用AndreaMosaic进行拼图操作
拼图 最终完成图细节图
找到自己的曾经的熟悉的英雄么?