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

2019-10-21
seleniumpython
    

目次

概要

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

    
s-yoshiki
s-yoshiki
githubtwitterqiita
Web作ってますが、インタラクティブなプログラミングも好きです。
JavaScript / Vue / node.js / PHP / AWS / OpenCV

関連記事

エンジニアな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…

顔のランドマーク検出とドロネー分割 Python + OpenCV + dlib
環境 デモ サンプルソース 実行結果 リアルタイムでカメラ画像を利用する場合 説明 dlib Subdiv2D 参考 Python + OpenCV + dlib…

ドロネー図を描画 Python + OpenCV
環境 Subdiv2D デモ サンプルソース 説明 実行結果 N = 100 N = 500 N = 1000 N = 5000 参考 タイトルにもあるようにPython + OpenCV…

顔のランドマークを検出 Python + OpenCV + dlib を使う
セットアップ & 環境 OS OpenCV 顔形状の推定モデル デモ ソース 検出結果 おまけ 〜 カメラから読み込み - リアルタイムで検出 他 参考 Python + OpenCV + dlib で顔のランドマークの検出を行う。 具体的には、「dlib…

Python+OpenCVでstitching パノラマ画像生成をやってみた
出力 ソース 他の画像でも試してみた 生成に成功した画像 失敗した画像 環境 参考 PythonでOpenCVのstitchingを利用して複数の写真をつなぎ合わせる方法を紹介します。 いわゆるパノラマ画像と呼ばれるものを生成します。 OpenCV…

最新の投稿

SQL整形ツールを作成した
特徴 使い方 FW/ライブラリ等 nuxt sql-formatter-plus Monaco Editor おまけ ソース SQL整形ツールを作成しました。 URLはこちらです。 SQL…

ファイルの1行目を表示 Linuxコマンド head
head コマンド例 headコマンドでファイルの 1行目もしくは指定した行数だけ表示する方法。 head 利用できるオプション コマンド例 の 1行目だけを表示 の 5行目までを表示 カレントディレクトリ以下の全てのtxtファイルの1行目を表示

Amazon S3 と ローカルファイルのチェックサムの比較
s3apiでEtagを取得 検証 マルチアップロード時の注意点 Amazon S3 の Etagを使ってファイルの整合性チェックをする。 s3apiでEtagを取得 S3 APIを利用するとEtagを取得します。この値はmd5のハッシュ値になります。 検証 MD…

github.io / gitlab.ioで公開されている質の高い技術ドキュメント
AWSによるクラウド入門 Pythonプログラミング入門 普通の人が資産運用で99点をとる方法とその考え方 2018年の段階で私が知らないこと github.io / gitlab.io で無料で公開されている興味深いドキュメントのmemo AWS…

10進数から2進数 2進数から10進数への変換 JavaScript
10進数から2進数 2進数から10進数 テスト 10進数から2進数、2進数から10進数への変換を行うJavaScriptのコードの紹介。 JSの場合、10進数から2進数への変換はメソッド。2進数から1…

JavaScriptの配列ショートハンド (AtCoder用)

JavaScriptでワーシャルフロイド法を実装
AtCoder ABC012 D問題 D - バスと避けられない運命 解説 実装 AtCoder ABC012 の D問題でワーシャルフロイド法が利用できる問題が出てきたので、 JavaScriptで実装しました。 AtCoder ABC012 D問題 D…

GitHub Actions で Gatsby をビルドし Amazon S3 にデプロイする
GitHub Actions について あらかじめ準備しておくもの AWS IAM ユーザを環境変数にセットする workflowの記述 ビルド バッジを利用する 終わりに 参考にしたところ Gatsbyで作った静的サイトを、GitHub Actions…

cloudinaryによる画像ファイルの管理 はじめてみる
目的 cloudinary について 他のサービスとの比較 料金プラン アカウントの登録 利用してみる ダッシュボード 画像の編集 APIベースでのアクセス 感想 参考 画像の管理や配信、さらには加工といった事ができるsaas型のcloud…

JavaScriptによる2分探索(バイナリサーチ) のサンプルコード
2分探索について ソース 参考 JavaScriptで2分探索(バイナリサーチ)を実装してみました。…

Tags

Dates

© 2020   404 motivation not found