Ruby 有没有更好的方法来收集推特数据?

Ruby 有没有更好的方法来收集推特数据?,ruby,bash,twitter,Ruby,Bash,Twitter,我正在从事一个使用Twitter数据的社区检测项目,在这个项目中,我需要根据关系创建一个网络。我收集并过滤了200000个UID。我的下一步是在他们之间建立一个朋友/追随者网络 我正在使用Ruby脚本和Twitter gem来收集、处理和存储数据。为了克服API调用限制,我使用Apigee代理,因此目前没有速率限制问题 获取两个UID之间关系状态的调用位于: 我需要加快收集数据的进程。目前,我的终端中有许多脚本同时运行。我发现这种方法很难管理和扩展。有没有一种更快、更高效、更易于管理的方法来做同

我正在从事一个使用Twitter数据的社区检测项目,在这个项目中,我需要根据关系创建一个网络。我收集并过滤了200000个UID。我的下一步是在他们之间建立一个朋友/追随者网络

我正在使用Ruby脚本和Twitter gem来收集、处理和存储数据。为了克服API调用限制,我使用Apigee代理,因此目前没有速率限制问题

获取两个UID之间关系状态的调用位于:


我需要加快收集数据的进程。目前,我的终端中有许多脚本同时运行。我发现这种方法很难管理和扩展。有没有一种更快、更高效、更易于管理的方法来做同样的事情?或者有没有一种完全不同的更好的方法,我不知道?

你可以尝试使用和解析HTML页面,我可以想到的一件事是使用EC2实例并部署脚本,你可以得到最大的实例并使用几个小时。一个好处是您拥有更强大的实例和更快的internet连接


另外,如果您只是收集公共数据,这意味着您不必通过OAuth进行身份验证(如果我错了,请纠正我),那么我会使用Perl脚本或Python,这比使用Gem的Ruby更快

为什么不使用logstash来收集数据呢。Logstash为您提供了大量的选项,可以将数据发送到其中,以便您可以轻松地对其进行筛选。在将数据发送到输出之前,您甚至可以通过logstash过滤所有数据。可用的输出选项有Elasticsearch(用于实时搜索、分析和可视化)、数据库(mysql、MSSQL等)等等

Logstash-


Twitter日志存储插件-

使用线程包装器脚本

您可能只需要一个带踏板的bash或python包装器脚本。一个脚本,它将分割工作并自动为您调用它。这样做的好处是,您不必重写太多就可以让它正常工作。下面的假设可能会将运行时间从111小时减少到1.1小时

假设您当前的解决方案是:

file_of_200k_uids.txt
ruby ruby_script.rb "file_of_200k_uids.txt"
所以ruby_script.rb运行在所有200K UID中,并执行网络任务,比如说每2秒相当于400000秒

建议的解决方案(使用BASH4+编写包装线程:

bash_thread_manager.sh的内容如下:

# -- Step one have the bash script break down the large file --
# and place the results in a /path/to/folder
cp file_of_200k_uids.txt /path/to/folder/temp_file_of_200k_uids.txt
split -d -b 10M file_of_200k_uids.txt uids_list
rm /path/to/folder/temp_file_of_200k_uids.txt

# -- Now run through the folders and launch the script you need to do the work --
# -- it will create instances of your script up to a max number (e.g. 100) --
child="$$"
for filename in /path/to/folder/*; do

    num_children=$(ps --no-headers -o pid --ppid=$child | wc -w)
    let num_children=num_children-1

    if [[ $num_children -gt 100 ]] ; then
        sleep 60
    else
        ruby ruby_script.rb "$filename" > /output/result-${RANDOM}.txt &
    fi

done
wait
# -- final step would be a for loop that combines all of the files
cat /output/result-*.txt >> all.txt
bash脚本将管理从一个文件调用uid,并将数据作为单独的线程收集到您定义的某个数目。在下面的示例中,我们将_200k_uids.txt的temp_文件_拆分为较小的10MB文件max,然后使用bash脚本一次调用其中的100个10MB文件。任何时候低于100个线程,它都会增加到100个。现在你可以快100倍,以此类推

进一步阅读:
为什么你需要加快进程,而不是仅仅等待它花费多长时间?如果1个答案不起作用,考虑添加关于你认为它花费了太长时间的信息。如果您有一组运行simul.的脚本,则作业控制工具或主脚本可能是合适的。考虑到您项目的网络编程方面,我本以为会有ruby gems来帮助您实现这一点。你在这方面看得有多深。缩放可能意味着您需要查看GNU并行、Amazon弹性云或其他。还有像Hadoop这样的大规模数据处理工具(几乎肯定需要用java或???进行自定义编码)。祝你好运。从你包含的dev.twitter链接来看,json文档似乎适合加载到MongoDB中。(这来自于MongoDB第4章中的一个人(曼宁出版社,无隶属关系)。)。这本书包含了一个将数据从twitter直接检索到DB的示例。所以可能值得一看。祝你好运。作业控制工具或主脚本是我正在寻找的。有什么建议吗?编程语言的改变是否也会导致速度的显著提高?如果我让这个过程以当前速度继续下去,这将花费我太长的时间。所以这不是一个选择。
# -- Step one have the bash script break down the large file --
# and place the results in a /path/to/folder
cp file_of_200k_uids.txt /path/to/folder/temp_file_of_200k_uids.txt
split -d -b 10M file_of_200k_uids.txt uids_list
rm /path/to/folder/temp_file_of_200k_uids.txt

# -- Now run through the folders and launch the script you need to do the work --
# -- it will create instances of your script up to a max number (e.g. 100) --
child="$$"
for filename in /path/to/folder/*; do

    num_children=$(ps --no-headers -o pid --ppid=$child | wc -w)
    let num_children=num_children-1

    if [[ $num_children -gt 100 ]] ; then
        sleep 60
    else
        ruby ruby_script.rb "$filename" > /output/result-${RANDOM}.txt &
    fi

done
wait
# -- final step would be a for loop that combines all of the files
cat /output/result-*.txt >> all.txt