编写Ruby脚本来对Twitter用户的数据进行深度挖掘

2019-09-25 09:39:43王振洲

20151110143317694.jpg (333×208)

反映粉丝情况的图表

Twitter是一个庞大的用户网络,这些用户形成了一个网络图。正如你通过脚本所看到的那样,遍历你的联系人很容易,接着遍历他们的联系人也很容易。即使只是在这一级别上,这样做也已建立起一张大图的基本面。

为了可视化图形,我选择使用图形可视化软件GraphViz。在Ubuntu上,使用下面的命令行,你可以很容易就安装好这一工具:

$ sudo apt-get install graphviz 

清单11中的脚本遍历了用户的粉丝,然后再遍历这些粉丝他们的粉丝。这一模式中的唯一真正不同之处在于 GraphViz的DOT格式文件的构造,GraphViz使用简单的脚本格式来定义图形,这些图形作为你列举的Twitter用户的组成部分出现。如清单所展示的那样,可以简单地通过指定节点的关系来定义图形。

清单11. 可视化Twitter粉丝图(followers-graph.rb)

#!/usr/bin/env ruby 
require "rubygems" 
require "twitter" 
require 'google_chart' 
 
screen_name = String.new ARGV[0] 
 
tweetlocation = Hash.new 
 
# Authenticate 
Twitter.configure do |config| 
config.consumer_key = '' 
config.consumer_secret = '' 
config.oauth_token = '' 
config.oauth_token_secret = '' 
end 
 
my_file = File.new("graph.dot", "w") 
 
my_file.puts "graph followers {" 
my_file.puts " node [ fontname=Arial, fontsize=6 ];" 
 
# Iterate followers, hash their location 
followers = Twitter.followers(screen_name, :count=>10 ).users.each do |f| 
 
# Only iterate if we can see their followers 
if (f.protected.to_s != "true") 
 
my_file.puts " "" + screen_name + "" -- "" + f.screen_name.to_s + """ 
 
followers2 = Twitter.followers(f.screen_name, :count =>10 ).users.each do |f2| 
 
my_file.puts " "" + f.screen_name.to_s + "" -- "" + 
f2.screen_name.to_s + """ 
 
end 
 
end 
 
end 
 
my_file.puts "}" 

在某个用户上执行清单11的脚本,得出的结果放在一个dot文件中,接着使用GraphViz来生成图像。首先调用Ruby脚本来收集图形数据(存储成graph.dot);接着使用GraphViz来生成图像(这里用的是circo,该工具指定了一种圆形的布局)。生成图像的过程定义如下:

$ ./followers-graph.rb MTimJones 
$ circo graph.dot -Tpng -o graph.png 

最终得出的图像如图4所示。需要注意的是,由于这一Twitter图表可能会很大,因为我们通过尽量减少要列举的用户及其粉丝的数目来限制图表的规模(通过清单11中的:count选项)。

图4. Twitter粉丝图例子(极端情况的子集)

20151110143423605.jpg (537×599)

位置信息

在功能启用的情况下,Twitter收集你和你发出tweet消息的地理位置数据。这些由经度和纬度信息组成的数据能够用来精确地定位用户的位置或者是tweet消息从何处发出。此外,把搜索和这些消息结合在一起,你就可以根据已定义的位置或是你所处的位置来识别出某些地方或是某些人。