この記事は[Python] seleniumでHeadless Chromeを使い、WordPressのプラグイン情報を取得してみた。の続きです。
前回はHeadless Chromeでプラグイン名を検索し、情報を取得するということを行いました。
今回は、既に自分のWordPressにインストールされているプラグイン情報を自動で取得し、csvファイルに保存できるようにしたいと思います。
流れ
ヘッドレスクロームを使い、スクレイピングをしていきます。
ログインページヘ移動
ログイン
- プラグインページへ移動
- プラグインの詳細を表示
- プラグイン情報を取得
- 取得した情報をcsvファイルに保存
おおまかな流れは以上になります。
実装
これをseleniumを使って実装していきます。seleniumのインストール方法や使い方は以下のサイトを参考にしてください。
- [Python] seleniumでHeadless Chromeを使い、WordPressのプラグイン情報を取得してみた。
- headless chromeをpythonで動かしてみた
- https://kurozumi.github.io/selenium-python/
コード
plugin_research.py ----------------------------------------------------- import sys import time import csv from getpass import getpass from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options def main(): ### input login information ### loginURL = input("login URL: ") domain = input("IP or domain name: ") username = input("username: ") password = getpass("password: ") pluginURL = "http://" + domain + "/wp-admin/plugins.php" ### option setting ### options = webdriver.ChromeOptions() options.add_argument("--headless") options.add_argument("--disable-gpu") options.add_argument("--window-size=1280x1696") options.add_argument("--disable-application-cache") options.add_argument("--disable-infobars") options.add_argument("--no-sandbox") options.add_argument("--hide-scrollbars") options.add_argument("--enable-logging") options.add_argument("--log-level=0") options.add_argument("--single-process") options.add_argument("--ignore-certificate-errors") options.add_argument("--homedir=/tmp") driver = webdriver.Chrome(options=options) ### login ### login(loginURL, username, password, driver, pluginURL) filename = domain + ".csv" with open(filename,"w") as csvfile: writer = csv.writer(csvfile) writer.writerow(["プラグイン名","バージョン","アップデートバージョン","サイト","対応PHP","対応WordPress","検証済みWordPress","備考"]) ### get active plugin information ### print("有効化されているプラグイン") for plugin in driver.find_elements_by_css_selector("tr.active"): if(plugin.find_elements_by_css_selector("td.plugin-title")): search_plugin(plugin, driver, writer) ### get inactive plugin information ### print("有効化されていないプラグイン") for plugin in driver.find_elements_by_css_selector("tr.inactive"): if(plugin.find_elements_by_css_selector("td.plugin-title")): search_plugin(plugin, driver, writer) driver.quit() return 0 def login(loginURL, username, password, driver, pluginURL): driver.get(loginURL) time.sleep(3) assert "WordPress" in driver.title print(driver.title) ### login ### driver.find_element_by_css_selector("#user_login").send_keys(username) driver.find_element_by_xpath("//*[@id='user_pass']").send_keys(password) driver.find_element_by_css_selector("#wp-submit").click() time.sleep(3) assert "WordPress" in driver.title print(driver.title) ### move to plugin page ### driver.get(pluginURL) time.sleep(3) assert "WordPress" in driver.title print(driver.title) return 0 def get_data(item, data): keyword = item.text.split(":") if(keyword[0] == "バージョン"): data[2] = keyword[1] elif(keyword[0] == "WordPress.org プラグインページ »"): data[3] = item.find_element_by_css_selector("a").get_attribute("href") elif(keyword[0] == "必須 PHP バージョン"): data[4] = keyword[1] elif(keyword[0] == "WordPress の必須バージョン"): data[5] = keyword[1] elif(keyword[0] == "対応する最新バージョン"): data[6] = keyword[1] return data def search_plugin(plugin, driver, writer): data = ["","","","","","","",""] print("\n" + plugin.text) name = plugin.find_element_by_tag_name("strong").text version = plugin.find_element_by_css_selector("div.second.plugin-version-author-uri").text.split(" ")[1] data[0] = name data[1] = version if(plugin.find_elements_by_css_selector("a.thickbox.open-plugin-details-modal")): link = plugin.find_element_by_css_selector("a.thickbox.open-plugin-details-modal") driver.execute_script("arguments[0].scrollIntoView(true);", plugin) link.click() time.sleep(3) # print("\n" + driver.title) ### change frame ### driver.switch_to_frame(driver.find_element_by_tag_name("iframe")) for item in driver.find_elements_by_css_selector("div.fyi > ul > li"): # print(item.text) ### get plugin information ### data = get_data(item,data) ### change frame ### driver.switch_to.default_content() driver.find_element_by_css_selector("button#TB_closeWindowButton").click() time.sleep(3) writer.writerow(data) print(data) return 0 if __name__ == "__main__": main()
実行方法
$ python plugin_research.py login URL: xxxxxxxxxxx IP or domain name: xxxxxxxxxxxxx username: xxxxxxxxxxxx password: xxxxxxxxxxxx
実行結果
上の画像のようにcsv形式でプラグイン情報を保存できていることが確認できました。
さいごに
前回の記事ではプラグインをWordPressで検索することで情報を取得していましたが、既に自分のWordPressにインストールされているプラグインであれば、今回のように取得する方が良いと思います。途中いくつか躓いてしまいましたが、その解決法については以下の記事で紹介しているので、もしも同じ問題で悩んでいる方がいましたら参考にしてみてください。