[Python] seleniumでHeadless Chromeを使い、インストール済みのWordPressのプラグイン情報を取得してみた。

この記事は[Python] seleniumでHeadless Chromeを使い、WordPressのプラグイン情報を取得してみた。の続きです。

前回はHeadless Chromeでプラグイン名を検索し、情報を取得するということを行いました。

今回は、既に自分のWordPressにインストールされているプラグイン情報を自動で取得し、csvファイルに保存できるようにしたいと思います。

流れ

ヘッドレスクロームを使い、スクレイピングをしていきます。

  1. ログインページヘ移動

  2. ログイン

  1. プラグインページへ移動

  1. プラグインの詳細を表示

  1. プラグイン情報を取得

  1. 取得した情報をcsvファイルに保存

おおまかな流れは以上になります。

実装

これをseleniumを使って実装していきます。seleniumのインストール方法や使い方は以下のサイトを参考にしてください。

コード

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にインストールされているプラグインであれば、今回のように取得する方が良いと思います。途中いくつか躓いてしまいましたが、その解決法については以下の記事で紹介しているので、もしも同じ問題で悩んでいる方がいましたら参考にしてみてください。