1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python でブログカード機能を実装

Posted at

はじめに

本記事では、ブログやウェブサイトでよく見られるブログカード機能を実装するために、外部のウェブページからそのページのメタデータ(タイトル、OG タグで指定された画像や説明文など)を取得する方法を紹介します。

ブログカードとは以下のようなものです。

必要なツールとライブラリ

  • Python: バージョンは 3.x を推奨
  • requests: HTTP リクエストを簡単に送信するためのライブラリ
  • BeautifulSoup: HTML および XML を解析するためのライブラリ

依存関係のインストール

必要なライブラリをインストールします。

pip3 install requests beautifulsoup4

fetch_url_metadata 関数の実装

import requests
from bs4 import BeautifulSoup

# 引数として URL を受け取り、その URL から取得したメタデータを含む辞書を返す
def fetch_url_metadata(url):
    try:
        # 指定された URL に対して HTTP GET リクエストを送信し、レスポンスを取得
        response = requests.get(url)

        if response.status_code != 200:
            # リクエストが失敗した場合、空のメタデータを返す
            return {
                "url": "",
                "title": "",
                "og_title": "",
                "og_image": "",
                "og_site_name": "",
                "og_description": "",
            }

        # レスポンスを UTF-8 でデコードし、BeautifulSoup で解析可能な形式に変換
        content = response.content.decode('utf-8', errors='ignore')
        soup = BeautifulSoup(content, 'html.parser')

        # メタデータの抽出
        title = soup.title.string if soup.title else ''
        og_title = soup.find('meta', property='og:title')
        og_image = soup.find('meta', property='og:image')
        og_site_name = soup.find('meta', property='og:site_name')
        og_description = soup.find('meta', property='og:description')

        metadata = {
            "url": url,
            "title": title,
            "og_title": og_title['content'] if og_title else '',
            "og_image": og_image['content'] if og_image else '',
            "og_site_name": og_site_name['content'] if og_site_name else '',
            "og_description": og_description['content'] if og_description else '',
        }

        return metadata
    except:
        # エラーが発生した場合、空のメタデータを返す
        return {
            "url": "",
            "title": "",
            "site_img": "",
            "og_title": "",
            "og_image": "",
            "og_site_name": "",
            "og_description": "",
        }

# 動作確認
if __name__ == '__main__':
    url = 'https://example.com'
    metadata = fetch_url_metadata(url)
    print(metadata)

動作確認

python3 get_meta_data.py

{'url': 'https://example.com', 'title': 'Example Domain', 'og_title': '', 'site_img': '', 'og_image': '', 'og_site_name': '', 'og_description': ''}

外部サイトのコンテンツを取得する際の注意点

  • 利用規約の遵守
    外部サイトのコンテンツを取得する前に、そのサイトの利用規約を確認し、遵守する必要があります。
  • 法的な規制の遵守
    コンテンツの使用に関する法的な制約や著作権についても留意する必要があります。
  • クロールの頻度制限
    外部サイトからのデータを頻繁に取得する場合、そのサイトのサーバーに負荷をかけることになります。robots.txt ファイルに記載されたクローリングの許可や制限を尊重する必要があります。
  • セキュリティ
    外部サイトからのデータを処理する際には、セキュリティ上のリスクにも留意してください。不正な入力や XSS 攻撃を防ぐ必要があります。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?