2010-04-03 48 views
6

我正在尋找可擴展的方式來做到以下幾點:PHP獲取所有Twitter的追隨者,並比較他們的朋友

  • 用戶登錄
  • 從Twitter
  • 抓取所有的朋友從Twitter
  • 抓取所有關注者
  • 顯示所有沒有粉絲的好友

問題:這怎麼能以可擴展的方式完成?用戶可以有多達200萬的朋友或追隨者。目前我存儲在SQLite表內並通過循環比較它們。當用戶回來時,表格被清除並且進程再次開始。

這個作品在100 - 1000個朋友..但將與500000個朋友棘手。我無法緩存列表,因爲他們可以隨時改變。

有誰知道處理如此大量數據的好方法嗎?

+2

真的有些人會有50萬朋友嗎? – 2010-04-11 07:38:16

回答

0

我不知道你的數據庫是什麼樣的,但這是我如何設置它。

CREATE TABLE twitter_users (
    user_id INTEGER PRIMARY KEY NOT NULL, 
    screen_name VARCHAR(20) NOT NULL 
); 

CREATE TABLE friends (
    friend_id INTEGER PRIMARY KEY NOT NULL 
); 

CREATE TABLE followers (
    follower_id INTEGER PRIMARY KEY NOT NULL 
); 

然後,您可以使用此SQL來獲取不是追隨者的朋友。

SELECT friend_id, screen_name 
FROM friends 
LEFT JOIN followers ON follower_id = friend_id 
LEFT JOIN twitter_users ON user_id = friend_id 
WHERE follower_id IS NULL 

如果屏幕名稱爲NULL這意味着他們不在你twitter_users表。您可以查找缺失的用戶並將其存儲以備後用。屏幕名稱可能會更改,因此您可能需要定期更新表格。

使用friends/idsfollowers/ids API可一次獲取好友和關注者ID爲5,000的列表。使用users/lookup API可以獲得最多100個屏幕名稱。如果用戶擁有2,000,000個朋友,則需要400個API調用才能獲取ID列表,因此您至少應該爲受歡迎的用戶緩存該列表。

0

要指出的另一件事 - 你需要顯示所有朋友是不是跟隨者在同一時間?如果你只需要一次顯示一個有限的數字,例如20,那麼你可以計算出這20個;如果他們請求更多,然後計算更多(或者在瀏覽您的網站時在後臺執行此操作;每次請求時會生成更多)。

我無法真正想象一種情況,即需要在一頁中顯示幾百萬個結果,即使這是理論極限。

所以,可能工作(不必在他們的API文檔簡要瀏覽)的方法是

  • 搶他們的朋友一大塊使用(看來你得到100個請求,反正) statuses/friends API
  • 每個檢索到的朋友
    • 使用friendships/show確定兩個
    • 之間的跟隨狀態,如果你有足夠的結果(如20)再突破,大功告成

這種方法確實需要更多的對服務器的請求比由Twitter的rate limiting政策允許的,但話又說回來,在100得到一個用戶的所有好友列表2,000,000朋友在每次請求獲得全部請求之前,每個請求的朋友也會超出限制(每個請求150個請求x 100 = 15,000)。你打算如何解決這個問題?

+0

您可以隨時讓用戶導出自己的追隨者訂閱源,並將其作爲啓動過程的一部分提交......好奇如果有一種安全的方式將其傳遞給第三方處理器(可靠) – jcolebrand 2010-04-12 14:38:07

0

不是唯一的方法來做到這一點,但有效:運行一個crontab每天從一個擁有公共列表的站點(或者twitter本身)下載一個twitter用戶列表,然後索引這些朋友(每運行1000個天)。然後通過PHP使用cUrl訪問twitter API來檢索你的朋友列表並匹配數組。這很有效,因爲您可以隨時改進算法 - 如上所述,限制策略會阻止您執行其他任何操作。祝你好運! =)

相關問題