Pythonスクレイピング超入門!初心者でも簡単解説

Pythonスクレイピング超入門!初心者でも簡単解説

この記事でわかること

Python スクレイピング 初心者 やり方 解説画像1
  • Pythonを使ったWebスクレイピングの基本が理解できる
  • 必要なライブラリとそのインストール方法がわかる
  • 簡単なWebページから情報を取得するコード例が学べる
  • スクレイピング時の注意点や倫理的な問題が把握できる
  • 今後の学習ステップや応用方法が見えてくる

Webサイトから情報を集めたいけれど、どうすればいいかわからない。そんな悩みを抱えていませんか? プログラミング初心者でもPythonを使えば、Webスクレイピングは意外と簡単に始められます。この記事では、そんなあなたの疑問を解消し、今日から実践できる方法を分かりやすく解説します。

1. Pythonスクレイピングの基本を知ろう

Python スクレイピング 初心者 やり方 解説画像2

Webスクレイピングとは、Webサイトからプログラムを使って自動的に情報を収集する技術です。例えば、商品の価格を一覧で表示させたり、ニュース記事の見出しをまとめて取得したりする際に役立ちます。Pythonは、そのシンプルさと豊富なライブラリのおかげで、スクレイピング学習に最適な言語と言えるでしょう。

1.1 なぜPythonでスクレイピング?

Pythonがスクレイピングに適している理由はいくつかあります。まず、コードが読みやすく、初心者でも理解しやすい点です。また、`requests`や`BeautifulSoup`といった強力なライブラリが標準で用意されており、これらを使うことで複雑な処理も簡単に行えます。例えば、あるECサイトでは、数万件の商品情報を自動で取得し、価格変動を追跡するといったことも可能です。私が初めてスクレイピングに挑戦した時も、Pythonの平易な構文に助けられました。

1.2 スクレイピングでできることの可能性

スクレイピングは、単に情報を集めるだけではありません。集めたデータを分析し、ビジネスに活用することもできます。競合サイトの価格調査、SNSのトレンド分析、不動産情報の収集など、その応用範囲は非常に広いです。例えば、ある不動産情報サイトでは、毎日数千件の物件情報が更新されています。これらの情報をスクレイピングで取得し、価格の推移やエリアごとの需要を分析することで、投資判断に役立てることもできます。

1.3 倫理的な側面と注意点

しかし、スクレイピングを行う上で忘れてはならないのが、倫理的な側面と注意点です。Webサイトの利用規約を必ず確認し、過度なアクセスによるサーバー負荷をかけないように配慮する必要があります。また、個人情報の収集は法律で禁止されています。サイトによっては、ボットからのアクセスを制限している場合もあるので、 robots.txt ファイルを確認することも重要です。これらのルールを守らないと、アクセスをブロックされたり、法的な問題に発展したりする可能性があります。

2. スクレイピングに必要なものと準備

Python スクレイピング 初心者 やり方 解説画像3

Pythonでスクレイピングを始めるには、いくつかの準備が必要です。まずは、Python本体のインストール、そしてスクレイピングに特化したライブラリの導入を行います。これらを整えることで、スムーズに学習を進めることができます。

2.1 Pythonのインストール方法

Pythonをまだインストールしていない場合は、公式サイトから最新版をダウンロードしてインストールしましょう。Windows、macOS、Linuxなど、お使いのOSに合わせたインストーラーが提供されています。インストールの際は、「Add Python to PATH」のようなオプションにチェックを入れると、コマンドラインからPythonを簡単に実行できるようになります。

2.2 必須ライブラリのインストール

スクレイピングでよく使われるライブラリは、`requests`と`BeautifulSoup4`です。

  • `requests`: Webサイトにアクセスし、HTMLなどのコンテンツを取得するのに使います。
  • `BeautifulSoup4`: 取得したHTMLを解析し、目的の情報を抽出しやすくしてくれます。

