有趣的Python爬虫-原神角色查询程序

目录

1.网页分析抓包

 2.代码编写


使用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,下次再见!

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pymili

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值