質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.38%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

97閲覧

python discordbotの作成でエラーが解決しない

ebinun

総合スコア0

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/10/13 10:12

実現したいこと

歌ネット というサイトから歌詞の一部と曲名をスクレイピングして持ってきてでディスコードで歌詞クイズのBOTを作りたい

発生している問題・分からないこと

lyrics_dict というリストが空っぽのまま

エラーメッセージ

error

1[2024-10-13 18:54:27] [ERROR ] discord.client: Ignoring exception in on_message 2Traceback (most recent call last): 3 File "C:\Users\ryo62\anaconda3\Lib\site-packages\discord\client.py", line 449, in _run_event 4 await coro(*args, **kwargs) 5 File "C:/Users/ryo62/OneDrive/デスクトップ/Python/bot.py", line 71, in on_message 6 song_link = random.choice(list(lyrics_dict.keys())) 7 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 8 File "C:\Users\ryo62\anaconda3\Lib\random.py", line 373, in choice 9 raise IndexError('Cannot choose from an empty sequence') 10IndexError: Cannot choose from an empty sequence

該当のソースコード

import discord import requests from bs4 import BeautifulSoup import random TOKEN = (書いてます) # 出したいアーティスト urls = ['https://www.uta-net.com/artist/9699/', 'https://www.uta-net.com/artist/18093/', 'https://www.uta-net.com/artist/18526/', ] url = random.choice(urls) response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') song_links = [] lyrics_dict = {} # すべての曲のリンクを取得 for link in soup.find_all('a'): href = link.get('href') if href and '/song/' in href: # 曲へのリンクを確認 song_url = f'https://www.uta-net.com{href}' song_response = requests.get(song_url) song_soup = BeautifulSoup(song_response.text, 'html.parser') # アーティスト名を取得 artist_name = song_soup.find('h3').text# ここは実際のHTML構造に応じて変更 # アーティスト名が条件に合う場合 if artist_name in ["Mrs.GREEN APPLE", "SEKAI NO OWARI","Official髭男dism"]: full_link = f'https://www.uta-net.com{href}' song_links.append(full_link) # 各曲の歌詞を取得 for song_link in song_links: song_response = requests.get(song_link) song_soup = BeautifulSoup(song_response.text, 'html.parser') #lyrics_tag = song_soup.find('span', class_='d-block d-lg-none utaidashi text-truncate').text lyrics_tag = song_soup.find('span', class_='d-block pc-utaidashi').text if lyrics_tag: lyrics = lyrics_tag.get_text(separator="\n") else: lyrics = "歌詞が見つかりませんでした" # 曲のタイトルと歌詞を取得 title_tag = song_soup.find('h2') title = title_tag.text if title_tag else "タイトルが見つかりませんでした。" print(f"曲のタイトル: {title}") print(f"歌詞: {lyrics[:100]}...") lyrics_dict[song_link] = {'lyrics': lyrics, 'title': title} intents = discord.Intents.default() intents.messages = True intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_ready(): print(f'ボット {client.user} がオンラインです!') @client.event async def on_message(message): # 自分のメッセージには反応しない if message.author == client.user: return if message.content == 'クイズ出して': # ランダムにURLを選んで歌詞を取得 #url = random.choice(urls) # 歌詞の一部を表示してクイズにする song_link = random.choice(list(lyrics_dict.keys())) song_data = lyrics_dict[song_link] lines = song_data['lyrics'].split('\n') random_lyrics = random.choice(lines) await message.channel.send (f"この歌詞はどの曲でしょうか?: \n\n \"{random_lyrics}\"") # ユーザーの回答を待つ def check(m): return m.author == message.author and m.channel == message.channel user_answer = await client.wait_for('message', check=check) #user_answer = message.content.strip() #if message.author == client.user: if user_answer.content.lower() == song_data['title'].lower(): # 正誤判定 await message.channel.send("正解です!🎉") else: await message.channel.send(f"残念!正解は「{song_data['title']}」です。") # テスト実行 client.run(TOKEN)

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

タグの名前やクラスの名前が間違っているかもしれないと思い、いろいろ試してみたのですが上手くいかず何しろ今月から勉強を始めたものでHTMLの読みかたもあまりわかりません

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

実現したいこと
歌ネット というサイトから歌詞の一部と曲名をスクレイピングして持ってきてでディスコードで歌詞クイズのBOTを作りたい

上記に対して対象サイトの利用規約では下記行為が禁止されています。

このウェブサイトの全内容又はその一部について、歌ネットに無断で複製、改変、編集、アップロード、提示、送信、頒布、販売、スクレイピングなど、その他これに類する行為を行う行為

「クイズのBOT」を作成することが目的であれば独自のクイズを用いるか著作権フリーの題材等を利用するのが良いかと思います。

投稿2024/10/13 12:05

meg_

総合スコア10699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ebinun

2024/10/13 12:09

確認していませんでした、作るのはやめておきます。 あくまでも勉強として聞きたいのですが、私が書いたコードが上手くいかないのはスクレイピングが禁止されているためサイト側にブロックされているということですか?それともコードが間違っていますか?
melian

2024/10/13 12:45

> サイト側にブロックされているということですか? それともコードが間違っていますか? 最初に、artist名の先頭に改行(0x0a)が含まれていますので、それを取り除く必要があります。(除去していないので song_links が空リスト([])になっています) artist_name = song_soup.find('h3').text => artist_name = song_soup.find('h3').text.strip() 次に、歌詞を表示しているサイトでは歌詞のコピーができない様な仕掛け(JavaScript によるコード)が施されています。また、以下で指定している span要素(class 名が "d-block pc-utaidashi")は存在しません。 lyrics_tag = song_soup.find('span', class_='d-block pc-utaidashi').text
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.38%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問