どうもみなさん。こんにちは。
Mondderなるサービスをやっておりますqbotaと申します。
某マスクさんのおかけでTwitter APIがほとんどなにもできない無料プランの次はいきなり100ドルという大変素晴らしい料金設定になってしまいました。これはもうがんがん使い倒してやるしかないなと考えてる方も多いんじゃないかと思います。
そこで、個人的な事情もあり、APIを使わずツイートを取得することが可能なのか少し調べてみました。
なお、ここでツイートを取得するとはTwitterの内部検索からツイートを取得することを意味します。
twint、stweetなどのライブラリ
詳しいことは知りませんがこれらのライブラリはTwitterの非公式APIなるものを利用していて登録などしなくても簡単にツイートを取得することできるそうです。
しかし、2023年4月29日現在、stweetのREADMEに載っているコードを試してもエラーが発生し、取得できなくなっているようです。
プロフィールの取得などは現在でも可能な模様です。
Requestsを使ってアクセスしてみる
import requests
url = 'https://twitter.com/search?q=%E9%9B%A8&src=typed_query&f=live'
res = requests.get(url)
print(res.status_code)
print(res.text)
レスポンスは得られますが意味のある内容は返ってきません。JavaScriptを使って後からコンテンツを取得しているようなサイトにはこのやり方では上手くいきません。
Selenium+ブラウザでアクセスする
Seleniumはブラウザを操作するためのソフトウェアです。
from selenium import webdriver
import chromedriver_binary
import time
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument(' --disable-gpu')
driver = webdriver.Chrome(options=options)
driver.get("https://twitter.com/search?q=%E9%9B%A8&src=typed_query&f=live")
time.sleep(15)
driver.close()
ログイン画面に飛ばされます。
以前はログインせずとも検索できましたが、現在はできなくなっているようです。
Selenium+ブラウザでログインした後、検索する
ログインを突破する方法はこちらをご参照ください。
これでようやくツイートを取得することができました。検索結果のHTMLからの各ツイートの取得はとりあえずこんな感じでできました(デザインが変更されると無効になるので注意)。
page = BeautifulSoup(html,'lxml')
elements = page.select(".css-1dbjc4n article")
print(len(elements))
for el in elements:
name = el.select_one("span.css-901oao").text
print(name)
url = el.select_one(".r-1q142lx a").get('href')
print(url)
t_text = el.select_one("div[data-testid='tweetText']").text
print(t_text)
結論
検索結果からツイートを取得するには、ブラウザを経由してアクセスし、ログインしてから検索を行う必要があり、面倒くさい。