首页 > 其他分享 >获取动漫并播放

获取动漫并播放

时间:2024-02-01 11:47:03浏览次数:16  
标签:episode 获取 url title list 动漫 anime 播放

import requests
from bs4 import BeautifulSoup, NavigableString, Tag
from fake_useragent import UserAgent

BASE_URL = "https://ww1.gogoanime2.org"
#BASE_URL="https://search.bilibili.com"

def search_scraper(anime_name: str) -> list:
    """
    根据动漫名称搜索并返回动漫列表。

    Args:
        anime_name (str): 动漫名称。

    Returns:
        list: 包含动漫信息的列表。
    """
    search_url = f"{BASE_URL}/search/{anime_name}"
    #search_url = f"https://search.bilibili.com/all?keyword={anime_name}&search_source=1"
    response = requests.get(
        search_url, headers={"UserAgent": UserAgent().chrome}
    )

    response.raise_for_status()

    soup = BeautifulSoup(response.text, "html.parser")

    anime_ul = soup.find("ul", {"class": "items"})
    if anime_ul is None or isinstance(anime_ul, NavigableString):
        msg = f"未找到名为 {anime_name} 的任何动漫"
        raise ValueError(msg)
    anime_li = anime_ul.children

    anime_list = []
    for anime in anime_li:
        if isinstance(anime, Tag):
            anime_url = anime.find("a")
            if anime_url is None or isinstance(anime_url, NavigableString):
                continue
            anime_title = anime.find("a")
            if anime_title is None or isinstance(anime_title, NavigableString):
                continue

            anime_list.append({"title": anime_title["title"], "url": anime_url["href"]})

    return anime_list


def search_anime_episode_list(episode_endpoint: str) -> list:
    """
    根据动漫 URL 获取动漫的剧集列表。

    Args:
        episode_endpoint (str): 动漫的剧集列表的 URL。

    Returns:
        list: 包含剧集信息的列表。
    """
    request_url = f"{BASE_URL}{episode_endpoint}"

    response = requests.get(url=request_url, headers={"UserAgent": UserAgent().chrome})
    response.raise_for_status()

    soup = BeautifulSoup(response.text, "html.parser")

    episode_page_ul = soup.find("ul", {"id": "episode_related"})
    if episode_page_ul is None or isinstance(episode_page_ul, NavigableString):
        msg = f"未找到任何名为 {anime_name} 的动漫剧集"
        raise ValueError(msg)
    episode_page_li = episode_page_ul.children

    episode_list = []
    for episode in episode_page_li:
        if isinstance(episode, Tag):
            url = episode.find("a")
            if url is None or isinstance(url, NavigableString):
                continue
            title = episode.find("div", {"class": "name"})
            if title is None or isinstance(title, NavigableString):
                continue

            episode_list.append(
                {"title": title.text.replace(" ", ""), "url": url["href"]}
            )

    return episode_list


def get_anime_episode(episode_endpoint: str) -> list:
    """
    获取动漫剧集的观看和下载链接。

    Args:
        episode_endpoint (str): 剧集的 URL。

    Returns:
        list: 包含观看和下载链接的列表。
    """
    episode_page_url = f"{BASE_URL}{episode_endpoint}"

    response = requests.get(
        url=episode_page_url, headers={"User-Agent": UserAgent().chrome}
    )
    response.raise_for_status()

    soup = BeautifulSoup(response.text, "html.parser")

    url = soup.find("iframe", {"id": "playerframe"})
    if url is None or isinstance(url, NavigableString):
        msg = f"未找到 {episode_endpoint} 的观看和下载链接"
        raise RuntimeError(msg)

    episode_url = url["src"]
    if not isinstance(episode_url, str):
        msg = f"未找到 {episode_endpoint} 的观看和下载链接"
        raise RuntimeError(msg)
    download_url = episode_url.replace("/embed/", "/playlist/") + ".m3u8"

    return [f"{BASE_URL}{episode_url}", f"{BASE_URL}{download_url}"]


