3

我正在尝试构建一个服务,在持续监控的基础上为 Twitter 中的多个用户执行关键字搜索。似乎有 5 种不同的方法可以实现这一点——都有各自的缺点。我浏览了 Twitter 和 twitter4j 文档,找不到任何其他方法。

  1. 使用 Twitter REST API 执行搜索 (https://dev.twitter.com/docs/api/1/get/search)。这个 API 是结果有限的:要求太多,你会受到限制。我确实必须跟踪阅读的最后一条推文,以免重复结果。需要一个计时器来轮询流。如果有多个搜索词,则进行多次调用很简单。

  2. 搜索公共流方法 (https://dev.twitter.com/docs/streaming-apis/streams/public)。虽然这对于持续搜索非常有用,但 Twitter 仅允许每个帐户一个连接,并且可以将多少个术语传递到 Twitter。对于我的用例来说绝对不可能

  3. 尝试使用用户流进行过滤。我这样做了,但发现很难快速确定一条推文是来自搜索还是来自用户流。此外,Twitter 表示他们将限制每个 IP 地址的用户流数量,因此这种方法无法扩展。(Twitter 一直在谈论一个叫做 SiteStreams 的东西,但它是一个非常有限的测试版,没有任何文档,所以我不能考虑)。

  4. 转到从 Twitter 购买整个 firehose 的第三方(例如 Datasift)并在那里搜索 twitter 流。这变得昂贵 - 基本计划每月 3000 美元。24/7 全天候搜索单个单词的费用约为 45 美元/月)

我对社区的问题是“我是否已经用尽了所有可能性”?如果是,那么在我看来#1——使用带有计时器的 REST API 并跟踪最后一次找到的方法是正确的方法。有人不同意吗?如果是这样,您能否指出可以帮助我解决此问题的文档(或库)。

谢谢大家

4

3 回答 3

4

我整理了一个很好的 JS fiddle,它可以回答你在处理 Twitter API 时的所有问题。该网络应用程序抓取热门地区,并允许您深入了解热门话题,然后查看其中的推文。

我还包括了一个标准的 Twitter 搜索提交框,所以以一种奇怪的方式,这是一个准系统 Tweetdeck 客户端供您检查。此外,为了推动新的 Jquery 库的适应,我使用了 1.91,它使用了新的 live.bind 点击事件语法。

享受

http://jsfiddle.net/jdrefahl/5M3Gn/

function searchTwitter(query) {
$.ajax({
    url: 'http://search.twitter.com/search.json?' + jQuery.param(query),
    dataType: 'jsonp',
    success: function (data) {
        var tweets = $('#tweets');
        tweets.html('');
        for (res in data['results']) {
            tweets.append('<div>' + data['results'][res]['from_user'] + ' wrote: <p>' + data['results'][res]['text'] + '</p></div><br />');
        }
    }
});
}

$(document).ready(function () {

function getTrendsByID(id) {
    $.ajax({
        url: 'http://api.twitter.com/1/trends/' + id + '.json',
        dataType: 'jsonp',
        success: function (data) {
            $.each(data[0].trends, function (i) {
            });
        }
    });
};

function getLocales() {
    $.ajax({
        url: 'https://api.twitter.com/1/trends/available.json',
        dataType: 'jsonp',
        success: function (data) {
            var locales = $('ul#locales');
            locales.html('');
            $.each(data, function (i) {
                localeID[i] = data[i].woeid;
                $('ul#locales').append('<li>' + data[i].name + '</li>');
            });
        }
    });

};

function getTrends(id) {
    $.ajax({
        url: 'https://api.twitter.com/1/trends/' + id + '.json',
        dataType: 'jsonp',
        success: function (data) {
            var trends = $('ul#currentTrends');
            trends.html('');
            $.each(data[0].trends, function (i) {
                $('ul#currentTrends').append('<li>' + data[0].trends[i].name + '</li>');
            });
        }
    });
};

// Event Handlers
$(document).on("click", "#locales li", function () {
    var $this = $(this);
    var localesHdr = $('#currentTrendsCont h3');
    var tweets = $('#tweets');
    var trendsHdr = $('#tweetsCont h3');
    trendsHdr.html('');
    tweets.html('');
    localesHdr.html('');
    $('#currentTrendsCont h3').html($this.text());
    getTrends(localeID[$this.index()]);
});

$(document).on("click", "#currentTrends li", function () {
    var $this = $(this);
    var trendsHdr = $('#tweetsCont h3');
    trendsHdr.html('');
    $('#tweetsCont h3').html($this.text());
    var params = {
        q: $this.text(),
        rpp: 10
    };
    searchTwitter(params);
});

$('#submit').click(function () {
    var trendsHdr = $('#tweetsCont h3');
    var trends = $('#currentTrends');
    var local = $('#currentTrendsCont h3');
    local.html('');
    trendsHdr.html('');
    trends.html('');
    $('#tweetsCont h3').html('search query: '+$('#query').val());
    var params = {
        q: $('#query').val(),
        rpp: 10
    };
    searchTwitter(params);
});

// Globals
var localeID = new Array();

// Init!
getLocales();

});
于 2013-03-06T13:19:19.913 回答
0

您希望搜索 twitter 的频率如何,可能的搜索量是多少(即有多少用户,每个用户有多少关键字)?

您是否还考虑过使用浏览器抓取工具?即让浏览器在与搜索结果保持同步的服务器上运行,并为该浏览器开发一个简单的插件来捕获数据并将其发布到您的数据库/将其发送到某个地方进行处理?

于 2012-11-16T12:20:46.850 回答
0

Twitter 的回应是使用#4——从 Datasift 等供应商处购买访问权限。

于 2012-11-19T02:07:54.227 回答