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のアカウント


ディレクトリ作成

$ 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へのアクセスのロールを割り当ててます。

ない場合は作りましょう。



スクリーンショット 2018-10-29 12.08.19.png



lambdaにzipをアップロードしてデプロイ

作成したzipファイルをアップロードします。10MB以上ですがアップロードはできます。

S3に一度アップロードしてからアップロードをすることもできます。その場合はアップロードさえ終わればS3から消しても大丈夫です。



スクリーンショット 2018-10-29 12.11.37.png


保存をしてテストを動かして無事グリーンになること確認したら、twitterにちゃんと投稿されているか確認します。


Cloudwatch Eventsのルール適用

左側のリストからCloudWatch Eventsを選択します。



スクリーンショット 2018-10-29 12.17.40.png


すると下に設定画面が出てくるのでcron式またはrate式で投稿するスケジュールを設定します。



スクリーンショット 2018-10-29 12.24.26.png


後は追加して、設定したスケジュールで投稿されたら終了です!お疲れ様でした。


作ったもの

まだ昨日(2018/10/28)からしか動いていないのですが、制作物です。
https://twitter.com/intro_tweetbot

個人的によく行くジャズバーのジャムセッションのスケジュールを1日1回自動でつぶやいています。メンバー見てからセッションに行きたくなったりすることってあるんですよね。それでは!

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)