twitterで鍵垢の人の動向が気になる!
きっかけ
ターゲットがツイッターで遊んでないか取り締まりたい!!
ウェブスクライピングしてみたかった!
API使えば?的なはなしは知らん!!
(APIだと鍵垢の人の情報持ってこれるんかな?)
やりたいこと
特定ユーザのツイッターを監視してツイートしたら通知をだす!!
実装方法
Pythonでrequestsとlxmlを使ってウェブスクライピングをする!
osはmacです.
requests, lxmlのインストール
pipでいれるだけです
pip install requests pip install lxml
requestではなく,requestsなので注意!!(間違えてて一瞬はまってた)
しかし,lxmlをインストールしている時に問題発生!
Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
調べてみたところ,brewでlibxml2がいれれるらしい,
ということでいれてみる.
ついでにlibsxsltもいれておく
brew install libxml2 libxslt
このコマンドを実行したら無事にpipでlxmlがインストールできました.
ちなみに,ウェブスクライピング系のライブラリはけっこうたくさんあるらしく,やりたい人は調べてみるといいかもしれません.
実装
現在のツイート数を持ってくる
ターゲットのURLのhtmlを持ってきて,そこからXpathを指定してツイート数を取得してくる.
まずはターゲットのhtmlを取得
import lxml.html import requests TARGET_USER = 'testID' TARGET_URL = 'https://twitter.com/' + TARGET_USER # htmlソースコードの取得 html = requests.get(TARGET_URL).text root = lxml.html.fromstring(html)
やや時間がかかってしまうのは気になるところ・・・
次にツイート数を取得してくる.
どうやらツイート数は
'/html/body/div[contains(@id,"doc")]/div/div/div/div/div/div/div/div/div/div[contains(@class,"ProfileNav")]/ul/li[1]/a/span[2]'
にあるみたいだったので,そこを指定する.
指定の仕方が少し雑な気もするがそこはスルーで!
ついでにとってきたツイート数には"6,439"みたいに間にカンマが入ってるからそれは削除しておく.
TARGET_VALUE_XPATH = '/html/body/div[contains(@id,"doc")]/div/div/div/div/div/div/div/div/div/div[contains(@class,"ProfileNav")]/ul/li[1]/a/span[2]' # ツイート数が乗っている要素までたどっていく val = root.xpath(TARGET_VALUE_XPATH)[0].text tweet_num = int(val.replace(',', '')) print(tweet_num)
ということで,現在のツイート数を持ってくることは成功!
ツイートしたら通知する
一定時間ごとに現在のツイート数をもってきて,前回と同じ値にならなかったら通知する! あとは大した処理は残っていない!
スリープを挟んだ無限ループで一定時間ごとに監視していきます.
特に大したことはしてないので,詳しくは最後にソースコードをいれときます.
通知部分は適当なサイレン音とともにターゲットがツイッターをしたことを音声で教えてくれることにした!
まとめ
とっさの思いつきで実装した今回のシステムでしたが,思ったよりも簡単にできて個人的には満足した!
この程度のものがウェブスクライピングというかは知りません.
ターゲットがツイートするたびにサイレンがなってけっこうおもしろかった!
うおおおおおおおおおおん!!! (ターゲットの名前)がツイートしました!!
今回のポイントは鍵垢ユーザに対しても監視できる点かなと思います.
ツイートした時間も取得するようにすれば,鍵垢ユーザがいつツイッターしてるかもわかるようになりそう!
ソースコード
import lxml.html import requests import time import os TARGET_USER = 'testUser' TARGET_URL = 'https://twitter.com/' + TARGET_USER TARGET_VALUE_XPATH = '/html/body/div[contains(@id,"doc")]/div/div/div/div/div/div/div/div/div/div[contains(@class,"ProfileNav")]/ul/li[1]/a/span[2]' AUDIO = 'siren.mp4' MESSAGE = TARGET_USER + 'がツイッターしています!!!' def getTweetNum(): # htmlソースコードの取得 html = requests.get(TARGET_URL).text root = lxml.html.fromstring(html) # ツイート数が乗っている要素までたどっていく val = root.xpath(TARGET_VALUE_XPATH)[0].text return(int(val.replace(',', ''))) def notify(): os.system('afplay ' + AUDIO) os.system('say ' + MESSAGE) if __name__ == '__main__': old_num = getTweetNum() while True: print(TARGET_USER + 'のツイッター監視中') cur_num = getTweetNum() if not old_num == cur_num: print('ツイートした!!!') notify() old_num = cur_num time.sleep(60)