python: webスクレイピングで検索を自動化する

プログラミング
スポンサーリンク




こんにちは、おみです。

日々の業務でわからないことがあった時、ブラウザを開いて検索することが多いですが、検索の度にブラウザを開くのは面倒です。

そこで、内容を入力して検索ボタンを押すと、検索結果を自動で表示するGUIアプリケーションを開発します。

今回はひとまず検索を行い、結果を表示するところまでの機能を実装したいと思います。

スポンサーリンク

アプリケーションの説明

アプリケーションを起動しておき、

検索欄に知りたいことを入力し、searchボタンを押すと

google chromeで検索結果が自動で表示されます。

ソースコード

↓ファイル構造

・Main.py

import tkinter as tk

from src.Model import Model
from src.View import View
from src.Controller import Controller


class Application(tk.Frame):
    def __init__(self, root):
        # スーパークラスのコンストラクタを呼び出し
        super().__init__(root)

        # モデルをインスタンス化
        self.model = Model(root)

        # ビューをインスタンス化
        self.view = View(root, self.model)

        # コントローラーをインスタンス化
        self.controller = Controller(root, self.model, self.view)

        # Viewにメソッドをセット
        self.view.btn_search["command"] = lambda: self.controller.call_btn_clicked()

        # 画面の設定
        root.geometry(str(self.model.width) + "x" + str(self.model.height))
        root.title(self.model.title)


def main():
    root = tk.Tk()
    window = Application(root)
    window.mainloop()


if __name__ == "__main__":
    main()

・Model.py

import configparser as c
import tkinter as tk
from selenium import webdriver


class Model(object):
    def __init__(self, root):
        # ---------------------------------
        # 初期設定
        # ---------------------------------
        # configファイルを読み込み
        self.config = c.ConfigParser()
        self.config.read("config.ini")

        # 画面サイズを取得
        self.title = self.config["DISPLAY_INFO"]["title"]
        self.width = self.config["DISPLAY_INFO"]["width"]
        self.height = self.config["DISPLAY_INFO"]["height"]

        # 画面パーツに入力した値を格納する変数を宣言
        self.ent_search_text = tk.StringVar()

    # ボタンクリック時起動メソッド
    def btn_clicked(self):
        # ここにwebページを表示する処理を記述
        browser = webdriver.Chrome()

        browser.get("https://www.google.com/search?q={}".format((self.ent_search_text.get())))

・View

import tkinter as tk


class View(object):
    def __init__(self, root, model):
        self.root = root
        self.model = model

        # ---------------------------------
        # 画面の部品を生成
        # ---------------------------------
        # 検索欄ラベル
        self.lbl_search = tk.Label(
            root,
            text="word"
        )

        # 検索欄
        self.ent_search = tk.Entry(
            root,
            textvariable=model.ent_search_text,
            width=30
        )

        # 検索ボタン
        self.btn_search = tk.Button(
            root,
            text="search",
            command=lambda: model.btn_clicked()
        )

        # ---------------------------------
        # 画面の部品を配置
        # ---------------------------------
        self.lbl_search.grid(row=0, column=0)
        self.ent_search.grid(row=0, column=1)
        self.btn_search.grid(row=0, column=2)

・Controller.py

class Controller(object):
    def __init__(self, root, model, view):
        self.root = root
        self.model = model
        self.view = view

    # 検索ボタンクリック時起動メソッドを定義
    def call_btn_clicked(self):
        self.model.btn_clicked()

・config.ini

[DISPLAY_INFO]
title = "検索結果取得"
width = 400
height = 30

詳細の説明

今回、Webブラウザを自動で起動し、表示するためにseleniumというライブラリを使用しています。

表示処理の内容を要約すると、

(1) Google Chromeのインスタンスを生成します。

browser = webdriver.Chrome()

(2) URLを指定し、Google Chromeを開きます。

browser.get("https://www.google.com/search?q={}".format((self.ent_search_text.get())))

 

引数のURLはフォーマット指定になっており、Viewのent_searchに入力した内容をURLに記入し、ブラウザを開きます。

次回

次回は、検索結果のうち上位数件を表示するように処理を修正したいと思います。

参考文献

↓ChromeDriverインストール方法

Selenium環境用 ChromeDriverのインストールとアップデート方法|dot blog
ブラウザを起動することなく操作可能なPhantomJSのメンテナーVitalyさんが引退するためSeleniumによるサポートが終了することになりました。今後は…ッドレスバージョン推奨となったためインストールやアップデート方法を解説します。

↓selenium学習に使用したページ

10分で理解する Selenium - Qiita
Seleniumとは Selenium は Web ブラウザの操作を自動化するためのフレームワークです。 2004 年に ThoughtWorks 社によって Web アプリケーションの UI テストを自動化する目的で開発されま...

↓Entryに入力した文字列と変数を紐づける方法

【Python GUI tkinterサンプル】ttk.Entryの入力された値を取得しコンソールに出力する | エンジニアになりたいブログ
<tkinterトップページに戻る> 使用するオプション textvariable 使い方 var = StringVar() ttk.Entry(textvariable=var) ttk.Entryのtextvariableオプションに対してWidget変数を与えることでEntryで入力された値を取得することが可能...

コメント

タイトルとURLをコピーしました