年収がニ年間で100万円以上下がった。
会社から地面に叩きつけられ、蹴飛ばされ、挙げ句の果てには踏みつけられ気分だ。
この数ヶ月は、平日の食費を削って100円単位で小遣いを貯めてきた。
平日の昼食は、会社で賞味期限が近く無料提供していた保存食を大量に手に入れて、それだけを食べて生活してる。
おそらく3000円程度は貯まっただろう。
そもそも普段から食費を削っているので雀の涙程度の効果しか無いが、お腹が減るのをグッと我慢して節約中だ。
さらに、格安データSIMを2つ契約していたので、一つを解約してSIMを返却した。
数日後、深夜帰宅中に急にスマホがネットに繋がらなくなった。
翌朝、通信会社に電話をかけた。
私「もしもし。昨日から手元のSIMがネットに繋がりません。」
担当「あぁ、おそらく手元のSIMが解約されたモノですね。」
電話口から低い声が聞こえてきた。
私「返却済のSIMを送り戻すことは可能ですか?」
担当「日にちが経過してるので、既に廃棄している可能性があります。」
私「その場合、どうなりますか?」
焦りで鼓動が早くなっているのを感じた。
担当「事務手続き料金3000円払って再契約です。」
なんだってーー!
日経平均株価が最高値更新中にも関わらず、未だダブルインバースを保有しており、数10万円単位で損失を出し続けている。
ただ今回は、自分の不注意で金銭を失った。
「自分がこんなにも愚かな存在だったとは・・・・」
やるせない気持ちの中、帰路の夜道は北風がいつもより心にも沁みてくるように感じた。
氷点下だったからね。
東京の明日は0℃予想 関東各地で真冬の冷え込みに 昼間も今日より寒くなる予想
真冬に比べると日差しの力強さが増している分、日向ではしのぎやすいものの、空気そのものは冷たい一日です。
2021/02/08 17:24 ウェザーニュース
TwitterをスクレイピングするライブラリTwitterScraper が動作しなくなった。
このライブラリへの対応も時間がかかったのに、稼働期間は半年と持たなかった。
2020年10月頃から動いてなかったようだが、魚釣りに没頭していて全く把握してなかった。
コードは趣味で書いている方だが、ずっと保守・維持ばかりしている。
だから、いつまでたっても技術スキルが社内で底辺だ。
Twitterのスクレイピングができるライブラリを調査する
「TwitterScraper 」を修正する・・・という事も考えたが、代替案があるのであれば、そっちを使いたい。
scweet を使ったTwitterスクレイピング
最初に目に入ったのは「TwitterScraper 」のGitHubのISSUE欄に、大量に書き込まれていた次の文章。
Hello, TwitterScraper doesn’t work since Twitter changed its API. Here is an alternative for you to work with : scweet. I’ll try to extract more features in the next days.
【超意訳】
やぁ!TwitterがAPIを変更したため、TwitterScraperは機能しないよ~ん。
あなたがに送る代替手段、そ・れ・は「scweet」!
数日中にさらに多くの機能を抽出しようと思ってるよ!
ウザい広告書き込みの、自称「データ分析屋」のモロッコ人(学生)。Linkedin見たらインターンシップ経験しただけじゃん。
ライブラリの説明を読むとSeleniumを使ったTwitterスクレイピングを作ったようだ。
まぁ誰が作っても動けば構わないので、さっそくダウンロードして呼び出してみた。
ただ、この学生はimportして親フォルダから呼び出す想定をしていない気がする。
そして同一フォルダに非コードがあったり、グチャグチャだよ・・・。
学生なら許されるけど、中途採用なら落とされるよ。知らんけど。
で、実行するとエラー。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ /home/ukyo/.pyenv/shims/python sample2021.py Traceback (most recent call last): File "sample2021.py", line 7, in <module> headless=True, display_type="image", hashtag=None, save_images=True) File "/home/ukyo/www/cron_topsy/Scweet/scweet.py", line 25, in scrap driver = init_driver(headless, proxy, show_images) File "/home/ukyo/www/cron_topsy/Scweet/utils.py", line 121, in init_driver chromedriver_path = chromedriver_autoinstaller.install() File "/home/ukyo/.pyenv/versions/3.7.7/lib/python3.7/site-packages/chromedriver_autoinstaller/__init__.py", line 15, in install chromedriver_filepath = utils.download_chromedriver(cwd) File "/home/ukyo/.pyenv/versions/3.7.7/lib/python3.7/site-packages/chromedriver_autoinstaller/utils.py", line 166, in download_chromedriver chrome_version = get_chrome_version() File "/home/ukyo/.pyenv/versions/3.7.7/lib/python3.7/site-packages/chromedriver_autoinstaller/utils.py", line 100, in get_chrome_version platform, _ = get_platform_architecture() File "/home/ukyo/.pyenv/versions/3.7.7/lib/python3.7/site-packages/chromedriver_autoinstaller/utils.py", line 53, in get_platform_architecture raise RuntimeError('Could not determine chromedriver download URL for this platform.') RuntimeError: Could not determine chromedriver download URL for this platform. |
Seleniumを使っているのでchromedriverがいる。
深堀りしても良かったが、作者の広告行動が気に食わないのと、ググるともっと有名なツールが見つかったので、即削除。
Seleniumを使うという発想が安直だ。株の自動売買は私もSelenium使おうとしてるけどさ。
twint を使ったTwitterスクレイピング
Twitterのスクレイピングの記事が、昨年の10月、11月頃から日本語で増えている・・ように感じる。
そのブロガー達が口を揃えて「オススメ」と言っているライブラリがこれ。
インストール方法
こっちのtwintはpipを使ってインストールできる。
1 |
$ pip install twint |
インストールが完了するとコマンドラインでも使える。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ twint -s "uguisu.skr.jp" --since "2015-12-20 20:30:15" CRITICAL:root:twint.get:User:'NoneType' object is not subscriptable CRITICAL:root:twint.run:Twint:Feed:noDataExpecting value: line 1 column 1 (char 0) sleeping for 15 secs CRITICAL:root:twint.run:Twint:Feed:noDataExpecting value: line 1 column 1 (char 0) sleeping for 15 secs CRITICAL:root:twint.run:Twint:Feed:noDataExpecting value: line 1 column 1 (char 0) sleeping for 27.0 secs CRITICAL:root:twint.run:Twint:Feed:noDataExpecting value: line 1 column 1 (char 0) sleeping for 64.0 secs CRITICAL:root:twint.run:Twint:Feed:noDataExpecting value: line 1 column 1 (char 0) sleeping for 125.0 secs |
なんか知らないけどエラーが出た。
上記の方法で動かない場合は、一度twintをアンインストールして、こちらの方法で再度インストールするとうまく動作できるらしい。親切ね。
1 |
$ pip install --user --upgrade git+https://github.com/twintproject/twint.git@origin/master#egg=twint |
使い方
説明するまでもないぐらい公式ページに親切に書かれている。
1 2 3 4 5 6 |
c = twint.Config() c.Search = "検索文字" c.Store_csv = True c.Output = "出力csvファイル名" c.Since = datetime.strftime(since, '%Y-%m-%d') twint.run.Search(c) |
非常に簡単。
csv出力されるので、差分マージを含めて実装したコードは次のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import twint import csv import os import shutil from datetime import datetime, timedelta import functools print = functools.partial(print, flush=True) ORG_CSV_PATH = "to_csv_out.csv" TMP_CSV_PATH = "tmp.csv" def csv_merge(): with open('test.csv','w') as n: f = open(ORG_CSV_PATH, 'r') reader = csv.reader(f) header = next(reader) m = open(TMP_CSV_PATH, 'r') tmp_reader = csv.reader(m) writer = csv.writer(n) for row in tmp_reader: writer.writerow(row) for row in reader: writer.writerow(row) m.close() f.close() shutil.move("test.csv", ORG_CSV_PATH) def fetch_tweet(query): today = datetime.today() if (os.path.isfile(ORG_CSV_PATH)): since = today - timedelta(days=1) else: print("new csv") # 7 years since = today - timedelta(weeks=364) c = twint.Config() c.Search = query c.Store_csv = True c.Output = TMP_CSV_PATH c.Since = datetime.strftime(since, '%Y-%m-%d') twint.run.Search(c) if __name__ == "__main__": fetch_tweet("uguisu.skr.jp -bot -recollection") csv_merge() |
最初の一回目は7年前から指定の文字列を含んだTweet記事を取得する。
以降はデイリーで動かすことで差分ファイルを抽出する。あとは、このファイル同士をマージしてあげれば良い。
マージ部分は、もっとスッキリ書ける気がするが思いつかず。
因みに、ダウンロードされたcsvのファイルの中身は次のようになる。
1 2 3 |
id,conversation_id,created_at,date,time,timezone,user_id,username,name,place,tweet,language,mentions,urls,photos,replies_count,retweets_count,likes_count,hashtags,cashtags,link,retweet,quote_url,video,thumbnail,near,geo,source,user_rt_id,user_rt,retweet_id,reply_to,retweet_date,translate,trans_src,trans_dest 1358682698173194240,1358682698173194240,2021-02-08 16:42:53 JST,2021-02-08,16:42:53,+0900,291730076,kitune7680,白狐,,年収と資産によるお金持ちの定義・仕事一覧 https://t.co/yqY2vFurrG ミドルクラスが上位層側に含まれるのか…,ja,[],['https://uguisu.skr.jp/tax/rich.html'],[],0,0,1,[],[],https://twitter.com/kitune7680/status/1358682698173194240,False,,0,,,,,,,,[],,,, 1358061174789611522,1358017075189407746,2021-02-06 23:33:10 JST,2021-02-06,23:33:10,+0900,140639108,kqkaitoku,ねずみちゅうてつ,,@Trip_Rapid えっ、えってっ回帰って????? まさかの使ってたんですか、大規模匿名掲示板 犯罪の温床なんでしょ?w https://t.co/BXtKWg3Mvb,ja,[],['https://uguisu.skr.jp/recollection/5ch.html'],[],1,0,1,[],[],https://twitter.com/kqkaitoku/status/1358061174789611522,False,,0,,,,,,,,"[{'screen_name': 'Trip_Rapid', 'name': '旅し隊', 'id': '885459304957984768'}]",,,, |
あとは、どう加工して使うかだ。それは人によって異なる。
実行時間も速い。なにこれ?最高かよ。
まとめ
正常に動作している。
不要なフィールドも多いので出力しないように対応等も考えるか。
有名ライブラリのようなので、「twint」お前には できる限りの延命を期待してるよ。