SNSでWebサイトの更新を紹介するのはよくあると思いますが、定期的に過去に書いた記事も紹介したいなと思ったことはありませんか。
そこで今回は、Pythonを使って自ブログやWebサイトをスクレイピングして、全記事のうち一つをランダムにチョイス、Twitterにツイートするプログラムを紹介します。
・Twitter APIを申請する
まずはTwitterをプログラムで操作できるようにTwitter API登録を申請しましょう。
Twitter APIとは、Twitterが公式に出しているAPI(Application Programming Interface)のことです。Twitterの投稿されたデータをもとに大量のデータを得ることも、上手く使えばTwitterの運営を全て自動で行うbotを作成することも可能です。
今回紹介するプログラムは、このTwitter APIを利用するのですが、登録するにあたり審査があります。
その所感を過去に記事で書いたので、まだ登録されていない方はぜひ参考にしてみて下さい。
【参考記事】Twitter APIの審査が通ったから難易度とか語る
・RobobrowserとTweepyを使ってコードを書く
Twitter APIの登録が完了したら、実際にコードを書いていきますが、スクレイピングするサイトはこのブログとします。
実は以前robobrowserでこのブログを全てスクレイピングする記事を書いたので、ぜひ参考にしてみて下さい。
このコードのガキとなるのがRobobrowserとTwitter APIです。
簡単に説明すると、robobrowserで記事タイトル&リンクをスクレイピングして、それを全てリストにして戻り値として吐き出す関数を定義し、その関数をツイートする関数の変数に入れるという流れです。
全コードは以下の通りです。
import time import random import tweepy from robobrowser import RoboBrowser # Robobrowserオフジェクト作成 browser = RoboBrowser(parser="html.parser") def article_lists(): titles_urls = [] browser.open("https://barniclebattleline.com/") names = browser.select(".entry-card-title") links = browser.select(".entry-card-wrap") # 最初の1ページ全ての記事タイトルとリンクを取得 for i in range(len(names)): titles_urls.append(names[i].text + links[i].get("href")) browser.open("https://barniclebattleline.com/page/2") while True: names = browser.select(".entry-card-title") links = browser.select(".entry-card-wrap") # 残りのページ全ての記事タイトルとリンクを取得 for i in range(len(names)): titles_urls.append(names[i].text + links[i].get("href")) link_to_next = browser.get_link("次のページ") # "次のページ"というテキストを持つリンク取得 if not link_to_next: break # "次のページ"のリンクがない場合はループを抜けて終了する browser.follow_link(link_to_next) # "次のページ"というリンクをたどる return titles_urls def twitter(contents): # twitter_APIのKeys consumer_key = input("Consumer Key: ") consumer_secret = input("Consumer Secret: ") access_key = input("Access Key: ") access_secret = input("Access Secret: ") # インスタンス作成 auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_key, access_secret) api = tweepy.API(auth) # Twitterにツイート api.update_status(random.choice(contents)) twitter(article_lists())
ステップ1:robobrowserの関数を定義する
はじめにrobobrowserでスクレイピングする関数を定義します。
robobrowserのプログラムはbeautifullsoupを組み込んでいるので、似たコードの書き方でほとんど同じ挙動をします。
browser.selectで記事タイトルとリンクに関係する要素をHTMLから探し出し、それぞれnamesとlinksのリストにします。
そのあとにfor文でタイトル+リンクを一つずつ取り出し、更にそれをtitle_linkリストに格納します。
上手くやるとtitles_linksは、
titles_links = (タイトル+URL, タイトル+URL, タイトル+URL, …)
こんな感じになるはずです。
上記のコードではbrowser.openで2回urlを指定していますが、これはpage1のurlだけ指定して実行すると、なぜか最初のpage1だけしかスクレイピングされず、page2を指定するとpage2以降のページが最後までスクレイピングされるという謎の現象が起こるためです。
つまり、1ページ目のurlと2ページ目を指定すると上手く全ページがスクレイピングされるのです。
多分コレはちゃんとした解決法があるのでしょうが今のところ見つからないので、ちゃんとしたやり方を知っている方をそっちを試して下さい、なんならコメント欄にアドバイス下さい。
ステップ2:twitterにツイートする関数を定義する
さて、get_articlesの関数か完成したら、今度はTwitterにツイートする関数を作成します。
Twitter APIを使うには4つのパスワードが必要で、登録が完了した際に発行されます、第三者に渡らないように大事に保管して下さい。
authの定義や実際にツイートするコードの書き方は公式にも載っているので、そのままコピペしても大丈夫ですが、注意したいのがapi.update_statusをする時にランダムモジュール、またはインデックスを指定することです。
これを忘れると、リストに格納されているタイトルとURLが全てツイートされてしまいますので、必ずインデックスで番号、またはランダムで一つだけ取り出すように指定して下さい。
今回はランダムで過去記事を投稿するというプログラムなので、random.choiceで一つチョイスします。
あとはTwitter関数の変数に、robobrowser関数を入れて完成です。
このプログラムを実行すると、ちゃんと自分のアカウントにランダムにひとつだけ過去記事のタイトルとURLがツイートされているのが分かります。
これをcronで定期的に実行すれば、好きなタイミングで過去記事を投下することも出来ますし、お気に入りサイトをスクレイピングして、それを”コレは面白い”や”なんてこった”など当たり障りないコメントとセットで投稿すれば、自動でアカウントを運営させることも出来ます。
まとめ
以上、スクレイピングした記事をランダムにTwitterにツイートする方法の紹介でした。
Twitterは上手く利用すれば影響力のあるメディアになるため、今回のプログラムを応用すれば、きっと効果的にコンテンツを拡散することが出来るでしょう。