毕业设计还没有弄完,但又不想弄,就先写个爬虫换换心情吧。
爬取的是英雄联盟英雄的皮肤,不过首页的url地址没有我们想要的数据,需要找到真实的url地址,就是简单的json文本,过程比较简单,步骤都写在注释里面了,完整代码如下:
# 导入第三方库
import requests
from fake_useragent import UserAgent
import time
import jsonpath
import os
import re
'''
英雄联盟皮肤爬取
'''
class HeroSkins():
# 初始化对象
def __init__(self):
# 所有英雄页面的url地址
self.hero_list_url = "https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js"
# 英雄详情页的url地址
self.detail_url = "https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js"
# 请求头
self.headers = {"User-Agent": UserAgent().random}
# 定义得到英雄ID的函数
def getid(self, url):
time.sleep(0.5)
# 请求英雄页面的url地址
response = requests.get(url, headers=self.headers).json()
# 提取hero内的内容
hero_list = response["hero"]
# 新建英雄id的空列表
hero_id_list = []
# 遍历循环英雄列表
for hero in hero_list:
# 将英雄id加入到空列表
hero_id_list.append(hero['heroId'])
# 返回英雄id列表
return hero_id_list
# 定义得到皮肤的函数
def get_skins(self, hero_id_list):
# 创建文件夹
if not os.path.exists("Hero Skins"):
os.mkdir("Hero Skins")
# 遍历循环英雄id
for i in hero_id_list:
# 构造英雄详情页的url地址
url = self.detail_url.format(i)
# 请求详情页的url地址
ret = requests.get(url, headers=self.headers).json()
# jsonpath提取皮肤的url地址,返回列表
skin = jsonpath.jsonpath(ret, '$..mainImg')
# jsonpath提取皮肤的名称,返回列表,去掉第一个重复的名称
name = jsonpath.jsonpath(ret, '$..name')[1:-1]
# 遍历循环皮肤地址,皮肤名称
for skin, name in zip(skin, name):
# 将名称中的敏感符号替换掉
name1 = re.sub("/", "", name)
# 判断皮肤列表中是否有空值,如果有则跳过
if len(skin) == 0:
continue
# 保存皮肤
with open("Hero Skins" + "/" + name1 + ".jpg", "wb") as f:
print("正在写入:" + name)
r = requests.get(skin, headers=self.headers)
f.write(r.content)
# 实现主要逻辑
def run(self):
url = self.hero_list_url
hero_id_list = self.getid(url)
self.get_skins(hero_id_list)
# 程序运行接口
if __name__ == '__main__':
hero_spider = HeroSkins()
hero_spider.run()
爬取结果的部分截图: