daisukeの技術ブログ

AI、機械学習、最適化、Pythonなどについて、技術調査、技術書の理解した内容、ソフトウェア/ツール作成について書いていきます

URLからタイトルを取得するPythonのGUIアプリを作りました(url2title)

URLをコピーしてクリップボードに送ると、Webスクレイピングで記事のタイトルを取得して表示するPythonのGUIアプリ(url2title)を作りました。

自分のはてなブログの記事のURLが日付の場合に、パッと見たときに、何の記事?となることがよくあります。そんなとき、いちいちブラウザで開いてタイトルを確認するのが手間なので、ツールとして作ってみました。

最近は、記事を書くときに、それらしいURLを設定するようにしてるのですが、過去の記事はURLを変更する勇気もなく、困っていたので作りました!

それでは、やっていきます!

はじめに

今回作ったGUIアプリは、前回紹介した「TkEasyGUI」を使ってます。前回の記事はこちらです。

daisuke20240310.hatenablog.com

また、URLからタイトルに変換する方法は、以前に紹介したWebスクレイピングを使ってます。そのときの記事はこちらです。

daisuke20240310.hatenablog.com

この両方の内容を組み合わせただけの簡単GUIアプリです。

あと、一応、スクレイピングを使っているので、どこでもアクセスしていいわけではないので、自分のサイトに限定して使っていただく制限を入れています。

では、使い方の説明と、ソースコードの説明をしていきます。

事前準備

ここでは、Windowsで使う方法を説明します。GUIアプリの名前は「url2title」とします。

Pythonをインストールしていることが前提になります。

一応、ダウンロード先だけ示しておきます。

www.python.org

Pythonのライブラリがいくつか必要になります。

コマンドプロンプトなどで、以下の3つのパッケージをインストールします。

pip install requests beautifulsoup4 TkEasyGUI

準備は以上です。

url2titleの使い方

まず、以下からダウンロードします。

github.com

上をクリックすると以下のような画面になると思うので、ダウンロードボタンを押すとダウンロードできます。下の方にソースコードを貼ってますので、それをコピーしてエディタに貼り付ける方法でも大丈夫です。

ダウンロード方法
ダウンロード方法

ダウンロードしたファイル「url2title.pyw」を適当なエディタで開きます。ソースコードをコピーした方は、ファイル名は何でもいいですが、拡張子は「pyw」にする必要があります。「pyw」にすることで、ダブルクリックで実行できるようになります。

ここではIDLEのエディタを使います。

ファイルを右クリックして、「Edit with IDLE」をクリックして開きます。

8行目を変更する必要があります。ダウンロードした「url2title」の状態だと、変換できるURLが、私のブログのページだけに限定されています。私のブログのトップページのURLを設定しているので、ここを自分のサイトのトップページのURLに書き換えてください。

URLの変更
URLの変更

では、「url2title」を、ダブルクリックして起動します。

すると、小さなウィンドウの「url2title」が起動します。

あとは、タイトルを調べたいURLをコピーしてクリップボードに入れると、タイトルが表示されると思います。

実演動画gif
実演動画gif

この例ではリンクを右クリックしてURLをコピーしていますが、https://daisuke20240310.hatenablog.com/entry/2024/04/04/032847 という文字列をコピーしても同じことが出来ます。

簡単ですが、使い方は以上です。

ソースコードの説明

ソースコードの説明をします。

一応、「TkEasyGUI(Python)で簡単GUI(PySimpleGUI有料化に伴い移行します!) - daisukeの技術ブログ」と、「PythonでWebスクレイピング(ChatGPTにPythonコードを生成してもらう) - daisukeの技術ブログ」でも説明したので、今回は流れだけの説明にしたいと思います。

上から8行目のMYURLという変数が、上でも説明した変更が必要なところです。

import TkEasyGUI as eg
import pyperclip
import requests
from bs4 import BeautifulSoup

DEBUG = False #True
TITLE = "url2title.py"
MYURL = "https://daisuke20240310.hatenablog.com"

def get_title( url ):
    
    try:
        # ページを取得
        response = requests.get( url )
        response.raise_for_status()  # エラーチェック
        
        # BeautifulSoupでHTMLをパース
        soup = BeautifulSoup( response.text, 'html.parser' )
        
        # タイトルを取得
        title = soup.title.text.strip()
        
        if DEBUG: print( f"URL: {url} - タイトル: {title}" )
        
        return title
    
    except Exception as e:
        print(f"エラーが発生しました: {e}")

def main():
    
    layout = [ [eg.Text("", key='text')] ]
    
    window = eg.Window( TITLE, layout, size=(700, 60) )
    
    getdata = pyperclip.paste()
    getdata_old = ""
    
    while True:
        
        # ウィンドウ表示
        event, values = window.read( timeout=1000 )
        if event != "__TIMEOUT__" and event != "-TIMEOUT-":
            if event == eg.WIN_CLOSED:
                break
        
        getdata = pyperclip.paste()
        
        if getdata == getdata_old:
            continue # 取得したクリップボードのデータが前回と同じなら何もしない
        
        else:
            
            txt = getdata
            
            if MYURL in getdata:
                
                # 自分のURL以外は対象としない
                
                title = get_title( getdata )
                
                if DEBUG: print( f"getdata={getdata}, title={title}" )
                
                if title is not None:
                    txt = "URL:" + getdata + "\n" + "タイトル:" + title
            
            window['text'].update( txt )
            
            getdata_old = getdata
    
    window.close()

if __name__ == '__main__':
    main()

全体の流れとしては、真ん中ぐらいにある「while True:」の無限ループをずっと回っています。

  • window.read():1秒ごとにクリップボードを確認するために起き上がります
  • getdata = pyperclip.paste():クリップボードから内容を取得します
  • if MYURL in getdata::取得したURLが自分のサイトを含んでいるかどうかを判定しています
  • get_title():スクレイピングの関数をコールしています
  • タイトルが取得できたら、URLと組み合わせて、2行の文字列を作って、GUIパーツに反映します

簡単ですが説明は以上です。

それから、このソースコードは自由に変更して使って大丈夫です。一応、再配布はダメということにしておきます。

クリップボードを使ったアプリは、アイデア次第で、とても便利なものになると思うので、活用して頂けたらと思います。

例えば、日をまたぐ時間の差の計算(3日前の22:43から今日の3:05までとか)って、暗算で計算するのは少し面倒ですよね。2つの時刻並べて書いておき、コピーするだけで時間差を表示するアプリを作っておくと便利です。

また、和暦と西暦の変換とか、指定したアスキーコードから値を表示するとか、便利そうです。

終わりに

今回は、Pythonで、簡単なGUIアプリを作ってみました。

Google Search Consoleで、URLを見ただけでは、何のページか分からず、いちいちアクセスして確認するのが面倒だったので作ってみました。

今回は以上です!

最後までお読みいただき、ありがとうございました。