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スクリプトの定期実行」をして、毎日ニュースが自動で更新されるようにしてみようと思います。
コメント
はじめまして
独学でプログラミングを勉強している者です。
ネットでユーチューブを見たり色々と調べています。
記事が非常に勉強になりました。ありがとうございます。