Selenium + Python でYahooのログインや検索・メールの操作を自動化する。

2019-10-21
seleniumpythongoogle%20chrome
    

目次

概要

Selenium + PythonでYahooメールの各種メールボックスの操作を自動化する方法の紹介です。

環境

今回紹介する方法はmac上にselenimu環境を構築しています。

  • macOS catalina
  • Python3.7
  • Selenium
  • ChromeDriver

Selenium環境の構築

Seleniumのインストール

まずはじめにSeleniumをpipでインストールします。

$ pip install selenium

続いて、ChromeDriverをbrew経由でインストールします。

ChromeDriverは、Selenium WebDriverがChromeを制御するために使用する別個の実行ファイルです。

$ brew install chromedriver

検証

from selenium import webdriver
driver = webdriver.Chrome()

正しくインストールされていると、上記のコードを実行した際にChromeが立ち上がります。

Yahoo検索する

ここから実践編です。まずは簡単に実装できるヤフーの検索の実装の紹介です。

具体的には検索のテキストボックスや検索ボタンの要素を取得してイベントを実行するというものです。

サンプルソース

from selenium import webdriver
from selenium.webdriver.common import keys
import time

driver = webdriver.Chrome()

## 検索
def search(word):
    # "p"は検索ボックスのname
    driver.find_element_by_name("p").send_keys(word)
    # "_63Ie6douiF2dG_ihlFTen"は検索ボタンのクラス
    driver.find_element_by_class_name("_63Ie6douiF2dG_ihlFTen").click()

search("Selenium")

Yahooにログイン/ログアウトする

次にヤフーにログインする実装の紹介です。

ポイントとなるのはtime.sleep(2)を挿入して待ち時間を作っています。ヤフーのログイン画面はIDを入力した後にJSのイベントが走るので、"待ち"を作って考慮しています。

from selenium import webdriver
from selenium.webdriver.common import keys
import time

driver = webdriver.Chrome()

## Login
def login(username, password):
    driver.get("https://login.yahoo.co.jp/config/login")
    driver.find_element_by_id("username").send_keys(username)
    driver.find_element_by_id("btnNext").click()
    time.sleep(2)
    driver.find_element_by_id("passwd").send_keys(password)
    driver.find_element_by_id("btnSubmit").click()

また、ログアウトは次のコードとなります。比較的簡単に実装できました。

## Logout
def logout():
    driver.get("https://login.yahoo.co.jp/config/login?logout=1")

Yahooメールの操作〜ゴミ箱を空にする

次はYahooメールの操作についての実装です。

ここではゴミ箱の中身を全て削除するサンプルを紹介します。

Yahooメールの受信メール関連の操作は、概ね共通であり、受信ボックス画面(TOP)に遷移した後、

  1. 任意のタブ or メニューを選択
  2. 項目の操作
  3. イベント実行
  4. モーダルウィンドウの対応

、、、という流れになります。

ゴミ箱の操作であれば、

  1. ゴミ箱を選択
  2. 任意の項目を選択 (サンプルソースでは全メール選択)
  3. 削除実行
  4. OKボタンのモーダル操作

という流れになります。

def deleteTrashMail():
    driver.get("https://jp.mg5.mail.yahoo.co.jp/")
    driver.find_element_by_id("Trash").click()
    time.sleep(1)
    driver.find_element_by_class_name("focusable").click()
    time.sleep(1)
    driver.find_element_by_id("h_delete").click()
    time.sleep(1)
    driver.find_element_by_id("okModalOverlay").click()

サンプルソース

from selenium import webdriver
from selenium.webdriver.common import keys
import time

driver = webdriver.Chrome()

## 検索
def search(word):
    driver.find_element_by_name("p").send_keys(word)
    driver.find_element_by_class_name("_63Ie6douiF2dG_ihlFTen").click()

## Login
def login(username, password):
    driver.get("https://login.yahoo.co.jp/config/login")
    driver.find_element_by_id("username").send_keys(username)
    driver.find_element_by_id("btnNext").click()
    time.sleep(2)
    driver.find_element_by_id("passwd").send_keys(password)
    driver.find_element_by_id("btnSubmit").click()

