14
8

More than 1 year has passed since last update.

Twitter APIが有料化された今、スクレイピングでツイートを取得することは可能なのか

Posted at

どうもみなさん。こんにちは。
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()

ログイン画面に飛ばされます。
以前はログインせずとも検索できましたが、現在はできなくなっているようです。
スクリーンショット 2023-04-29 112608.png

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)

結論

検索結果からツイートを取得するには、ブラウザを経由してアクセスし、ログインしてから検索を行う必要があり、面倒くさい。

14
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
8