nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

Anaconda Promptをバッチファイル化する

はじめに

Anaconda Promptのコマンドから、手動でAnaconda仮想環境を起動するのは大変です。

そのような場合はbatファイル化するといよいでしょう。

anaconda promptは、activate.batというバッチファイルから起動が可能です。

インストール階層(通常C:\Users\ユーザー\Anaconda\)のScripts\activate.bat

に存在しています。

これをコマンドプロンプトにて、以下のように起動できます

`call C:\Users\ユーザー\Anaconda\Scripts\activate.bat{ ※ユーザーは任意の階層

call C:\\Users\\ユーザー\\Anaconda\\Scripts\\activate.bat

call conda -V

call activate Test

cd Test_Folder_Path

call pyinstaller test.py --clean -F

xcopy /Y /Q /S /E dist\*.* ..\..\bin

call exit

参考リンク

beautifulsoup4でスクレイピング

はじめに

beautifulsoup4でスクレイピングを行います。

インストールコマンド

参考リンク

Python Webスクレイピング テクニック集「取得できない値は無い」JavaScript対応@追記あり6/12 - Qiita

WPF開発復習

WPF開発復習

WPF開発技術を復習します。(かなり忘れているため・・・)

参考サイト

jupyter Notebookのコードをexe化する方法 [Anaconda3環境]

jupyter Notebookのコードをexe化する方法 [Anaconda3環境]

jupyter Notebookのコードをexe化する方法を記録します。

手順

  1. まず、Jupyter Notebookを開き、以下のイメージのように、メニューのFile⇒Downlaod as ⇒ Python (.py)を選択してください。

  1. 次に、Anaconda Promptから、conda install pyinstallerを実行して、pyinstallerパッケージをインストールします。

  2. pyinstaller 実行したいPythonファイル --clean -F

2つあるオプションは以下の目的で付けています。 --clean : 前回ファイル削除 -F : 実行時に必要なファイルが1つのexeファイルに集約される

[例] pyinstaller Google_Search_Using_XPath.py --clean -F

作成されたexeファイルは、exeファイルはpyinstallerを実行したカレントディレクトリに生成されるdistフォルダ内に出力されます。

注意点

なお、chromedriver.exeファイルを使用する場合は、作成したexeファイルから参照可能なパスである必要があります。同じ階層に置くとよいでしょう。

参考ページ

あとがき

比較的簡単にexe化を実行することができました。

なお、pyinstallerによって作成されたexeファイルを実行するとコンソールが表示されます。これを消去するのはPythonでは難しそうです。C#なら可能のようです。

python - HeadlessモードでChromeDriverを起動したときにコンソールが表示されないようにする - スタック・オーバーフロー

リンク

How to Package Python Apps With PyInstaller

SeleniumをEXEで動かす - Qiita

Python + Selenium + ChromeでGoogleの検索を自動化する [非headlessモード][XPath]

はじめに

本記事は、Python + Selenium + ChromeGoogleの検索を自動化する手法について記載したものです。

今回は、XPathを使用して、検索を行います。

XPathとは

XPathXML文章中の要素、属性値などを指定するための言語です。 XPathではXML文章をツリーとして捉えることで、要素や属性の位置を指定することができます。 HTMLもXMLの一種とみなすことができるため、XPathを使ってHTML文章中の要素を指定することができます。

(※記事記載時点(2019/10/17)では本記事のコードが動作することを確認していますが、Googleのデザイン等が変われば動作しなくなる可能性があります。ご了承ください)

環境

環境は以下のとおりです。パッケージの管理はAnacondaで実施しています。pythonコードの実行はjupyter Noteboookを使用しております。

  • OS : Windows 10 Pro
  • conda version : 4.7.12
  • conda-build version : 3.18.9
  • python version : 3.7.4.final.0
  • selenium : 3.141.0
  • ChromeDriver : 77.0.3865.40

XPathを用いた検索方法

XPathを用いた検索方法は、以下の記事で分かりやすく説明してあります。

本記事のサンプルコードでは、Full XPath(絶対XPathパス)を用いてWebページの要素を取得しています。

XPathを用いれば、以下のように、要素にID指定やclass名指定がなくても、テストしたいページのタグ構成から要素を掴むことが可能です。

element = driver.find_element_by_xpath("/html/body/form[1]")

XPathを用いて、要素を操作する処理は何度も繰り返すと思いますので、関数化するとよいと思います。

# XPathを用いて、ボタンをクリックする
def click_button_using_XPath(element_XPath : str):
    
    element = WebDriverWait(driver, MAX_WAIT_TIME_SEC).until(
        EC.presence_of_element_located((By.XPATH, element_XPath))
    )
    
    element.click()
    
    return element

サンプルコード

Googleの検索を自動化したコードです。検索文字列を入力してEnterキーを押した後、ニュースボタンを押します。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

MAX_WAIT_TIME_SEC = 100


# ChromeDriverのパスを引数に指定しChromeを起動
CHROME_DRIVER_PATH = "chromedriver.exe"
options = Options()

driver = webdriver.Chrome(executable_path=CHROME_DRIVER_PATH, options=options)
driver.maximize_window() # 画面表示を最大化する

# 指定したURLに遷移する
web_site = 'https://www.google.com/'
driver.get(web_site )


# XPathを用いて、ボタンをクリックする
def click_button_using_XPath(element_XPath : str):
    
    element = WebDriverWait(driver, MAX_WAIT_TIME_SEC).until(
        EC.presence_of_element_located((By.XPATH, element_XPath))
    )
    
    element.click()
    
    return element

    
# XPathを用いて、テキストボックスに文字列を入力する
def input_textbox_using_XPath(element_XPath : str, send_code : str):
    
    element = WebDriverWait(driver, MAX_WAIT_TIME_SEC).until(
        EC.presence_of_element_located((By.XPATH, element_XPath))
    )
    
    # 検索テキストボックスをクリアする
    for item in range(0,100) :
        element.send_keys(Keys.BACK_SPACE)
                                 
    element.send_keys(send_code)
    
    return element

    
# テキストボックスに検索ワードを入力して、直後にEnterキーを押す
input_textbox_using_XPath("/html/body/div/div[4]/form/div[2]/div[1]/div[1]/div/div[2]/input", "test").send_keys(Keys.RETURN)


# ニュースボタンを押す
click_button_using_XPath("/html/body/div[7]/div[3]/div[5]/div/div/div[1]/div/div/div[1]/div/div[2]/a")


driver.close() # ウィンドウを閉じることが出来ます。閉じることが出来るのは引数にブラウザのバイナリを指定したインスタンスウインドウのみ

driver.quit() # 「quit」を実行することで全てのウィンドウを閉じることが出来ます。

リンク

Seleniumを安定稼働させるために行うべき3つの設定(Headlessモードにも対応) | たぬハック