WordPressの投稿を自動化しスクレイピングしたデータグラフを添付する

11/3/2020

WordpessのDocker環境が完成したので、Pythonを使った記事投稿の自動化を並行して行いました。
画像もアップロードできるので、スクレイピングしたデータをグラフ化して自動投稿する記事に添付しながら全自動で運用できるようにしました。

完成イメージ

remo_work_test

WordPressにSangoのテーマを反映して、自動化したpythonコードを動かした状態です。
日にちの部分も自動で今日の日付を取得するようにして、自動作成・自動アップロードしたグラフ画像を添付しています。

geeks_graph

棒グラフや円グラフを使い、エージェントによって求人の多い言語数や最高単価を表せるようにしました。
ちなみにこれはギークスのグラフですが、他のフリーランスエージェントを見ても2020年11月時点ではJava案件の割合が多かったです。

記事投稿自動化ロジックについて

WordPressにはREST APIがあるので、 ドメイン名/wp-json/wp/v2/posts のURLに対してJsonをPOSTしてあげると記事が投稿できます。
これを heroku scheduler 等の無料のcronを使って自動化します。

ただし、そのまま使うと誰でもリクエストを投げることが出来て危険なので認証を使います。

Application Passwordsを設定

Application PasswordsをプラグインとしてWordpressにインストール後、
ユーザーのプロフィール画面に「Application Passwords」が存在することを確認します。

ここで xxxX XxXX XxxX Xxxx xxxx xXXX xXXX Xxxx このような形式のパスワードが発行されるので控えておきます。

実装について

クライアントの実装については主にこちらを参考にさせていただきました。
これが実装できると記事投稿や画像のアップロードが自動化できるので、スクレイピングとグラフ化処理が書ければ連携できます。

Pythonでスクレイピングする

前提として、ユーザー登録しないと見れないような情報をスクレイピングするとよろしくないので、誰でも閲覧できる状態にある情報だけを取得します。
また、あまり連続でたくさんの処理を走らせてサーバーに負荷をかけたくないので適当にsleepを挟みます。

import re
import requests
from bs4 import BeautifulSoup
import time

html = requests.get("リクエスト先URL")
soup = BeautifulSoup(html.content, "html.parser")

remote_count = soup.select_one("CSSのユニークな要素").text

# デバッグ用
print(remote_count)

time.sleep(1)

BeautifulSoup を使ってCSSの要素から引っ張っています。
複数の要素の何番目…など難しい位置に存在するhtmlを取ってくる際は、if文を使ったり配列を回すなど一捻り必要ですが基本はこれになります。

スクレイピングしたデータからグラフを作る

chart_create.py を作成して記事投稿を自動化するpythonファイル側でimportしてメソッドを呼び出せるようにします。

import numpy as np
import matplotlib.pyplot as plt

colors = ["#3572A5", "#701516", "#b07219", "#4F5D95", "#e44b23", "#f1e05a", "#e16208", "#85a4e6", "#ffac45", "#EA4DFA", "#2b7489", "#375eab"]
labels = 'Python', 'Ruby', 'Java', 'php', 'HTML', 'JS', 'AWS', 'GCP', 'iOS', 'Android', 'TS', 'Go'

def pie(python, ruby, java, php, html, javascript, aws, gcp, ios, android, typescript, go, agent_name):
    sizes = [python, ruby, java, php, html, javascript, aws, gcp, ios, android, typescript, go]

    fig, ax = plt.subplots()
    ax.pie(sizes, labels=labels, colors=colors, autopct="%1.1f%%", pctdistance=0.7)

    fig.savefig("pie_{0}.png".format(agent_name))

円グラフの出力ロジックです。これで冒頭に記載したような円グラフが出力されます。
引数にagent_nameを渡すことで使いまわせるようにして、ファイル名も動的になるようにしています。引数が多いので可変長引数にした方がメンテしやすいかもしれません。

colorsにはgithubが採用している言語のカラーコードをそのまま適用してなんとなくしっくりくるようにしました。

感想

BeautifulSoup で難解な要素を持ってくるロジックが複雑化する部分や、
普段Rubyばっかり書いているので型チェックとか配列のnullチェックで少し詰まりました。
とりあえず動くものは出来たので、近々デプロイして様子をみたいと思います。

©️ 2020 ふじい Dev-Remo-Work.