## Logout
def logout():
    driver.get("https://login.yahoo.co.jp/config/login?logout=1")

def _deleteSelectedMails():
    time.sleep(1)
    driver.find_element_by_class_name("focusable").click()
    time.sleep(1)
    driver.find_element_by_id("h_delete").click()
    time.sleep(1)
    driver.find_element_by_id("okModalOverlay").click()

## 受信メール削除
def deleteReceivedMail():
    driver.get("https://jp.mg5.mail.yahoo.co.jp/")
    _deleteSelectedMails()

## 下書きメール削除
def deleteDraftMail():
    driver.get("https://jp.mg5.mail.yahoo.co.jp/")
    driver.find_element_by_id("Draft").click()
    _deleteSelectedMails()

## 迷惑メール削除
def deleteBulkMail():
    driver.get("https://jp.mg5.mail.yahoo.co.jp/")
    driver.find_element_by_id("Bulk").click()
    _deleteSelectedMails()

## 送信メール削除
def deleteSentMail():
    driver.get("https://jp.mg5.mail.yahoo.co.jp/")
    driver.find_element_by_id("Sent").click()
    _deleteSelectedMails()

## ゴミ箱メール削除
def deleteTrashMail():
    driver.get("https://jp.mg5.mail.yahoo.co.jp/")
    driver.find_element_by_id("Trash").click()
    _deleteSelectedMails()

## main
if __name__ == '__main__':
    try:
        login("ididididid", "passpasspass")
    except:
        print('error:login')
    try:
        deleteReceivedMail()
        time.sleep(3)
    except:
        print('error:deleteReceivedMail')
    try:
        deleteDraftMail()
    except:
        print('error:deleteDraftMail')
    try:
        deleteBulkMail()
    except:
        print('error:deleteBulkMail')
    try:
        deleteSentMail()
    except:
        print('error:deleteSentMail')
    try:
        deleteTrashMail()
    except:
        print('error:deleteTrashMail')
    try:
        logout()
    except:
        print('error:logout')
    driver.close()

参考

http://chromedriver.chromium.org/getting-started

    

関連記事

AWS Amplify で コンテナベースのデプロイを行い REST API を構築
検証した環境 やってみる 初期準備 パイプラインを確認 終了処理 参考 AWS Amplify で コンテナベースのデプロイを行い REST API を構築した際のメモです。 検証した環境 amplify 5.1.…

Pythonでソケット通信を実装しメッセージの送受信を行う
ソース server.py client.py 動かしてみる 参考 Pythonでソケット通信を実現する方法です。 ソース server.py サーバ側のソースです。 client.py…

CentOS8 に Python + OpenCV をインストール
インストール テスト CentOS8 で標準で提供されているパッケージで Python + OpenCV 環境を構築する方法です。 検証した環境は CentOS8.3 (Docker) です。 インストール まず opencv…

Python poetryでパッケージ開発 PyPIで公開 Pytestでテスト CIをGitHub Actionsで回す
Poetry でパッケージ開発 pytest でユニットテストを実施しカバレッジを算出する パッケージをビルドし PyPI で公開する 検証環境にデプロイする 本番環境にデプロイする GitHub Actions で CI を回す codecovの設定 GitHub…

エンジニアなMacBookのセットアップ 開発環境の構築
ブラウザ関連 Homebrewのインストール ターミナル環境系 Hyper エディタ VSCode typora CLIツール Git 言語系 Python node.js MacBookPro…

JPG画像を圧縮する OpenCV + Python
環境 説明 ソース セットアップ 実験 ブログなどにアップする画像を比較的簡単に圧縮する方法がないか探していたところ、 PythonとOpenCVで簡単に実装出来そうでした。 そこで、Python + OpenCV…

Python + OpenCVで顕著性 (saliecy) マップを実装
顕著性マップ OpenCVに用意されている3つの顕著性検出アルゴリズム Static saliency StaticSaliencySpectralResidual_create() StaticSaliencyFineGrained_create…

