Sotono.dev


前提

Twitter(X) では、利用規約で明示的にスクレイピングが禁止されています。 そのため、今回記事を参考にする場合は自己責任にてお願い致します。

じゃあなんでスクレイピングなんてアホな行為しようとしているのか?

今回作業するに当たり、下記の記事を読みました。 Twitter の親会社である X が「Twitter でデータスクレイピングを行い損害を与えた」として 4 人を提訴、1 億 3000 万円超の損害賠償を求める - GIGAZINE その記事より抜粋します。

「スクレイピングは数百万ものリクエストによってサーバーの処理能力を低下させ、実際のユーザーの利用体験を損なうことで、Twitter のウェブサイトやモバイルアプリの正当な運営を妨害します」 「データスクレイピング企業は X のような企業の技術革新から利益を得る一方、X に損害を与えてユーザーデータを危険にさらしています。違法にデータをスクレイピングすることで、被告は X の利用規約だけでなく Twitter ユーザーのプライバシー設定も明白に無視しています」

X のこれらの主張から、私はこう考えました。

そして、記事にはこのようにも書いてあります。

ビジネス特化型 SNS の LinkedIn が公開データのスクレイピングを行った企業支援スタートアップ・hiQ Labs を訴えた裁判では、2022 年に「公的なデータのスクレイピングは法的に問題ない」という判決が下されています。

今回収集するツイートは公開されているもののみとなり、 それらは「公的なデータ」なので「法的に問題ない」と解釈できます。

繰り返しますが、 Twitter(X) では、利用規約で明示的にスクレイピングが禁止されています。 そのため、今回記事を参考にする場合は自己責任にてお願い致します。

ではやっていきます。

なにするの

なぜこのツールなのか

Python

自分が使いやすくて実行しやすいから。

Selenium

個人的には Python でスクレイピング、といえば Selenium なので…

前提

Selenium と Chrome Driver を入れる

Selenium

poetry add selenium

Chrome Driver

ChromeDriver - WebDriver for Chrome から引っ張ってきます。

一回動作確認

from selenium import webdriver
import chromedriver_binary

def get_selenium_driver():
    driver = webdriver.Chrome()
    driver.get("<https://twitter.com/tumayouji_stn/likes>")
    return driver

をやったら、なんか出ました。

Message: session not created: Chrome failed to start: exited normally. (session not created: DevToolsActivePort file doesn't exist) (The process started from chrome location /home/sotono/.cache/selenium/chrome/linux64/119.0.6045.105/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

ChromeDriver を入れ直したら色々やってみましたが、根本的な原因は Chrome が入っていないことでした。 ので、sudo apt install google-chrome-stable とかで入れておきましょう。

無事、動作確認が終わりました。

メモリーが足りなくて頓挫

しばらく放っていると、メモリーが足りない旨を伝えられました。 ので、メモリー対策をします。

オプションとりあえずおすすめのつけておく

ChromeDriver でよく使うオプションのチートシート - Qiita を参考に色々つけました。 シークレットモードで起動すると前述のログインが外れてしまうので、 --incognito だけ外しておきます。

そうして観察してみたら、画像が表示されなくなったのでだいぶメモリが節約できているんじゃないかなと思います。

なんて考えてたら普通にメモリーリークが起きたので、これ以上手のうちようがないな、と思いました。