これらのライブラリは、`pip`というPythonのパッケージ管理システムを使って簡単にインストールできます。ターミナルやコマンドプロンプトを開き、以下のコマンドを実行してください。

“`bash
pip install requests beautifulsoup4
“`

これで、スクレイピングを行うための基本的な環境が整いました。

2.3 開発環境の準備(VS Codeなど)

コードを書くためには、テキストエディタや統合開発環境(IDE)があると便利です。初心者には、Visual Studio Code(VS Code)がおすすめです。無料で使え、Pythonのコード補完機能やデバッグ機能も充実しています。VS Codeをインストールし、Python拡張機能を追加すれば、快適な開発環境が整います。

3. 初めてのスクレイピング!簡単なコード例

Python スクレイピング 初心者 やり方 解説画像4

準備が整ったら、いよいよ実際にコードを書いてみましょう。ここでは、簡単なWebページからタイトルを取得する例を紹介します。

3.1 `requests`でHTMLを取得する

まず、`requests`ライブラリを使って、WebページのHTMLコードを取得します。

“`python
import requests

スクレイピングしたいWebサイトのURL

url = ‘http://example.com/’

try:
# GETリクエストを送信してHTMLを取得
response = requests.get(url)
# レスポンスのステータスコードを確認 (200なら成功)
response.raise_for_status() # エラーがあれば例外を発生させる
html_content = response.text
print(“HTMLコンテンツを取得しました。”)
# print(html_content) # 必要であればHTML全体を表示
except requests.exceptions.RequestException as e:
print(f”エラーが発生しました: {e}”)
“`

このコードでは、`requests.get(url)`で指定したURLにアクセスし、その結果を`response`オブジェクトに格納しています。`response.text`でHTMLの文字列として取得できます。`try-except`ブロックでエラー処理を行うことで、ネットワークの問題やURLの誤りなどに対応できます。

3.2 `BeautifulSoup`でHTMLを解析する

次に、取得したHTMLを`BeautifulSoup`で解析します。、特定のタグや属性を持つ要素を簡単に探し出せるようになります。

“`python
from bs4 import BeautifulSoup

上記で取得したhtml_contentを使用

soup = BeautifulSoup(html_content, ‘html.parser’)

Webページのタイトルを取得

title_tag = soup.find(‘title’)
if title_tag:
page_title = title_tag.text
print(f”ページのタイトル: {page_title}”)
else:
print(“タイトルタグが見つかりませんでした。”)

example.comのトップページはシンプルなので、タグ内の最初の

タグを取得してみましょう

paragraph_tag = soup.find(‘p’)
if paragraph_tag:
paragraph_text = paragraph_tag.text
print(f”最初の段落: {paragraph_text}”)
else:
print(“段落タグが見つかりませんでした。”)
“`

