Ограничение скорости Twitter - PullRequest
1 голос
/ 05 января 2012

Мне было дано простое задание, которое включает подсчет подписчиков ряда учетных записей в твиттере. Может быть 1000 имен пользователей в твиттере, которые приложение, которое я создаю, должно подсчитывать подписчиков каждого пользователя и суммировать их.

Кажется, что это простая задача, поэтому я использовал вызовы API Twitter ( из клиента C # ), чтобы получить информацию, необходимую для каждого пользователя. Поскольку информация, которую я получаю, не является чем-то особенным, просто некоторые общедоступные данные, я использовал неаутентифицированные вызовы. Например:

string target = "http:twitter.com/users/" + userName + ".xml";
Console.WriteLine("UserName: " + userName);

WebClient client = new WebClient();

Stream stream = client.OpenRead(target); StreamReader reader = new
StreamReader(stream); 
XmlTextReader xml_read = new XmlTextReader(stream);

while (xml_read.Read()) {   
     xml_read.MoveToElement();
     if (xml_read.Name == "name") {         
         Console.WriteLine("Name: " + xml_read.ReadInnerXml().ToString());
     }

    if (xml_read.Name == "followers_count"){
        Console.WriteLine("Followers: " +
                                       xml_read.ReadInnerXml().ToString());         
          Console.WriteLine(); 
      }
}

Это работает очень хорошо (с точки зрения скорости и достаточности цели), однако имеет проблему с ограничением скорости. то есть я не могу делать более 100 или около того запросов в час ... поэтому для 1000 пользователей мне понадобится 10 часов, чтобы выполнить эту простую задачу! ..

Я пытался пойти по другому пути .., поскольку мне нужна была общедоступная информация, я решил скачать html-страницы каждой учетной записи в Твиттере, чтобы получить подписчиков (и настоящее имя). Вот так:

WebRequest myWebRequest = WebRequest.Create("http://twitter.com/" + userName);
WebResponse myWebResponse = myWebRequest.GetResponse();
Stream ReceiveStream = myWebResponse.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader(ReceiveStream, encode);
string strResponse = readStream.ReadToEnd();

Затем с помощью простого анализа строки, чтобы получить число подписчиков и настоящее имя.

Это решение действительно, однако загрузка всего HTML-файла (размером более 300 КБ) не является действительно разумным способом сделать это. ПЛЮС занимает около 2 часов, чтобы завершить задачу.

Что я прошу?

Я надеюсь / уверен, что есть более умный и эффективный способ получения публичной информации из Twitter.

Ответы [ 3 ]

2 голосов
/ 05 января 2012

Может быть, вы можете использовать это решение: https://dev.twitter.com/docs/api/1/get/users/lookup

Это дает вам возможность запрашивать данные до 100 имен пользователей (через запятую), например: https://api.twitter.com/1/users/lookup.json?screen_name=bloodyairtimer,geertvdc

Вы можете сами решить, хотите ли вы получить результат в формате xml или json. Возможно, размер json будет меньше, чем xml.

1 голос
/ 05 января 2012

У меня такая же проблема. Я попросил поддержки в твиттере через форум разработчиков, но я не получил полезного ответа. Каждый метод API имеет ограничение скорости, в общем, если вы проходите аутентификацию, вы можете иметь большее значение (150 для открытого метода, 350 для аутентифицированного), но это не очень хорошее значение.

Если вы можете использовать более одного IP-адреса, у вас может быть разное количество запросов, но будет лучше, если вы вызовите API с аутентификацией, потому что в этом случае это не IP, а пользователь.

Политика ограничения скорости Твиттера определяется здесь: https://dev.twitter.com/docs/rate-limiting/faq

0 голосов
/ 17 января 2012

Вы также можете использовать такие сервисы, как Gnip

, они сохранили весь твиттер!

...