目录
使用Python制作的角色查询功能现已制作成Nonebot2插件,可在我的群里拿取插件包。
1.网页分析抓包
对于这种 动态网页 我们去爬取网页的html代码是得不到完整数据的,但是要制作成机器人插件就不能使用selenium,就可以查看请求地址的api找到数据
选择xhr文件来找找api
如上图我点击另外一个角色时,就发现请求出来个xhr文件
因此我们多点击几次就可以找到api文件
就是我们要的数据了,里面就是返回了json数据我们可以直接爬取这些数据即可。我在网页界面看见了3个城市不同的请求地址,因此我们还要爬3个xhr请求。
2.代码编写
基础数据,3个不同的链接
import requests
from bs4 import BeautifulSoup as be
md_url="https://ys.mihoyo.com/content/ysCn/getContentList?pageSize=20&pageNum=1&order=asc&channelId=150" #蒙德
ly_url="https://ys.mihoyo.com/content/ysCn/getContentList?pageSize=20&pageNum=1&order=asc&channelId=151" #离月
dq_url="https://ys.mihoyo.com/content/ysCn/getContentList?pageSize=20&pageNum=1&order=asc&channelId=324" #稻妻
直接写一个函数来获取每一个api的json数据
def get_json(_url_):
req=requests.get(url=_url_)
if req.status_code == 200:
return req.json()['data']
else:
return None
然后就是清洗数据,把不用的数据丢掉,有用的的留下可以用的就行了
def clean_data(_data_):
_return_=[]
for key in _data_['list']:
ext=key["ext"]
data={key['title']:{
"角色ICON":ext[0]["value"][0]["url"],
"电脑端立绘":ext[1]["value"][0]["url"],
"手机端立绘":ext[15]["value"][0]["url"],
"角色名字":key['title'],
"角色属性":ext[3]["value"][0]["url"],
"角色语言":ext[4]["value"],
"声优1":ext[5]["value"],
"声优2":ext[6]["value"],
"简介":be(ext[7]["value"],"lxml").p.text.strip(),
"台词":ext[8]["value"][0]["url"],
"音频":{
ext[9]["value"][0]["name"]:ext[9]["value"][0]["url"],
ext[10]["value"][0]["name"]:ext[10]["value"][0]["url"],
ext[11]["value"][0]["name"]:ext[11]["value"][0]["url"],
ext[12]["value"][0]["name"]:ext[12]["value"][0]["url"],
ext[13]["value"][0]["name"]:ext[13]["value"][0]["url"],
ext[14]["value"][0]["name"]:ext[14]["value"][0]["url"],
},
}
}
_return_.append(data[key['title']])
return _return_
后面我们要做一个查找角色信息的函数所以我们要先将数据存好,data[角色名字]={角色数据}
def data():
_json_={}
for url in [md_url,ly_url,dq_url]:
jsonlist=clean_data(get_json(url))
for json in jsonlist:
_json_[json['角色名字']]=json
return _json_
这样我们就可以从data函数获取到整理好的数据
我们最最后一步就是查找功能
def lookup(name):
json = data()[name]
print("查找角色:",name)
for key,value in json.items():
if key == "音频":
for keys,values in json[key].items():
print(f"{keys}{values}")
else:
print(f"{key}:{value}")
# 使用方法 lookup('角色名字')
让我们看看效果:
这样我们的爬虫就写好了,以下是完整代码:
import requests
from bs4 import BeautifulSoup as be
md_url="https://ys.mihoyo.com/content/ysCn/getContentList?pageSize=20&pageNum=1&order=asc&channelId=150"
ly_url="https://ys.mihoyo.com/content/ysCn/getContentList?pageSize=20&pageNum=1&order=asc&channelId=151"
dq_url="https://ys.mihoyo.com/content/ysCn/getContentList?pageSize=20&pageNum=1&order=asc&channelId=324"
def get_json(_url_):
req=requests.get(url=_url_)
if req.status_code == 200:
return req.json()['data']
else:
return None
def clean_data(_data_):
_return_=[]
for key in _data_['list']:
ext=key["ext"]
data={key['title']:{
"角色ICON":ext[0]["value"][0]["url"],
"电脑端立绘":ext[1]["value"][0]["url"],
"手机端立绘":ext[15]["value"][0]["url"],
"角色名字":key['title'],
"角色属性":ext[3]["value"][0]["url"],
"角色语言":ext[4]["value"],
"声优1":ext[5]["value"],
"声优2":ext[6]["value"],
"简介":be(ext[7]["value"],"lxml").p.text.strip(),
"台词":ext[8]["value"][0]["url"],
"音频":{
ext[9]["value"][0]["name"]:ext[9]["value"][0]["url"],
ext[10]["value"][0]["name"]:ext[10]["value"][0]["url"],
ext[11]["value"][0]["name"]:ext[11]["value"][0]["url"],
ext[12]["value"][0]["name"]:ext[12]["value"][0]["url"],
ext[13]["value"][0]["name"]:ext[13]["value"][0]["url"],
ext[14]["value"][0]["name"]:ext[14]["value"][0]["url"],
},
}
}
_return_.append(data[key['title']])
return _return_
def data():
_json_={}
for url in [md_url,ly_url,dq_url]:
jsonlist=clean_data(get_json(url))
for json in jsonlist:
_json_[json['角色名字']]=json
return _json_
def lookup(name):
json = data()[name]
print("查找角色:",name)
for key,value in json.items():
if key == "音频":
for keys,values in json[key].items():
print(f"{keys}:{values}")
else:
print(f"{key}:{value}")
此功能已制作成我的机器人插件,大家可以来群:706128290来进行讨论,下载插件包。
我是PYmili,下次再见!