`BeautifulSoup(html_content, ‘html.parser’)`でHTMLを解析するための`soup`オブジェクトを作成します。`soup.find(‘title’)`は、HTMLの中から``タグを最初に見つかったものだけ取得します。`.text`でタグの中身のテキストを取り出せます。`example.com`のようなシンプルなページでは、このようにして必要な情報を簡単に取得できます。</p> <h3>3.3 複数の要素を取得する</h3> <p>リスト形式で表示されている情報など、複数の要素を取得したい場合もあります。そのような場合は、`find_all()`メソッドを使います。</p> <p>“`python</p> <h1>例えば、あるサイトのニュース記事の見出しリストを取得する場合を想定</h1> <p></p> <h1>(ここでは架空のHTML構造を想定します)</h1> <p></p> <h1>html_content = “…” # 実際には取得したHTML</h1> <p></p> <h1>soup = BeautifulSoup(html_content, ‘html.parser’)</h1> </p> <h1>giả sử có các thẻ </p> <li> có class=”news-item”</h1> <h1>news_items = soup.find_all(‘li’, class_=’news-item’)</h1> <h1>if news_items:</h1> <h1> print(“ニュース記事の見出し:”)</h1> <h1> for item in news_items:</h1> <h1> headline = item.find(‘h3’) # 見出しのタグがh3だと仮定</h1> <h1> if headline:</h1> <h1> print(f”- {headline.text.strip()}”) # strip()で前後の空白を除去</h1> <h1>else:</h1> <h1> print(“ニュース記事が見つかりませんでした。”)</h1> <h1>実際のexample.comにはリストはありませんが、</h1> <h1>もし</p> <p>タグが複数あった場合、以下のように取得できます。</h1> <h1>all_paragraphs = soup.find_all(‘p’)</h1> <h1>print(f”\nすべての</p> <p>タグの内容 ({len(all_paragraphs)}個):”)</h1> <h1>for i, p in enumerate(all_paragraphs):</h1> <h1> print(f”{i+1}: {p.text.strip()}”)</h1> <p>“`</p> <p>`find_all(‘tag_name’, class_=’class_name’)`のように、タグ名とクラス名を指定することで、より具体的に要素を絞り込むことができます。取得したリストをループ処理することで、一つ一つの要素から情報を抽出できます。</p> <h2>4. より実践的なスクレイピングテクニック</h2> <p>基本的な取得方法がわかったら、次はもう少し実践的なテクニックを学びましょう。Webサイトの構造は様々なので、状況に応じた対応が必要です。</p> <h3>4.1 ページネーション(ページ送り)を考慮する</h3> <p>多くのWebサイトでは、情報が複数ページにわたって表示されます(ページネーション)。例えば、商品一覧や検索結果などがこれにあたります。このような場合、次のページへのリンクをたどって、すべてのページから情報を収集する必要があります。</p> <p>“`python<br />import requests<br />from bs4 import BeautifulSoup</p> <p>base_url = ‘https://example.com/products?page=’<br />all_products = []<br />current_page = 1<br />max_pages = 5 # 例として最大5ページまで取得</p> <p>while current_page <= max_pages:<br /> url = f”{base_url}{current_page}”<br /> print(f”ページを取得中: {url}”)</p> <p>try:<br /> response = requests.get(url)<br /> response.raise_for_status()<br /> html_content = response.text<br /> soup = BeautifulSoup(html_content, ‘html.parser’)</p> <p># ここで各ページから商品情報を抽出する処理を記述<br /> # 例: products_on_page = soup.find_all(‘div’, class_=’product-item’)<br /> # for product in products_on_page:<br /> # name = product.find(‘h2’).text.strip()<br /> # price = product.find(‘span’, class_=’price’).text.strip()<br /> # all_products.append({‘name’: name, ‘price’: price})</p> <p># 次のページへのリンクがあるか確認し、なければループを抜ける<br /> # next_page_link = soup.find(‘a’, class_=’next-page’)<br /> # if not next_page_link:<br /> # print(“次のページが見つかりませんでした。”)<br /> # break</p> <p>current_page += 1<br /> # サーバー負荷軽減のため、少し待機する (例: 1秒)<br /> import time<br /> time.sleep(1)</p> <p>except requests.exceptions.RequestException as e:<br /> print(f”ページ {current_page} の取得中にエラー: {e}”)<br /> break # エラーが発生したら中断</p> <h1>print(f”取得した全商品情報: {all_products}”)</h1> <p>“`</p> <p>この例では、`while`ループを使ってページを順番に巡回しています。各ページで情報を抽出し、`all_products`リストに追加していきます。`time.sleep()`でアクセス間隔を空けることで、サーバーに過度な負荷をかけないように配慮しています。</p> <h3>4.2 `id`や`class`以外の要素を指定して抽出する</h3> <p>Webサイトによっては、意図した要素に`id`や`class`属性が付与されていないこともあります。そのような場合は、親要素や兄弟要素、あるいは要素の順番などを組み合わせて抽出する必要があります。</p> <p>例えば、ある製品詳細ページで、製品名が`</p> <h1>`タグで、その直後に続く`</p> <p>`タグに説明文が書かれているとします。</p> <p>“`python</p> <h1>giả sử html_content chứa thông tin sản phẩm</h1> <p></p> <h1>soup = BeautifulSoup(html_content, ‘html.parser’)</h1> </p> <h1>product_name = soup.find(‘h1’)</h1> <h1>if product_name:</h1> <h1> print(f”製品名: {product_name.text.strip()}”)</h1> <h1> # h1タグの次の兄弟要素である</p> <p>タグを取得</h1> <h1> description_p = product_name.find_next_sibling(‘p’)</h1> <h1> if description_p:</h1> <h1> print(f”説明: {description_p.text.strip()}”)</h1> <h1> else:</h1> <h1> print(“説明文が見つかりませんでした。”)</h1> <h1>else:</h1> <h1> print(“製品名が見つかりませんでした。”)</h1> <p>“`</p> <p>`find_next_sibling(‘tag_name’)`のように、特定のタグの次の兄弟要素を指定することができます。また、`select()`メソッドを使うと、CSSセレクタ記法でより複雑な要素指定が可能です。</p> <h3>4.3 ログインが必要なサイトへの対応(Seleniumの導入)</h3> <p>ログインが必要なサイトや、JavaScriptで動的にコンテンツが生成されるサイトの場合、`requests`だけでは情報が取得できないことがあります。このような場合には、Webブラウザを操作できる`Selenium`というライブラリの導入を検討します。</p> <p>Seleniumを使うと、実際のブラウザ(ChromeやFirefoxなど)をプログラムから操作できます。、ログイン処理やボタンクリック、JavaScriptの実行などを再現し、動的なコンテンツもスクレイピングできるようになります。</p> <p>“`python</p> <h1>from selenium import webdriver</h1> <p></p> <h1>from selenium.webdriver.common.by import By</h1> <p></p> <h1>from selenium.webdriver.chrome.service import Service</h1> <p></p> <h1>from webdriver_manager.chrome import ChromeDriverManager</h1> <p></p> <h1>import time</h1> </p> <h1># Chromeドライバーのセットアップ</h1> <h1>service = Service(ChromeDriverManager().install())</h1> <h1>driver = webdriver.Chrome(service=service)</h1> <h1># ログインページへのアクセス</h1> <h1>login_url = ‘https://example.com/login’</h1> <h1>driver.get(login_url)</h1> <h1># ユーザー名とパスワードの入力フィールドを見つけて入力</h1> <h1># (要素のセレクタはサイトによって異なります。開発者ツールで確認してください。)</h1> <h1>try:</h1> <h1> username_field = driver.find_element(By.ID, ‘username’) # IDが’username’の場合</h1> <h1> password_field = driver.find_element(By.ID, ‘password’) # IDが’password’の場合</h1> <h1> username_field.send_keys(‘your_username’)</h1> <h1> password_field.send_keys(‘your_password’)</h1> <h1> # ログインボタンをクリック</h1> <h1> login_button = driver.find_element(By.XPATH, ‘//button[text()=”ログイン”]’) # ボタンのテキストが’ログイン’の場合</h1> <h1> login_button.click()</h1> <h1> # ログイン後のページに遷移するまで待機</h1> <h1> time.sleep(3)</h1> <h1> # ログイン後のページから情報を取得する処理…</h1> <h1> # driver.get(‘https://example.com/dashboard’)</h1> <h1> # …</h1> <h1>except Exception as e:</h1> <h1> print(f”Selenium操作中にエラー: {e}”)</h1> <h1>finally:</h1> <h1> # ブラウザを閉じる</h1> <h1> driver.quit()</h1> <p>“`</p> <p>Seleniumの学習コストは`requests`や`BeautifulSoup`よりも高めですが、対応できるサイトの幅が格段に広がります。</p> <h2>5. スクレイピングの注意点と倫理</h2> <p>スクレイピングは強力なツールですが、その利用には責任が伴います。ルールを守らないと、自分自身だけでなく、対象となるWebサイトにも迷惑をかけることになります。</p> <h3>5.1 Webサイトの利用規約とrobots.txt</h3> <p>多くのWebサイトでは、利用規約(Terms of Service)でスクレイピングに関するポリシーが定められています。スクレイピングを許可しているか、禁止しているか、あるいは制限があるかなどを確認しましょう。また、`robots.txt`ファイルは、Webサイトがクローラー(プログラム)に対して、どのページへのアクセスを許可するか、または拒否するかを指示するものです。</p> <p>例えば、`https://example.com/robots.txt`に以下のような記述がある場合:</p> <p>“`<br />User-agent: *<br />Disallow: /admin/<br />Allow: /public/<br />“`</p> <p>これは、全てのクローラー(`*`)に対して`/admin/`ディレクトリへのアクセスを拒否し、`/public/`ディレクトリへのアクセスは許可していることを意味します。`robots.txt`を無視してアクセスすると、サイト運営者からの信頼を失い、IPアドレスがブロックされる原因となります。</p> <h3>5.2 サーバーへの負荷を考慮する</h3> <p>プログラムによる自動アクセスは、人間が手動でアクセスするよりもはるかに高速かつ大量に行われる可能性があります。短時間に大量のアクセスを送信すると、Webサイトのサーバーに過剰な負荷がかかり、サイトの表示速度が遅くなったり、最悪の場合サーバーダウンを引き起こしたりする恐れがあります。</p> <p>これを避けるためには、以下のような配慮が必要です。</p> <ul> <li> <strong>アクセス間隔を空ける(`time.sleep()`):</strong> 各リクエストの間に数秒の待機時間を設けます。</li> <li> <strong>リクエスト回数を制限する:</strong> 1日にアクセスするページ数やリクエスト回数を定め、上限を超えないようにします。</li> <li> <strong>`User-Agent`を偽装する(注意が必要):</strong> サイトによっては、特定の`User-Agent`(ブラウザの種類などを識別するもの)からのアクセスを拒否しています。`requests`ライブラリでは、リクエストヘッダーに`User-Agent`を指定できます。ただし、これはサイト運営者に隠れてアクセスしていると見なされる可能性もあるため、慎重に使用する必要があります。</li> <li> <strong>不要なリクエストを避ける:</strong> 必要な情報だけを取得し、無駄なリクエストは行わないようにします。</li> </ul> <p></p> <h3>5.3 個人情報や著作権の取り扱い</h3> </p> <p>スクレイピングで取得した情報には、個人情報や著作権で保護されているものが含まれている可能性があります。</p> <ul> <li> <strong>個人情報:</strong> 氏名、住所、電話番号、メールアドレスなどの個人情報を無断で収集・利用することは、プライバシー侵害にあたり、個人情報保護法に抵触する可能性があります。</li> <li> <strong>著作権:</strong> Webサイト上の文章、画像、動画などは著作権で保護されています。これらのコンテンツを無断で複製・再配布することは、著作権侵害となります。</li> </ul> <p>スクレイピングしたデータをどのように利用するかについては、常に法律や倫理的な観点から慎重に判断する必要があります。利用規約に反する行為や、他者に迷惑をかけるような行為は絶対に行わないようにしましょう。</p> <h2>6. よくある質問 (FAQ)</h2> <h3>Q1. スクレイピングは違法ですか?</h3> <p>A. スクレイピング自体が直ちに違法になるわけではありません。しかし、Webサイトの利用規約に違反したり、不正アクセス禁止法に抵触するような方法で情報を取得したりすると、違法となる可能性があります。また、個人情報の無断取得や著作権侵害も法律違反です。</p> <h3>Q2. `requests`と`BeautifulSoup`以外に、よく使われるライブラリはありますか?</h3> <p>A. はい、`Scrapy`というフレームワークは、より大規模で複雑なスクレイピングプロジェクトに適しています。また、JavaScriptで動的に生成されるコンテンツが多いサイトには、前述の`Selenium`がよく利用されます。`lxml`もHTML/XMLの解析に高速で使われることがあります。</p> <h3>Q3. スクレイピングしたデータを保存するにはどうすればいいですか?</h3> <p>A. 取得したデータは、CSVファイル、JSONファイル、データベースなどに保存するのが一般的です。Pythonの標準ライブラリである`csv`モジュールや`json`モジュールを使うと、簡単にこれらの形式で保存できます。データベースに保存する場合は、`SQLite`や`PostgreSQL`など、目的に応じたデータベースとPythonのライブラリ(例: `psycopg2` for PostgreSQL)を組み合わせて使用します。</p> <h3>Q4. スクレイピングがブロックされてしまいました。どうすればいいですか?</h3> <p>A. ブロックされた原因は、短時間での大量アクセス、不審なUser-Agent、またはrobots.txt違反などが考えられます。まずはアクセス間隔を長くする、リクエストヘッダーのUser-Agentを変更してみる、robots.txtを再確認するといった対策を試みてください。それでも解決しない場合は、サイト運営者に問い合わせるか、スクレイピングを諦めることも検討しましょう。</p> <h3>Q5. Webスクレイピングの学習におすすめのサイトや書籍はありますか?</h3> <p>A. Pythonの公式ドキュメントや、各ライブラリ(`requests`、`BeautifulSoup`、`Selenium`)の公式ドキュメントは非常に参考になります。また、Udemyなどのオンライン学習プラットフォームや、Webスクレイピングに関する入門書も多数出版されています。「Python Webスクレイピング入門」といったキーワードで検索すると、多くのリソースが見つかるはずです。</p> <h2>7. まとめと次のステップ</h2> <p>この記事では、Pythonを使ったWebスクレイピングの基本から実践的なテクニック、そして注意点までを解説しました。</p> <ul> <li> <strong>Pythonとライブラリの準備:</strong> `requests`と`BeautifulSoup`があれば、多くのWebサイトから情報を収集できます。</li> <li> <strong>基本コードの理解:</strong> HTMLの取得から解析、特定要素の抽出まで、簡単なコードで実現できます。</li> <li> <strong>応用テクニックと注意点:</strong> ページネーション対応や、利用規約・robots.txtの確認、サーバー負荷への配慮が重要です。</li> </ul> <p>スクレイピングは、Web上の膨大な情報を自動で収集・活用するための強力なスキルです。今回学んだ内容を基に、まずは簡単なWebサイトで実際にコードを動かしてみてください。慣れてきたら、より複雑なサイトへの挑戦や、取得したデータの分析など、応用の幅を広げていくことができるでしょう。あなたのWebスクレイピング学習の旅が、成功に満ちたものとなることを願っています!</p> <div class="affiliate-box" style="background:#f8f9fa;border-left:4px solid #0073aa;padding:16px;margin:24px 0;"> <p><strong>📌 あわせて読みたい・使ってみたいサービス</strong></p> <p><small>※本記事にはアフィリエイトリンクが含まれます。</small></p> <p><strong>エックスサーバー(bot・ツール公開に)</strong><br />LINE botや自動化ツールを公開するならエックスサーバー。月990円〜、10日間無料お試し。<br /><a href="https://px.a8.net/svt/ejp?a8mat=4B5X89+5CWGS2+CO4+61C2Q" target="_blank" rel="noopener sponsored">▶ エックスサーバーを10日間無料で試す</a></p> <p><strong>Claude仕事術(Amazon)</strong><br />AIで仕事を自動化するノウハウが詰まった1冊。副業・業務効率化を目指す方に。<br /><a href="https://www.amazon.co.jp/dp/4866676825?tag=onetimeless81-22" target="_blank" rel="noopener sponsored">▶ Amazonで見る</a></p> <p><strong>Python自動化の教科書(楽天ブックス)</strong><br />PythonでExcel・Web・メールを自動化。初心者でも動くコード付き。<br /><a href="https://hb.afl.rakuten.co.jp/hgc/140b47a7.a71d7497.140b47a8.833bc318/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16680729%2F" target="_blank" rel="noopener sponsored">▶ 楽天ブックスで見る</a></p> </div> </div><!-- .entry-content .clear --> </div> </article><!-- #post-## --> <nav class="navigation post-navigation" aria-label="投稿"> <div class="nav-links"><div class="nav-previous"><a title="競馬情報収集をPythonで自動化!AI活用で勝利への近道" href="https://onetimeless81.com/%e7%ab%b6%e9%a6%ac%e6%83%85%e5%a0%b1%e5%8f%8e%e9%9b%86%e3%82%92python%e3%81%a7%e8%87%aa%e5%8b%95%e5%8c%96%ef%bc%81ai%e6%b4%bb%e7%94%a8%e3%81%a7%e5%8b%9d%e5%88%a9%e3%81%b8%e3%81%ae%e8%bf%91%e9%81%93/" rel="prev"><span class="ast-post-nav" aria-hidden="true"><span aria-hidden="true" class="ahfb-svg-iconset ast-inline-flex svg-baseline"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'><path d='M134.059 296H436c6.627 0 12-5.373 12-12v-56c0-6.627-5.373-12-12-12H134.059v-46.059c0-21.382-25.851-32.09-40.971-16.971L7.029 239.029c-9.373 9.373-9.373 24.569 0 33.941l86.059 86.059c15.119 15.119 40.971 4.411 40.971-16.971V296z'></path></svg></span> 前</span> <p> 競馬情報収集をPythonで自動化!AI活用で勝利への近道 </p></a></div><div class="nav-next"><a title="Discord botで自動化!初心者向け作り方ガイド" href="https://onetimeless81.com/discord-bot%e3%81%a7%e8%87%aa%e5%8b%95%e5%8c%96%ef%bc%81%e5%88%9d%e5%bf%83%e8%80%85%e5%90%91%e3%81%91%e4%bd%9c%e3%82%8a%e6%96%b9%e3%82%ac%e3%82%a4%e3%83%89/" rel="next"><span class="ast-post-nav" aria-hidden="true">次 <span aria-hidden="true" class="ahfb-svg-iconset ast-inline-flex svg-baseline"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'><path d='M313.941 216H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h301.941v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.569 0-33.941l-86.059-86.059c-15.119-15.119-40.971-4.411-40.971 16.971V216z'></path></svg></span></span> <p> Discord botで自動化!初心者向け作り方ガイド </p></a></div></div> </nav> <div id="comments" class="comments-area comment-form-position-below "> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title">コメントする <small><a rel="nofollow" id="cancel-comment-reply-link" href="/python%e3%82%b9%e3%82%af%e3%83%ac%e3%82%a4%e3%83%94%e3%83%b3%e3%82%b0%e8%b6%85%e5%85%a5%e9%96%80%ef%bc%81%e5%88%9d%e5%bf%83%e8%80%85%e3%81%a7%e3%82%82%e7%b0%a1%e5%8d%98%e8%a7%a3%e8%aa%ac/#respond" style="display:none;">返信をキャンセル</a></small></h3><form action="https://onetimeless81.com/wp-comments-post.php" method="post" id="ast-commentform" class="comment-form"><p class="comment-notes"><span id="email-notes">メールアドレスが公開されることはありません。</span> <span class="required-field-message"><span class="required">※</span> が付いている欄は必須項目です</span></p><div class="ast-row comment-textarea"><fieldset class="comment-form-comment"><legend class ="comment-form-legend"></legend><div class="comment-form-textarea ast-grid-common-col"><label for="comment" class="screen-reader-text">ここに入力…</label><textarea id="comment" name="comment" placeholder="ここに入力…" cols="45" rows="8" aria-required="true"></textarea></div></fieldset></div><div class="ast-comment-formwrap ast-row"> <p class="comment-form-author ast-grid-common-col ast-width-lg-33 ast-width-md-4 ast-float"> <label for="author" class="screen-reader-text">名前*</label> <input id="author" name="author" type="text" value="" placeholder="名前*" size="30" aria-required='true' autocomplete="name" /> </p> <p class="comment-form-email ast-grid-common-col ast-width-lg-33 ast-width-md-4 ast-float"> <label for="email" class="screen-reader-text">メール*</label> <input id="email" name="email" type="text" value="" placeholder="メール*" size="30" aria-required='true' autocomplete="email" /> </p> <p class="comment-form-url ast-grid-common-col ast-width-lg-33 ast-width-md-4 ast-float"> <label for="url" class="screen-reader-text">サイト</label> <input id="url" name="url" type="text" value="" placeholder="サイト" size="30" autocomplete="url" /> </p> </div> <p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。</label></p> <p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="投稿コメント" /> <input type='hidden' name='comment_post_ID' value='195' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p></form> </div><!-- #respond --> </div><!-- #comments --> </main><!-- #main --> </div><!-- #primary --> </div> <!-- ast-container --> </div><!-- #content --> <footer class="site-footer" id="colophon" itemtype="https://schema.org/WPFooter" itemscope="itemscope" itemid="#colophon"> <div class="site-below-footer-wrap ast-builder-grid-row-container site-footer-focus-item ast-builder-grid-row-full ast-builder-grid-row-tablet-full ast-builder-grid-row-mobile-full ast-footer-row-stack ast-footer-row-tablet-stack ast-footer-row-mobile-stack" data-section="section-below-footer-builder"> <div class="ast-builder-grid-row-container-inner"> <div class="ast-builder-footer-grid-columns site-below-footer-inner-wrap ast-builder-grid-row"> <div class="site-footer-below-section-1 site-footer-section site-footer-section-1"> <div class="ast-builder-layout-element ast-flex site-footer-focus-item ast-footer-copyright" data-section="section-footer-builder"> <div class="ast-footer-copyright"><p>Copyright © 2026 Vibe Hacks.lab | Powered by <a href="https://wpastra.com" rel="nofollow noopener" target="_blank">Astra WordPress テーマ</a></p> </div> </div> </div> </div> </div> </div> </footer><!-- #colophon --> </div><!-- #page --> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/astra/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <div id="ast-scroll-top" tabindex="0" class="ast-scroll-top-icon ast-scroll-to-top-right" data-on-devices="both"> <span class="ast-icon icon-arrow"><svg class="ast-arrow-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" width="26px" height="16.043px" viewbox="57 35.171 26 16.043" enable-background="new 57 35.171 26 16.043" xml:space="preserve"> <path d="M57.5,38.193l12.5,12.5l12.5-12.5l-2.5-2.5l-10,10l-10-10L57.5,38.193z" /> </svg></span> <span class="screen-reader-text">上部へスクロール</span> </div> <script> /(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1); </script> <script async data-wp-strategy="async" fetchpriority="low" id="comment-reply-js" src="https://onetimeless81.com/wp-includes/js/comment-reply.min.js?ver=7.0.2"></script> <script id="astra-theme-js-js-extra"> var astra = {"break_point":"921","isRtl":"","is_scroll_to_id":"1","is_scroll_to_top":"1","is_header_footer_builder_active":"1","responsive_cart_click":"flyout","is_dark_palette":""}; //# sourceURL=astra-theme-js-js-extra </script> <script id="astra-theme-js-js" src="https://onetimeless81.com/wp-content/themes/astra/assets/js/minified/frontend.min.js?ver=4.13.4"></script> <script id="wp-emoji-settings" type="application/json"> {"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://onetimeless81.com/wp-includes/js/wp-emoji-release.min.js?ver=7.0.2"}} </script> <script type="module"> /*! This file is auto-generated */ const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))}); //# sourceURL=https://onetimeless81.com/wp-includes/js/wp-emoji-loader.min.js </script> </body> </html>