AWS Lambdaで動的サイトのwebスクレイピングをしてtwitterに投稿するbotを作った
AWS Lambdaで動的サイトのwebスクレイピングをしてtwitterに投稿するbotを作った:
webページからスクレイピングをしたデータを簡単に加工して自動投稿するtwitterのbotを作りました。
完全に初見のLambdaとPythonでできました。
以下のサイトを組み合わせただけのほぼパクリ記事です。作業ログです。
【Python】Chrome headlessで動的サイトのスクレイピング on AWS Lambda
AWS Lambda から Twitter に投稿する
無駄に面倒なAPI Keyとアクセストークンの入手の方法についてですが、この記事では書きません。
macOS Mojave 10.14
Python 2.7.10(3系でもいけるはずです)
Twitter developに登録してAPI Keyとアクセストークンを入手済み
AWSのアカウント
作成したディレクトリにseleniumをインストールします。
今回は最終的にLambdaでプログラムを実行してもらうのでAmazon Linux用のseleniumが必要です。
なので、手っ取り早くCloud9からコマンドを実行してseleniumをダウンロードしました。
参考記事に従ってバージョンも同じものをダウンロードします。
後は作成されたディレクトリごとダウンロードして先ほどの作業ディレクトリの中に置きます。
作業ディレクトリ
htmlを入手した後、データを整形するのにbeautifulsoupを使うので、
これでライブラリのインストールは終わりです。
lambdaにtweetを投稿するlambda_function.pyを作成します。
webスクレイピングそのものはwebscrape.pyのwebscrapeという関数にさせます。
webscraping_tweetbot上でLambdaにアップロードするファイルをzip化します。
Lambdaの関数を作成します。
twitterのbotを作るのでcloudwatch eventへのアクセスのロールを割り当ててます。
ない場合は作りましょう。
作成したzipファイルをアップロードします。10MB以上ですがアップロードはできます。
S3に一度アップロードしてからアップロードをすることもできます。その場合はアップロードさえ終わればS3から消しても大丈夫です。
保存をしてテストを動かして無事グリーンになること確認したら、twitterにちゃんと投稿されているか確認します。
左側のリストからCloudWatch Eventsを選択します。
すると下に設定画面が出てくるのでcron式またはrate式で投稿するスケジュールを設定します。
後は追加して、設定したスケジュールで投稿されたら終了です!お疲れ様でした。
まだ昨日(2018/10/28)からしか動いていないのですが、制作物です。
https://twitter.com/intro_tweetbot
個人的によく行くジャズバーのジャムセッションのスケジュールを1日1回自動でつぶやいています。メンバー見てからセッションに行きたくなったりすることってあるんですよね。それでは!
はじめに
webページからスクレイピングをしたデータを簡単に加工して自動投稿するtwitterのbotを作りました。完全に初見のLambdaとPythonでできました。
以下のサイトを組み合わせただけのほぼパクリ記事です。作業ログです。
【Python】Chrome headlessで動的サイトのスクレイピング on AWS Lambda
AWS Lambda から Twitter に投稿する
無駄に面倒なAPI Keyとアクセストークンの入手の方法についてですが、この記事では書きません。
環境
macOS Mojave 10.14Python 2.7.10(3系でもいけるはずです)
Twitter developに登録してAPI Keyとアクセストークンを入手済み
AWSのアカウント
ディレクトリ作成
$ mkdir webscraping_tweetbot $ cd webscraping_tweetbot
seleniumインストール
作成したディレクトリにseleniumをインストールします。pip
でインストールするのですが、コマンドを実行したOS用のseleniumが自動でインストールされます。今回は最終的にLambdaでプログラムを実行してもらうのでAmazon Linux用のseleniumが必要です。
なので、手っ取り早くCloud9からコマンドを実行してseleniumをダウンロードしました。
参考記事に従ってバージョンも同じものをダウンロードします。
$ pip install selenium==3.13.0 -t .
requests_oauthlibのインストール
作業ディレクトリwebscraping_tweetbot
直下に認証ライブラリであるrequests_oauthlib
をインストールします。twitterに接続する際に必要になります。pip install requests_oauthlib -t ./
serverless-chromiumのダウンロード
requests_oauthlib
をインストールした際にbinディレクトリが作成されているのでそこにダウンロードします。最新版はPythonで動かない(2018年4月27日現在 [参照])ため、v.0.0-37を入れます。
引用: https://qiita.com/nabehide/items/754eb7b7e9fff9a1047d
$ curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip $ unzip headless-chromium.zip -d bin/ $ rm headless-chromium.zip
Chrome driver のダウンロード
serverless-chromium
と同様です。$ curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip $ unzip chromedriver.zip -d bin/ $ rm chromedriver.zip
beautifulsoup4のインストール
htmlを入手した後、データを整形するのにbeautifulsoupを使うので、webscraping_tweetbot
直下にインストールします。$ pip install beautifulsoup4 -t ./
lambda_function.pyの作成
lambdaにtweetを投稿するlambda_function.pyを作成します。webスクレイピングそのものはwebscrape.pyのwebscrapeという関数にさせます。
lambda_function.py
#coding:utf-8 from requests_oauthlib import OAuth1Session from webscrape import webscrape import urllib3 CK = '***' # * enter your Consumer Key * CS = '***' # * enter your Consumer Secret * AT = '***' # * enter your Access Token * AS = '***' # * enter your Accesss Token Secert * URL = 'https://api.twitter.com/1.1/statuses/update.json' def lambda_handler(event, context): tweet=webscrape() session = OAuth1Session(CK, CS, AT, AS) params = {"status": tweet } session.post(URL, params = params)
webscrape.pyの作成
webscrape.py
#coding:utf-8 from selenium import webdriver from bs4 import BeautifulSoup import time def webscrape(): # webdriver settings options = webdriver.ChromeOptions() options.binary_location = "./bin/headless-chromium" options.add_argument("--headless") options.add_argument("--no-sandbox") options.add_argument("--single-process") driver = webdriver.Chrome( executable_path="./bin/chromedriver", chrome_options=options ) # web scraping driver.get("URL") #ここの時間が長いとlambdaの料金が無駄にかかります。driverがページの表示にかかる時間分だけを設定するのが良いです。 time.sleep(0.3) html = driver.page_source.encode('utf-8') return shaping_data(html) def shaping_data(html): soup = BeautifulSoup(html, "html.parser") # 中略(beautifusoupの使い方に関しては他の記事を参照してください。) return tweet_data
Zip化
webscraping_tweetbot上でLambdaにアップロードするファイルをzip化します。zip -r webscraping_tweetbot.zip ./
Lambdaで関数作成
Lambdaの関数を作成します。twitterのbotを作るのでcloudwatch eventへのアクセスのロールを割り当ててます。
ない場合は作りましょう。
lambdaにzipをアップロードしてデプロイ
作成したzipファイルをアップロードします。10MB以上ですがアップロードはできます。S3に一度アップロードしてからアップロードをすることもできます。その場合はアップロードさえ終わればS3から消しても大丈夫です。
保存をしてテストを動かして無事グリーンになること確認したら、twitterにちゃんと投稿されているか確認します。
Cloudwatch Eventsのルール適用
左側のリストからCloudWatch Eventsを選択します。すると下に設定画面が出てくるのでcron式またはrate式で投稿するスケジュールを設定します。
後は追加して、設定したスケジュールで投稿されたら終了です!お疲れ様でした。
作ったもの
まだ昨日(2018/10/28)からしか動いていないのですが、制作物です。https://twitter.com/intro_tweetbot
個人的によく行くジャズバーのジャムセッションのスケジュールを1日1回自動でつぶやいています。メンバー見てからセッションに行きたくなったりすることってあるんですよね。それでは!
コメント
コメントを投稿