取得所有在 Twitter(X) 上按讚內容的腳本
大家好,我是無能。雖然可以使用名為 Twikit 的非官方 API 進行 Twitter 爬蟲,但從前陣子開始,範例程式碼就開始建議使用非同步操作,升級後發現它會提示要使用非同步,所以我全部都修正了。
haturatu/xd_likes
像這樣,一開始會將所有推文儲存到 all_tweets 中。
取得指定的最大值後
將取得 all_tweets 中所有推文的內容。
這些都會寫入到 fav.log 中,因此在需要時可以使用 grep 提取所有資訊。
API 限制
https://github.com/d60/twikit/blob/main/ratelimits.md
如您所見,各個 API 限制差異很大。
因此,需要透過重試設定進行多次嘗試。
# 重試設定
RETRY_LIMIT = 10
RETRY_DELAY = 300
# 重試時執行的函數
async def perform_request_with_retries(request_func, *args, **kwargs):
for attempt in range(RETRY_LIMIT):
try:
response = await request_func(*args, **kwargs) # 等待非同步請求
if response:
return response
except ReadTimeout:
logger.warning(f"Attempt {attempt + 1} failed due to ReadTimeout.")
except Exception as e:
logger.error(f"Attempt {attempt + 1} failed: {e}")
await asyncio.sleep(RETRY_DELAY)
raise Exception("Failed to fetch more tweets after retries.")
據說 API 限制會在 15 分鐘後重置,所以如果總共可以嘗試 50 分鐘,我想應該有足夠的時間緩衝了。不知不覺中,這部分卡住了我很久,如果我一直嘗試在極限邊緣,時間就會無限被消耗,所以我大幅提高了最大值。
圖片儲存
我將取得按讚內容的腳本與下載腳本分開了。
將在 xd.py 中儲存圖片。
如果保持預設設定,將無法以最高畫質儲存,因此需要為取得的 URL 添加 original 參數。
while user_tweets:
for tweet in user_tweets:
for media in tweet.media:
url = media['media_url_https']
if url.endswith('.jpg'):
url = url.replace('.jpg', '?format=jpg&name=orig')
clean_url = get_clean_url(url)
save_path = os.path.join(save_folder, f"{screen_name}_{clean_url.split('/')[-1]}.jpeg")
await download_image(url, save_path)
PNG 的畫質比較好,但可能只存在以 PNG 上傳的圖片?而且 PNG 檔案會佔用很多空間,所以我妥協使用了 JPG。
我會為每個取得的 ID 建立一個資料夾並儲存圖片,並且也會在圖片檔名中加入 ID,這是一個連日本人都會喜歡的細心設計。
目前我找不到其他類似的腳本,所以就公開了。話說回來,大家可能都是偷偷摸摸地做這種事,所以不太會公開吧...
順帶一提,fav.log 中有按讚的 URL,所以如果只想儲存按讚貼文的圖片,雖然需要另外操作,但還是可以做到的。這就是為什麼我將所有內容都放入 fav.log 的原因。
實際上,我曾想過將 fav.log 和抓取所有推文時的日誌分開,但已經累了,所以就到此為止吧。
那麼。
下次再見了。