[Python]WordPressの自動更新をしてみた

Pythonのお勉強 No5 WordPressの自動更新

はじめに

前回、Pythonで「WoedPressの自動投稿」をしました。

今回は、前回投稿した記事を更新し常に最新ニュースが表示されるよう「WoedPressの自動更新」を行ってみたいと思います。

更新する記事の内容は?

前回、「香川真司」と「久保建英」の最新ニュースを1件「ブログカード」形式でWordPressに投稿しました。これを10件に増やして、常に最新の10件に更新されるようにしたいと思います。

  • ニュースを「ブログカード」形式で更新する
  • 抽出するニュースの件数は10

記事を更新するためのURL、パラメータ

URL : wp-json/wp/v2/posts/<id>

パラメータ : 以下の値をJSON文字列にして設定します

  • content : 記事の内容

ブログカードを複数件出力する

前回、「Cocoon」におけるブログカードの表示方法を確認しました。

ブログカードの表示方法

<a href=”リンク先URL”>リンク先URL</a>

同じように、content<a>タグを10件流し込みましたが、うまく「10件のブログカード」と認識してくれませんでした。

WordPressでブログカードを複数件入力して確かめる

実際にWordPress上で「ブログカード」を2件入力したときのHTML構造を確認します。

<a>タグが<p>タグで囲われているのことが分かります。

これを踏まえて、<p><a>リンク先URL</a></p>と「1つの段落に1つのリンク」を置くことで、無事にブログカードと認識してくれました。

複数件のブログカードの表示方法

<p><a href=”リンク先URL①”>リンク先URL①</a></p>

<p><a href=”リンク先URL②”>リンク先URL②</a></p>

PythonでWordPressの自動更新をしてみる

環境

WordPress

  • WordPress : 5.3.2
  • Cocoon Child : 1.0.7

Python

  • python 3.6.9
  • requests 2.21.0
  • urllib3 1.24.3
  • bs4 0.0.1

ソースコード

# Pythonのお勉強 No.5 WordPressの自動更新
import requests
import urllib
from bs4 import BeautifulSoup

# スクレイピング対象
URL = 'https://news.google.com/search'
KEYWORD = "香川真司 OR 久保建英"

# WordPress接続情報
WP_URL = 'https://xxxx.com'
WP_USERNAME = 'userName'
WP_PASSWORD = 'xxxx xxxx xxxx xxxx xxxx xxxx'

ARTICLE_ID = "9999"

# ニュース取得関数
def get_news(keyword):

    params = {'hl':'ja', 'gl':'JP', 'ceid':'JP:ja', 'q':keyword}

    # url、パラメータを設定してリクエストを送る
    res = requests.get(URL, params=params)
    print('ニュース取得結果:{}'.format(res))
    return res

# WordPress更新関数
def post_article(id, content):

    # REST APIを使うための認証情報
    user_ = WP_USERNAME
    pass_ = WP_PASSWORD
    # 更新情報
    payload = {"content": content}      #内容
               
    # 記事の更新を行う
    res = requests.post(urllib.parse.urljoin(WP_URL,  "wp-json/wp/v2/posts/" + id),     #"wp-json/wp/v2/posts/<id>"にPostすると更新になる
                        json=payload,                                                   #投稿する記事の内容を設定する
                        auth=(user_, pass_))                                            #ユーザとアプリケーションパスワードを設定する
    print('WP投稿結果:{}'.format(res))
    return res

# メイン
article_no = 1
content = '香川真司と久保建英の最新ニュースです。'

res = get_news(KEYWORD)
soup = BeautifulSoup(res.content, "html.parser")

# レスポンスからh3階層のニュースを抽出する(classにxrnccdを含むタグ)
h3_blocks = soup.select(".xrnccd")

for i, h3_entry in enumerate(h3_blocks):

    # 記事を10件だけ処理する
    if article_no == 11:
        break
    
    # ニュースのリンクを抽出する(h3タグ配下のaタグのhref属性)
    link = h3_entry.select_one("h3 a")["href"]
    # 抽出したURLを整形して絶対パスを作る
    link = urllib.parse.urljoin(URL, link)

    content = content + '<p><a href="' + link + '">' + link + '</a></p>\n'
    article_no = article_no + 1

    # h3階層のニュースからh4階層のニュースを抽出する
    h4_block = h3_entry.select_one(".SbNwzf")

    if h4_block != None:
        # h4階層が存在するときのみニュースを抽出する
        h4_articles = h4_block.select("article")

        for j, h4_entry in enumerate(h4_articles):
            link = h4_entry.select_one("h4 a")["href"]
            link = urllib.parse.urljoin(URL, link)

            content = content + '<p><a href="' + link + '">' + link + '</a></p>\n'
            article_no = article_no + 1

# 記事を更新する
post_article(ARTICLE_ID, content)

実行結果

最新ニュース10件分を「ブログカード」形式で表示するように更新することが出来ました。

次回

次は、「Pythonスクリプトの定期実行」をして、毎日ニュースが自動で更新されるようにしてみようと思います。

コメント

  1. 村上貴樹 より:

    はじめまして

    独学でプログラミングを勉強している者です。
    ネットでユーチューブを見たり色々と調べています。

    記事が非常に勉強になりました。ありがとうございます。

タイトルとURLをコピーしました