TOP

twitterのスクレイピングbot

このエントリーをはてなブックマークに追加

ホーム > 個人開発したことまとめ > twitterのスクレイピングbot

twitterのスクレイピングbot

ロマサガRSというソシャゲをやってて、新キャラが実装されるたびに絵師さんがこんなツイートしてたりする。

キャラクタは大量にいるし、いつ誰が公開するかもわからないので自動的に情報収集して検索できるようなもの作れないかな?
 ⇒そうだ!スクレイピングだ!(!?)



作ったもの(実際に稼働したときのツイート)

勝手に拾ってリツイート



勝手に自分のサイトに公開


勝手にひとつ前の作品を拾ってリツイート



どんな仕組み?



botが勝手に情報収集して勝手にDB登録して勝手に公開してくれる、手間のかからない素敵システム。

pythonソースコード(bot)
Java servlet
JSP


ぶつかった壁とか学んだこととか

timezone関係。以下のようなエラーが発生した。

エラー内容
Traceback (most recent call last):
File "/pythonscheduler.py", line 32, in <module>
schedule.run_pending()
File "/usr/local/lib/python3.10/site-packages/schedule/__init__.py", line 780, in run_pending
default_scheduler.run_pending()
File "/usr/local/lib/python3.10/site-packages/schedule/__init__.py", line 100, in run_pending
self._run_job(job)
File "/usr/local/lib/python3.10/site-packages/schedule/__init__.py", line 172, in _run_job
ret = job.run()
File "/usr/local/lib/python3.10/site-packages/schedule/__init__.py", line 661, in run
ret = self.job_func()
File "/artist_rt/SagaRsPictures.py", line 296, in searchArt
searchKoushikiPic(api)
File "/artist_rt/SagaRsPictures.py", line 38, in searchKoushikiPic
if dt_now_bfr > result.created_at.astimezone(datetime.timezone(datetime.timedelta(hours=DIFF_JST_FROM_UTC))):
TypeError: can't compare offset-naive and offset-aware datetimes

can't compare offset-naive and offset-aware datetimes ???何言ってんの???だったんだけど、どうやらpythonのdatetimeオブジェクト(日時=日付と時刻を扱う)とtimeオブジェクト(時刻を扱う)はnaiveawareの2種類に分類されるらしい。
ざっくり言うと、

  • naive:timezone無しのオブジェクト
  • aware:timezone付きのオブジェクト

先に乗せたpythonコードの189行目、今は「datetime.datetime.now(JST)」となっているが、以前は「datetime.datetime.now()」となっていたのでnaiveなオブジェクトだった。
同コードの28行目の「if dt_now_bfr > result.created_at + datetime.timedelta(hours=DIFF_JST_FROM_UTC)」でtwitter apiで取得したツイート時刻(UTCが指定されているのでaware)とdatetime.datetime.now()の10分前(native)を比較しようとしているが、pythonの仕様でawareとnativeは比較できないのでエラーになっていた。ということらしい。
「datetime.datetime.now()」の前に「JST = timezone(timedelta(hours=+9), 'JST')」でJSTのtimezoneを生成し、それをnowの引数に渡す(dt_now = datetime.datetime.now(JST))ことでawareなオブジェクトにして対処した。


参考