【问题标题】:How to search twitter for keywords如何在推特上搜索关键词
【发布时间】:2012-11-04 15:18:26
【问题描述】:

我正在尝试构建一个服务,在持续监控的基础上为 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 购买整个消防软管的第三方(例如 Datasift)并在那里搜索 Twitter 流。这变得昂贵 - 基本计划每月 3000 美元。 24/7 全天候搜索单个单词的费用约为 45 美元/月)

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

谢谢大家

【问题讨论】:

  • 对不起。添加了 grails 标签,我认为我会将 twitter4j 和 grails 代码放在问题中。但没有必要。

标签: twitter


【解决方案1】:

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

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

【讨论】:

  • 我希望尽可能接近实时地搜索 Twitter。这是用户流的吸引力之一。就用户而言,搜索量将很高;理想情况下有几千个(分布在水平扩展的 AWS 服务上)。我会相当严格地限制关键字,但即使要跟踪的关键字仅限于每个用户一个,我仍然会遇到公共流中 400 个关键字的限制。
  • 我没想过要做一个浏览器抓取工具。这似乎有点复杂,并且可能违反 Twitter API 限制的精神(有被 Twitter 列入黑名单的风险)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我整理了一个不错的 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();
    
    });
    

    【讨论】:

      猜你喜欢
      • 2017-08-06
      • 2014-12-06
      • 2023-01-04
      • 1970-01-01
      • 2015-12-06
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多