Python + OpenCVのfillConvexPolyで複雑なポリゴンを描画する
サンプル fillPolyと何が違うのか 参考 Python + OpenCVのfillConvexPoly…

Python+OpenCVで任意の画像領域:ROIのみに処理 マスク画像を使って
やりたいこと(やったこと) 実装方法 Python + OpenCVで任意の画像領域のみに処理を加えるサンプルを1つ紹介します。 やりたいこと(やったこと) こんな感じで、任意の画像領域(矩形でなくてもよい)のみをグレースケール、…

OpenCVのチャンネルエラー対処: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function 'binary_op'
詳細 参考 Python + OpenCVのスクリプトを書いていたところ、タイトルにあるようなエラーが出現しました。 結果的にはnumpyの配列のサイズが異なるのが原因だったようです。 詳細 下記のソースはPython…

最新の投稿

[Mac]ipコマンドの導入[iproute2mac]
iproute2macについて 導入 homebrewで導入 直接インストール 確認 サポートコマンド を導入して、macOSでipコマンドを導入した際のメモ iproute2macについて brona/iproute2mac: CLI wrapper for…

AutotoolsでconfigureやMakefileの作成
はじめに Autotools 環境 準備 ツール類のインストール ソースコードの作成 configure.ac と Makefile.am configure Makeの生成 その他 makeオプション autoreconf について Perlの場合 リンク はじめに C…

RPMパッケージ作成 Dockerを利用して
はじめに RPMパッケージ step1.環境構築からRPMパッケージングまで 事前準備 ワークスペースの作成 プログラム配置 specファイル rpmbuild インストール リンク はじめに Dockerを利用してRPM開発環境を用意し、実際にRPM…

RPMのspecファイルで利用するマクロ・変数
はじめに マクロ一覧 基本情報系 Body項目 コメント 参考文献 はじめに RPM(Fedora/CentOS系)を作成する際に利用するspecファイルで利用できるマクロについて調べた際のメモです。 マクロ一覧 基本情報系 パッケージの名前を定義します。これはspec…

CentOS8/RHEL8でのRPM管理における検討事項
初めに 前提 rpm rpm yum dnf コマンド リポジトリ リポジトリとライフサイクル AppStream Compatibility Level について AppStreamのサポート期間 Yum v3 -> Yum v4 リンク 初めに CentOS8/RHEL…

homebrewでnodejsインストール&任意のバージョン利用
初めに homebrewインストール nodejsの検索 インストール nodejsの利用 初めに homebrewでサクッとnodejsのインストールを行なった際のメモです。 環境はMacを対象としていますが、Linux…

tracerouteコマンドでネットワークの経路を洗い出す
tracerouteの用途 tracerouteの原理 IPヘッダのTTL コマンドを実行してみる 参考文献 tracerouteコマンドでネットワークの経路を洗い出した際の操作をメモしました。 環境はmacで実施しています。 また、traceroute…

[Vue]フロントエンド機能のみでダウンロードを実装する[JS]
実装 ポイント ソース デモ 参考サイト フロントエンドのみ(=サーバサイドがダウンロードさせない) でダウンロードを行う機能を実装した時のメモです。 Vueを利用して実装していますが、ここで記載しているコードはVueに依存した機能ではなく、ピュアなJSのAPI…

Node.js で作成した REST API を Docker化
Node.jsでREST APIを作成 コンテナ化 コンテナ化定義 コンテナ化作業 参考 Node.js で作成した REST API を Docker化した際のメモです。 Node.jsでREST APIを作成 まずはNode.js…

JavaScriptで優先度付きキューを実装する
優先度付きキューについて ソース 参考 JavaScriptで優先度付きキュー (プライオリティキュー) を実装する 優先度付きキューについて 具体的には次のような機能があります。 キューに対して要素を優先度付きで追加 (push…

Tags

Dates

s-yoshiki
s-yoshiki
githubtwitterqiita
ただの備忘録です。
JS/TS/node.js/PHP/AWS/OpenCV/CentOS
※このブログの内容は個人の見解であり、所属する組織等の見解ではありません。
© 2022   404 motivation not found