0
2

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

【こんにちは!】

今日はニュース見出しチェッカーを強化します

どう強化するかと言いますと前回は見出しを取ってくるだけでしたが
今回は取得した見出しに番号を振って表示して
ユーザーが見たいニュースの番号を入力したら自動で
ブラウザが立ち上がってそのページを開いてくれる機能を
追加していこうと思います!

【早速作っていくぞ!】

とりあえず準備から(復習です)

cdコマンドでプロジェクトのフォルダに移動
    cd path\to\your\projects\news_checker
仮想環境を有効化
    venv\Scripts\activate.bat

Pythonコードを更新

コード3_ブラウザで開けるようにする
    import requests
from bs4 import BeautifulSoup
import webbrowser # ブラウザを操作するためのライブラリをインポート

# 情報を取得したいWebサイトのURL
URL = "https://www.yahoo.co.jp/"

print("Webサイトから情報を取得します...")

try:
    response = requests.get(URL)
    response.raise_for_status()
    
    soup = BeautifulSoup(response.text, "html.parser")
    
    elements = soup.find_all("a", class_="yMWCYupQNdgppL-NV6sMi _3sAlKGsIBCxTUbNi86oSjt")
    
    # 取得した見出しとリンクを保存するための空のリストを用意
    news_list = []
    
    # forループで見出しとリンクをリストに格納していく
    for element in elements:
        # .get_text()でテキストを、.get('href')でリンクを取得
        title = element.get_text()
        link = element.get('href', 'リンクが見つかりません') # .get()で安全に取得
        
        # 取得したタイトルとリンクをセット(辞書)にして、リストに追加
        news_list.append({"title": title, "link": link})

    print("\n--- ニュース見出し一覧 ---")
    # enumerateを使って、番号付きで見出しを表示
    for i, news in enumerate(news_list):
        print(f"[{i + 1}] {news['title']}")
    print("--------------------------")

    # ここから下、ユーザーに入力を促す機能
    # ユーザーが正しい番号を入力するまで繰り返す
    while True:
        try:
            # input()でユーザーからのキーボード入力を受け取る
            choice_str = input("\nブラウザで開きたいニュースの番号を入力してください (終了するにはqを入力): ")
            
            # 'q'が入力されたらプログラムを終了
            if choice_str.lower() == 'q':
                print("プログラムを終了します。")
                break

            # 入力された文字列を整数(数値)に変換
            choice_int = int(choice_str)
            
            # 正しい番号かチェック (1からリストの数まで)
            if 1 <= choice_int <= len(news_list):
                # 選ばれた番号に対応するリンクを取得 (リストの番号は0からなので-1する)
                selected_link = news_list[choice_int - 1]['link']
                
                print(f"「{news_list[choice_int - 1]['title']}」をブラウザで開きます...")
                # webbrowser.open()で、指定したURLを標準のブラウザで開く
                webbrowser.open(selected_link)
                break # ブラウザを開いたらループを抜ける
            else:
                print("エラー:リストにない番号です。もう一度入力してください。")

        except ValueError:
            # 数字以外の文字が入力された場合のエラー処理
            print("エラー:半角数字で番号を入力してください。")

except requests.exceptions.RequestException as e:
    print(f"エラー:情報の取得に失敗しました。")
    print(e)

実行したら...

image.png
あれ?うまくいかない?
ModuleNotFoundErrorとなっていますので
requestというモジュールが見つからないと言われているわけですね
ということで以下のコマンドを実行して
ライブラリをインストールします!

ライブラリのインストール
    venv\Scripts\pip.exe install requests beautifulsoup4

これでどうだ!
image.png
オッケー!!!

ただWebページが表示されない...

いろいろ調べてみたら...

Webに関してはド素人なので深く知らなかったですが
どうやら僕が作ったコードではHTMLしか実行されていないらしい...
JavaScriptを実行させてあげる必要があるので
requestsからSeleniumに変えてあげればいけそうです

Seleniumのインストール
    venv\Scripts\pip.exe install selenium
ブラウザの自動管理ツールのインストール
    venv\Scripts\pip.exe install webdriver-manager

うむ、これでYahooのページは開けるようになった!
自動でWebページを開いたうえで情報を
取得することができるようになりました!
がしかしまだエラーが出てしまう...
たぶんコンテンツの読み込みの待ち時間が足りないと思う...
コードを変更してあげなければ...
変更点は以下のような感じ!

コードの変更点
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC

    try:
        # 最大10秒間、指定した要素が表示されるまで待機する
        wait = WebDriverWait(driver, 10)
        
        # 待機する条件:data-testid="topics-list"を持つ要素が出現すること
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div[data-testid="topics-list"]')))
        
        print("ニュースコンテナの表示を確認しました。")

        except Exception as e:
            print("エラー:待機時間内にニュースコンテナが見つかりませんでした。")
            driver.quit() # ブラウザを閉じて終了
            raise # エラーを発生させてプログラムを停止
    
    # 完全に表示されたページのHTMLを取得
    html = driver.page_source
    driver.quit()

    print("情報の取得に成功しました!")
    
    soup = BeautifulSoup(html, "html.parser")

その後もいろいろやってみたが、Bot対策かなんかでWebページを
開いてくれる機能は追加できない...

一旦別のものを作りに行くか...

もうちょっと技術力を身に着けたらこれも突破できるかもしれないが...
一旦諦めて別のものを作りに行こう...
また戻ってくるぜ...

まとめ

ということで改造失敗ですが、新しく学ぶこともあり
勉強にはなったのでまあいいか...という感じです
Pythonのライブラリについてはまだまだ勉強しないとです...
ライブラリこんなのあります!みたいなのを
次の記事でまとめようかなと思います!
それではまた!

0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?