if __name__ == "__main__":
    anime_name = input("输入动漫名称:").strip()
    anime_list = search_scraper(anime_name)
    print("\n")

    if len(anime_list) == 0:
        print("未找到该名称的任何动漫")
    else:
        print(f"找到 {len(anime_list)} 个结果:")
        for i, anime in enumerate(anime_list):
            anime_title = anime["title"]
            print(f"{i+1}. {anime_title}")

        anime_choice = int(input("\n请选择列表中的一个:").strip())
        chosen_anime = anime_list[anime_choice - 1]
        print(f"您选择了 {chosen_anime['title']}。正在搜索剧集...")

        episode_list = search_anime_episode_list(chosen_anime["url"])
        if len(episode_list) == 0:
            print("未找到该动漫的任何剧集")
        else:
            print(f"找到 {len(episode_list)} 个结果:")
            for i, episode in enumerate(episode_list):
                print(f"{i+1}. {episode['title']}")

            episode_choice = int(input("\n请选择一个剧集:").strip())
            chosen_episode = episode_list[episode_choice - 1]
            print(f"您选择了 {chosen_episode['title']}。正在搜索...")

            episode_url, download_url = get_anime_episode(chosen_episode["url"])
            print(f"\n要观看,请使用Ctrl +单击 {episode_url}。")
            print(f"要下载,请使用Ctrl +单击 {download_url}。")

 


需要安装 pip install fake_useragent  , bs4 运行结果:  

标签:episode,获取,url,title,list,动漫,anime,播放
From: https://www.cnblogs.com/mlhelloworld/p/18000865

相关文章

  • ASP6.0 (VB) 获取目录下所有图片文件
     <%'Desc:ASP6.0(VB)获取目录下所有图片文件'by:wgscd'date:2024-2-1dimc_pathc_path=Server.MapPath("./")setfile_system=createobject("scripting.filesystemobject")getFile(c_path)subgetFile(c_path) dimstr......
  • 2024年1月份更新「GIS数据」全国的GeoJSON、shp格式数据下载获取(精确到乡镇街道级)
    发现个可以免费下载全国 geojson 数据的网站,推荐一下。支持全国、省级、市级、区/县级、街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3、Echarts等geojson数据下载地址:https://geojson.hxkj.vip该项目github地址:https://github.com/TangSY/echarts-m......
  • 拉取RTSP流后的几个去向探讨(播放|转RTMP|轻量级RTSP服务|本地录制|GB28181)
    RTSP流的几个去处写了很多关于RTSP播放和转发的blog了,今天我们做个简单的汇总,以大牛直播SDK的Android平台为例,拉取到RTSP流,除了本地播放,还有几个流向:功能实现:1.拉流:通过RTSP直播播放SDK的数据回调接口,拿到音视频数据;2.转推:通过RTMP直播推送SDK的编码后数据输入接口,把回调上来的数......
  • Teamcenter SOA使用BOM行的bl_child_lines属性,获取子件的坑
    1、我一开始是使用 Cad-2013-05-StructureManagement服务的createBOMWindows2接口来获取BOM窗口constparam={info:[{itemRev:revModelObject,}]}constres=awaitsoaSvc.post('Cad-2013-05-StructureManagement','createBOMWindows2',param)......
  • csharp_获取属性的字符串名称
    PropertySupport\Person.cspublicclassPerson{publicstringName{get;set;}publicstringgetPropertyName(){returnPropertySupport.ExtractPropertyName(()=>Name);}}PropertySupport\Program.csPersonperson=newP......
  • 如何在vue3项目app.ts中获取第三方跳转过来的token 提前处理携带token情况的初始化 两
    如何在vue3项目app.ts中获取第三方跳转过来的token提前处理携带token情况的初始化两种方式路由守卫和window.location在Vue3项目的app.ts文件中获取第三方跳转过来的token,你可以使用VueRouter的route对象来获取URL参数。假设你的token参数位于URL的查询字......
  • 在企业微信中如何获取unionId?
    1.概念科普微信开放和公众平台的定位微信开放平台是为了让第三方应用投入微信的怀抱而设计的,比如第三方的移动应用(Android/IOS)、网站等;微信为了开疆拓土,扩大自己的影响力。微信公众平台是为了让程序员利用微信生态技术开发公众号、小程序而建立的,是一个技术提供平台;这才是......
  • windows上使用python2.7获取svn info,中文路径乱码问题
    #-*-coding:utf-8-*-from__future__importunicode_literalsimportsubprocessimportcmdimportosos.environ['LANG']='en_US.UTF-8'classSVNCommand(cmd.Cmd):defdo_svninfo(self,folder_path):#构建svninfo命令......
  • 携程获取景点详情 API 返回值说明
    公共参数请求地址:前往测试名称类型必须描述keyString是调用key,必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes,将调用缓存的数据,速度比较快result_typeString......
  • 获取本月的每个周一的日期
    letcurrentDate=newDate();//创建一个表示当前日期的Date对象   //将日期设置为当月的第一天   currentDate.setDate(1);   letmondays=[];//存放本月的周一数组   while(currentDate.getDay()!==1){     currentDate.se......