精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用Ruby和Twitter來進行數據挖掘

開發 前端 后端
Twitter不僅是一個絕妙的實時社交網絡工具,其還是一個可供數據挖掘用的豐富信息的來源。平均而言,Twitter用戶每天生成一億四千萬條關于各種主題的消息。本文向你介紹數據挖掘,并說明面向對象的Ruby語言的一些概念。

2008年10月,我像許多人一樣滿懷好奇地創建了一個Twitter帳戶。像大多數人一樣,我與一些朋友建立了連接,做一些隨機的搜索來更好地理解這一服務。使用140個字符來進行溝通,這看起來好像不太可能是一個受歡迎的想法,但一件無關的事情卻讓我看到了Twitter的真正價值所在。

2009年7月初,我的網站托管服務提供商熄火了,在進行了一番隨意的網絡搜索后,我發現信息指向了西雅圖Fisher Plaza的一場火災,這場火是罪魁禍首。傳統的基于web的信息源更新很慢,沒有提供何時服務會恢復正常的指示。然而,在搜索了Twitter之后,我找到了一些個人帳戶對事件的描述,包括了現場實時發生的情況。例如,在我的托管服務恢復正常之前不久,就有一條消息說有柴油發電機位于大廈的外面。

當時我就意識到了Twitter的真正強大之處在于個人以及組織之間的公開的和實時的信息交流。然而,在這一表象下面,則是一個關于用戶行為的信息寶庫,以及在局部和全局層面上的發展趨勢。我使用了Ruby語言和Twitter gem這一Twitter的API包裝器來在簡單的腳本語境中探討挖掘的實現,并說明了如何使用其他的web服務和應用來為數據的可視化構建一個簡單的混搭應用程序。

Twitter以及一些API

盡管早期的網絡涉及的是人-機器的交互,但現在的網絡已涉及機器-機器之間的交互,這種交互是使用web服務來支持的。大部分受歡迎的網站都有這樣的服務存在——從各種各樣的Google服務到LinkedIn、Facebook和Twitter等。通過web服務創建的API,外部的應用可以查詢或是操縱網站上的內容。

web服務可以使用多種方式來實現。目前最流行的做法之一是表述性狀態轉移(Representational State Transfe, REST)。REST的一種實現是通過為人熟知的HTTP協議,允許HTTP作為RESTful架構的媒介存在(使用諸如GET、PUT、POST、DELETE一類的標準HTTP操作)。Twitter的API是作為這一媒介之上的一個抽象來進行開發的。在這一做法中,沒有涉及REST、HTTP或是XML或JSON一類的數據格式的知識,而是代之以清晰地整合到了Ruby語言中的基于對象的接口。

Ruby和Twitter的一個快速展示

讓我們來探討一下如何在Ruby中使用Twitter API。首先,我們需要獲取所需的資源,如果你像我一樣在用Ubuntu Linux®的話,就使用apt框架。

若要獲取最新的完整的Ruby分發版本(大約13MB的下載量),使用這一命令行:

  1. $ sudo apt-get install ruby1.9.1-full 

接著使用gem實用程序來抓取Twitter gem:

  1. $ sudo gem install twitter 

現在你已經有了這一步驟所需的一切了,我們繼續,測試一下Twitter的包裝器。這一示例使用一個名為交互式的Ruby外殼(Interactive Ruby Shell,IRB)的外殼程序,該外殼程序允許實時地執行Ruby命令以及使用語言進行實驗。IRB有著非常多的功能,不過我們只用它來做一些簡單的實驗。

清單1展示了與IRB的一個會話,該會話被分成了三段以便于閱讀。第一段(001和002行)通過導入必需的運行時元素來做好環境方面的準備(require方法加載并執行指定的庫)。接下來的一段(003行)說明的是使用Twitter gem來顯示從IBM® developerWorks®發出的最新tweet消息。如所展示的那樣,使用Client::Timeline模塊的user_timeline方法來顯示一條消息,這第一個例子說明了Ruby的“鏈方法”的功能。user_timeline方法返回一個有著20條消息的數組,接著鏈入到方法first中,這樣做是為了從數組中提取出第一條消息(first是Array類的一個方法),接著從這一條消息中提取出文本字段,通過puts方法把它放到輸出中。

接下來的一段(004行)使用了用戶定義的位置字段,這是一個不限形式的字段,用戶可以在其中提供有用的或是無用的位置信息。在這一例子中,User模塊抓取了位置字段所限定的用戶信息。

最后一段(從005行開始)研究了Twitter::Search模塊,這一搜索模塊提供了極其豐富的用來搜索Twitter的接口。在這一例子中,首先是創建一個搜索實例(005行),接著在006行指定一個搜索,搜 LulzSec用戶在最近發出的包含了why這一詞的消息,結果列表已經過刪減和編輯。搜索設置會一直存在在那里,因為搜索實例保持著所定義的過濾條件,你可以通過執行search.clear來清除這些過濾條件。

清單1. 通過IRB來實驗Twitter API

  1. $ irb  
  2. irb(main):001:0> require "rubygems" 
  3. => true 
  4. irb(main):002:0> require "twitter" 
  5. => true 
  6.  
  7. irb(main):003:0> puts Twitter.user_timeline("developerworks").first.text  
  8. dW Twitter is saving #IBM over $600K per month: will #Google+ add to that?>   
  9. http://t.co/HiRwir7 #Tech #webdesign #Socialmedia #webapp #app  
  10. => nil 
  11.  
  12. irb(main):004:0> puts Twitter.user("MTimJones").location  
  13. Colorado, USA  
  14. => nil 
  15.  
  16. irb(main):005:0> search = Twitter::Search.new 
  17. => #<Twitter::Search:0xb7437e04 @oauth_token_secret=nil,   
  18. @endpoint="https://api.twitter.com/1/",   
  19. @user_agent="Twitter Ruby Gem 1.6.0",   
  20. @oauth_token=nil@consumer_secret=nil,   
  21. @search_endpoint="https://search.twitter.com/",   
  22. @query={:tude=>[], :q=>[]}, @cache=nil@gateway=nil@consumer_key=nil,   
  23. @proxy=nil@format=:json@adapter=:net_http<   
  24. irb(main):006:0> search.containing("why").to("LulzSec").  
  25. result_type("recent").each do |r| puts r.text end 
  26. @LulzSec why not stop posting <bleep> and get a full time job! MYSQLi isn't   
  27. hacking you <bleep>.  
  28. ...  
  29. irb(main):007:0> 

接下來,我們來看一下Twitter中的用戶的模式,你也可以通過IRB來實現這一點,不過我重排了結果的格式,以便簡化對Twitter用戶的內部結構的說明。清單2給出了用戶結構的輸出結果,這在Ruby中是一個Hashie::Mash。這一結構很有用,因為其允許對象有類方法的哈希鍵訪問器(公開的對象)。正如你從清單2中看到的那樣,這一對象包含了豐富的信息(用戶特定的以及渲染的信息),其中包括了當前的用戶狀態(帶有地理編碼信息)。一條tweet消息中也包含了大量的信息,你可以使用user_timeline類來輕松地可視化生成這一信息。

清單2. Twitter用戶的內部解析結構(Ruby視角)

  1. irb(main):007:0> puts Twitter.user("MTimJones")  
  2. <#Hashie::Mash   
  3. contributors_enabled=false   
  4. created_at="Wed Oct 08 20:40:53 +0000 2008"   
  5. default_profile=false default_profile_image=false   
  6. description="Platform Architect and author (Linux, Embedded, Networking, AI)." 
  7. favourites_count=1   
  8. follow_request_sent=nil   
  9. followers_count=148   
  10. following=nil   
  11. friends_count=96   
  12. geo_enabled=true   
  13. id=16655901 id_str="16655901"   
  14. is_translator=false   
  15. lang="en"   
  16. listed_count=10   
  17. location="Colorado, USA"   
  18. name="M. Tim Jones"   
  19. notifications=nil   
  20. profile_background_color="1A1B1F"   
  21. profile_background_image_url="..." 
  22. profile_background_image_url_https="..."   
  23. profile_background_tile=false   
  24. profile_image_url="http://a0.twimg.com/profile_images/851508584/bio_mtjones_normal.JPG"   
  25. profile_image_url_https="..."   
  26. profile_link_color="2FC2EF"   
  27. profile_sidebar_border_color="181A1E" profile_sidebar_fill_color="252429"   
  28. profile_text_color="666666"   
  29. profile_use_background_image=true   
  30. protected=false   
  31. screen_name="MTimJones"   
  32. show_all_inline_media=false   
  33. status=<#Hashie::Mash   
  34. contributors=nil coordinates=nil   
  35. created_at="Sat Jul 02 02:03:24 +0000 2011"   
  36. favorited=false   
  37. geo=nil   
  38. id=86978247602094080 id_str="86978247602094080"   
  39. in_reply_to_screen_name="AnonymousIRC"   
  40. in_reply_to_status_id=nil in_reply_to_status_id_str=nil   
  41. in_reply_to_user_id=225663702 in_reply_to_user_id_str="225663702"   
  42. place=<#Hashie::Mash   
  43. attributes=<#Hashie::Mash>   
  44. bounding_box=<#Hashie::Mash   
  45. coordinates=[[[-105.178387, 40.12596],   
  46. [-105.034397, 40.12596],   
  47. [-105.034397, 40.203495],   
  48. [-105.178387, 40.203495]]]   
  49. type="Polygon" 
  50. >   
  51. country="United States" country_code="US"   
  52. full_name="Longmont, CO"   
  53. id="2736a5db074e8201"   
  54. name="Longmont" place_type="city"   
  55. url="http://api.twitter.com/1/geo/id/2736a5db074e8201.json" 
  56. >   
  57. retweet_count=0   
  58. retweeted=false   
  59. source="web"   
  60. text="@AnonymousIRC @anonymouSabu @LulzSec @atopiary @Anonakomis Practical reading   
  61. for future reference... LULZ \"Prison 101\" http://t.co/sf8jIH9" truncated=false 
  62. >  
  63. statuses_count=79   
  64. time_zone="Mountain Time (US & Canada)"   
  65. url="http://www.mtjones.com"   
  66. utc_offset=-25200   
  67. verified=false 
  68. >  
  69. => nil 
  70. irb(main):008:0>  

這就是快速展示部分的內容。現在,我們來研究一些簡單的腳本,你可以在這些腳本中使用Ruby和Twitter API來收集和可視化數據。在這一過程中,你會了解到Twitter的一些概念,比如說身份驗證和頻率限制等。

挖掘Twitter數據

接下來的幾節內容介紹幾個通過Twitter API來收集和呈現可用數據的腳本,這些腳本重點在于其簡易性,不過你可以通過擴展以及組合他們來創建新的功能。另外,本節內容還會提到Twitter gem API,這一API中有著更多可用的功能。

需要注意的很重要的一點是,在指定的時間內,Twitter API只允許客戶做有限次的調用,這也就是Twitter的頻率限制請求(現在是一小時不超過150次),這意味著經過某個次數的使用后,你會收到一個錯誤消息,并要求你在提交新的請求之前先做一段時間的等待。

用戶信息

回想一下清單2中的每個Twitter用戶的大量可用信息,只有在用戶不受保護的情況下這些信息才是可訪問的。我們來看一下如何以一種更便捷的方式來提取用戶的信息并呈現出來。

清單3給出了一個(基于用戶的界面顯示名稱)檢索用戶信息的簡單的Ruby腳本,然后顯示一些更有用的內容,在需要時使用Ruby方法to_s來把值轉換成字符串。需要注意的是,首先用戶是不受保護的,否則的話是不能訪問到她/他的數據的。

清單3. 提取Twitter用戶數據的簡單腳本(user.rb)

  1. #!/usr/bin/env ruby  
  2. require "rubygems" 
  3. require "twitter" 
  4.  
  5. screen_name = String.new ARGV[0]  
  6.  
  7. a_user = Twitter.user(screen_name)  
  8.  
  9. if a_user.protected != true 
  10.  
  11. puts "Username : " + a_user.screen_name.to_s  
  12. puts "Name : " + a_user.name  
  13. puts "Id : " + a_user.id_str  
  14. puts "Location : " + a_user.location  
  15. puts "User since : " + a_user.created_at.to_s  
  16. puts "Bio : " + a_user.description.to_s  
  17. puts "Followers : " + a_user.followers_count.to_s  
  18. puts "Friends : " + a_user.friends_count.to_s  
  19. puts "Listed Cnt : " + a_user.listed_count.to_s  
  20. puts "Tweet Cnt : " + a_user.statuses_count.to_s  
  21. puts "Geocoded : " + a_user.geo_enabled.to_s  
  22. puts "Language : " + a_user.lang  
  23. puts "URL : " + a_user.url.to_s  
  24. puts "Time Zone : " + a_user.time_zone  
  25. puts "Verified : " + a_user.verified.to_s  
  26. puts  
  27.  
  28. tweet = Twitter.user_timeline(screen_name).first  
  29.  
  30. puts "Tweet time : " + tweet.created_at  
  31. puts "Tweet ID : " + tweet.id.to_s  
  32. puts "Tweet text : " + tweet.text  
  33.  
  34. end 

若要調用這一腳本,需要確保其是可執行的(chmod +x user.rb),使用一個用戶的名稱來調用它。清單4顯示了使用用戶developerworks調用的結果,給出了用戶的信息和當前狀態(最后一條tweet消息)。這里要注意的是,Twitter把關注你的人定義為followers(粉絲);而把你關注的人稱作friends(朋友)。

清單4. user.rb的輸出例子

  1. $ ./user.rb developerworks  
  2. Username : developerworks  
  3. Name : developerworks  
  4. Id : 16362921  
  5. Location :   
  6. User since : Fri Sep 19 13:10:39 +0000 2008  
  7. Bio : IBM's premier Web site for Java, Android, Linux, Open Source, PHP, Social,   
  8. Cloud Computing, Google, jQuery, and Web developer educational resources  
  9. Followers : 48439  
  10. Friends : 46299  
  11. Listed Cnt : 3801  
  12. Tweet Cnt : 9831  
  13. Geocoded : false 
  14. Language : en  
  15. URL : http://bit.ly/EQ7te  
  16. Time Zone : Pacific Time (US & Canada)  
  17. Verified : false 
  18.  
  19. Tweet time : Sun Jul 17 01:04:46 +0000 2011  
  20. Tweet ID : 92399309022167040  
  21. Tweet text : dW Twitter is saving #IBM over $600K per month: will #Google+ add to that? >   
  22. http://t.co/HiRwir7 #Tech #webdesign #Socialmedia #webapp #app 

#p#

朋友的受歡迎情況

研究一下你的朋友(你關注的人),收集數據來了解一下他們的受歡迎程度。在這個例子中,收集朋友的數據并按照他們的粉絲數目來進行排序,這一簡單的腳本如清單5所示。

在這一腳本中,在了解了你要(基于界面顯示名稱)分析的用戶后,創建一個用戶哈希表,Ruby哈希(或是相關的數組)是一種可以允許你定義存儲鍵(而不是簡單的數值索引)的數據結構。接著,通過Twitter的界面名稱來索引這一哈希表,關聯值則是用戶的粉絲數目。這一過程簡單地遍歷你的朋友然后把他們的粉絲的數目放入哈希表中,接著(以降序)排列哈希表,然后把它放到輸出中。

清單5. 關于朋友的受歡迎程度的腳本(friends.rb)

  1. #!/usr/bin/env ruby  
  2. require "rubygems" 
  3. require "twitter" 
  4.  
  5. name = String.new ARGV[0]  
  6.  
  7. user = Hash.new 
  8.  
  9. # Iterate friends, hash their followers  
  10. Twitter.friends(name).users.each do |f|  
  11.  
  12. # Only iterate if we can see their followers  
  13. if (f.protected.to_s != "true")   
  14. user[f.screen_name.to_s] = f.followers_count   
  15. end 
  16.  
  17. end 
  18.  
  19. user.sort_by {|k,v| -v}.each { |user, count| puts "#{user}, #{count}" } 

清單5中的朋友腳本的一個例子輸出如清單6所示。我刪減了輸出內容以節省空間,不過你可以看到,在我的直接網絡中,ReadWriteWeb(RWW)和Playstation是很受歡迎的Twitter用戶。

清單6. 清單5中的朋友腳本的界面輸出

  1. $ ./friends.rb MTimJones  
  2. RWW, 1096862  
  3. PlayStation, 1026634  
  4. HarvardBiz, 541139  
  5. tedtalks, 526886  
  6. lifehacker, 146162  
  7. wandfc, 121683  
  8. AnonymousIRC, 117896  
  9. iTunesPodcasts, 82581  
  10. adultswim, 76188  
  11. forrester, 72945  
  12. googleresearch, 66318  
  13. Gartner_inc, 57468  
  14. developerworks, 48518 

我的粉絲來自哪里

回想一下清單2,Twitter提供了豐富的位置信息,有一個不限形式、用戶定義的、可選用地理編碼數據的位置字段。不過,用戶設定的時區也可以為粉絲的實際位置提供線索。

在這一例子中,你要構建一個混搭應用程序來從Twitter粉絲中提取時區數據,然后使用Google Charts來可視化這一數據。Google Charts是一個非常有意思的項目,其允許你通過網絡來構建各種各樣不同類型的圖表;把圖表的類型和數據定義成HTTP請求,直接在瀏覽器中渲染作為響應的結果。若要安裝用于Google Charts的Ruby gem,使用下面的命令行:

  1. $ gem install gchartrb 

清單7提供的腳本提取時區數據,接著構建Google Charts請求。首先,與之前的腳本不同,這一腳本需要你通過Twitter的身份驗證。若要做到這一點,你需要注冊一個Twitter應用,這會給你提供一組鍵值和令牌,這些令牌可以用在清單7的腳本中,這樣才能夠成功地取到數據。請參閱參考資料了解這一簡單過程的詳細情況。

按照相類似的模式,該腳本接受了一個界面名稱,然后遍歷該用戶的粉絲,從當前粉絲中提取時區并把它存放在tweetlocation哈希表中。需要注意的是,你先要檢測該鍵值是否已經存在于哈希表中,若是的話,增加該鍵值的計數。你還可以記住所有時區的個數,以用于后面的百分比的計算。

這一腳本的最后一部分內容是構造Google Pie Chart的URL,創建一個新的PieChart,指定一些選項(大小、標題和是否為3D等);接著,遍歷時區哈希表,找出用于圖表的時區串的數據(刪去&符號)以及該時區計數與總數的百分比。

清單7.通過Twitter的時區來構建一個餅圖(followers-location.rb)

  1. #!/usr/bin/env ruby  
  2. require "rubygems" 
  3. require "twitter" 
  4. require 'google_chart' 
  5.  
  6. screen_name = String.new ARGV[0]  
  7.  
  8. tweetlocation = Hash.new 
  9. timezones = 0.0  
  10.  
  11. # Authenticate  
  12. Twitter.configure do |config|  
  13. config.consumer_key = '' 
  14. config.consumer_secret = '' 
  15. config.oauth_token = '  
  16. config.oauth_token_secret = '' 
  17. end 
  18.  
  19. # Iterate followers, hash their location  
  20. followers = Twitter.followers.users.each do |f|  
  21.  
  22. loc = f.time_zone.to_s  
  23.  
  24. if (loc.length > 0)  
  25.  
  26. if tweetlocation.has_key?(loc)  
  27. tweetlocation[loc] = tweetlocation[loc] + 1  
  28. else 
  29. tweetlocation[loc] = 1  
  30. end 
  31.  
  32. timezones = timezones + 1.0  
  33.  
  34. end 
  35.  
  36. end 
  37.  
  38. # Create a pie chart  
  39. GoogleChart::PieChart.new('650x350'"Time Zones"false ) do |pc|  
  40.  
  41. tweetlocation.each do |loc,count|  
  42. pc.data loc.to_s.delete("&"), (count/timezones*100).round  
  43. end 
  44.  
  45. puts pc.to_url  
  46.  
  47. end 

若要執行清單7中的腳本,給它提供一個Twitter界面顯示名稱,然后把得出的URL拷貝并粘貼到瀏覽器中,清單8給出了這一過程及最終生成的URL。

清單8. 調用followers-location腳本(結果只是一行來的)

  1. $ ./followers-location.rb MTimJones  
  2. http://chart.apis.google.com/chart?chl=Seoul|Santiago|Paris|Mountain+Time+(US++Canada)|  
  3. Madrid|Central+Time+(US++Canada)|Warsaw|Kolkata|London|Pacific+Time+(US++Canada)|  
  4. New+Delhi|Pretoria|Quito|Dublin|Moscow|Istanbul|Taipei|Casablanca|Hawaii|Mumbai|  
  5. International+Date+Line+West|Tokyo|Ulaan+Bataar|Vienna|Osaka|Alaska|Chennai|Bern|  
  6. Brasilia|Eastern+Time+(US++Canada)|Rome|Perth|La+Paz  
  7. &chs=650x350&chtt=Time+Zones&chd=s:KDDyKcKDOcKDKDDDDDKDDKDDDDOKK9DDD&cht=p  
  8. $  

把清單8中的URL粘貼到瀏覽器中,你就可以得到圖1所示的結果。

圖1. Twitter粉絲位置分布的餅圖

 

 

Twitter用戶的行為

Twitter包含了大量的數據,你可以通過挖掘這些數據來了解用戶行為的某些要素。兩個簡單例子將用來分析Twitter用戶何時發布消息以及通過什么應用來發布消息,你可以使用下面兩個簡單的腳本來提取并可視化這些信息。

清單9給出的腳本遍歷了某個特定用戶的tweet消息(使用user_timeline方法),然后從每條tweet消息中提取出該tweet消息形成的具體時間,一個簡單的哈希表被再次用來統計一周中每天的計數,然后以與前面的時區例子相類似的方式使用Google Charts生成一個柱狀圖。

清單9. 構建tweet發布時間的柱狀圖(tweet-days.rb)

  1. #!/usr/bin/env ruby  
  2. require "rubygems" 
  3. require "twitter" 
  4. require "google_chart" 
  5.  
  6. screen_name = String.new ARGV[0]  
  7.  
  8. dayhash = Hash.new 
  9.  
  10. timeline = Twitter.user_timeline(screen_name, :count => 200 )  
  11. timeline.each do |t|  
  12.  
  13. tweetday = t.created_at.to_s[0..2]  
  14.  
  15. if dayhash.has_key?(tweetday)  
  16. dayhash[tweetday] = dayhash[tweetday] + 1  
  17. else 
  18. dayhash[tweetday] = 1  
  19. end 
  20.  
  21. end 
  22.  
  23. GoogleChart::BarChart.new('300x200', screen_name, :verticalfalsedo |bc|  
  24. bc.data "Sunday", [dayhash["Sun"]], '00000f' 
  25. bc.data "Monday", [dayhash["Mon"]], '0000ff' 
  26. bc.data "Tuesday", [dayhash["Tue"]], '00ff00' 
  27. bc.data "Wednesday", [dayhash["Wed"]], '00ffff' 
  28. bc.data "Thursday", [dayhash["Thu"]], 'ff0000' 
  29. bc.data "Friday", [dayhash["Fri"]], 'ff00ff' 
  30. bc.data "Saturday", [dayhash["Sat"]], 'ffff00' 
  31. puts bc.to_url  
  32. end 

圖2提供了使用developerWorks帳戶來執行清單9中的tweet-days腳本的結果,正如所展示的那樣,星期三是發布tweet消息最活躍的一條,最不活躍的是星期六和星期天。

圖2. 比較每天的tweet活躍程度的柱狀圖

 

 

接下來的腳本確定特定用戶通過哪一個來源發布tweet消息,你可以通過幾種方式來發布消息,這一腳本并未對每一種都做了編碼。如清單10所示,使用類似的模式來提取給定用戶的時間軸上的內容,然后嘗試著解碼哈希表中的tweet消息的發出處。稍后這一哈希表會被用來創建一個簡單的餅圖,使用Google Charts來可視化數據。

清單10. 構建用戶的tweet消息源的餅圖(tweet-source.rb)

  1. #!/usr/bin/env ruby  
  2. require "rubygems" 
  3. require "twitter" 
  4. require 'google_chart' 
  5.  
  6. screen_name = String.new ARGV[0]  
  7.  
  8. tweetsource = Hash.new 
  9.  
  10. timeline = Twitter.user_timeline(screen_name, :count => 200 )  
  11. timeline.each do |t|  
  12.  
  13. if (t.source.rindex('blackberry')) then 
  14. src = 'Blackberry' 
  15. elsif (t.source.rindex('snaptu')) then 
  16. src = 'Snaptu' 
  17. elsif (t.source.rindex('tweetmeme')) then 
  18. src = 'Tweetmeme' 
  19. elsif (t.source.rindex('android')) then 
  20. src = 'Android' 
  21. elsif (t.source.rindex('LinkedIn')) then 
  22. src = 'LinkedIn' 
  23. elsif (t.source.rindex('twitterfeed')) then 
  24. src = 'Twitterfeed' 
  25. elsif (t.source.rindex('twitter.com')) then 
  26. src = 'Twitter.com' 
  27. else 
  28. src = t.source  
  29. end 
  30.  
  31. if tweetsource.has_key?(src)  
  32. tweetsource[src] = tweetsource[src] + 1  
  33. else 
  34. tweetsource[src] = 1  
  35. end 
  36.  
  37. end 
  38.  
  39. GoogleChart::PieChart.new('320x200'"Tweet Source"falsedo |pc|  
  40.  
  41. tweetsource.each do|source,count|  
  42. pc.data source.to_s, count  
  43. end 
  44.  
  45. puts "\nPie Chart" 
  46. puts pc.to_url  
  47. end 

圖3提供了一個可視化圖表,顯示了一組Twitter用戶感興趣使用的tweet消息發布源,傳統的Twitter網站最常用到,隨后是移動電話應用。

圖3. Twitter用戶的tweet消息發布源的餅圖 

 

 

#p#

反映粉絲情況的圖表

Twitter是一個龐大的用戶網絡,這些用戶形成了一個網絡圖。正如你通過腳本所看到的那樣,遍歷你的聯系人很容易,接著遍歷他們的聯系人也很容易。即使只是在這一級別上,這樣做也已建立起一張大圖的基本面。

為了可視化圖形,我選擇使用圖形可視化軟件GraphViz。在Ubuntu上,使用下面的命令行,你可以很容易就安裝好這一工具:

  1. $ sudo apt-get install graphviz 

清單11中的腳本遍歷了用戶的粉絲,然后再遍歷這些粉絲他們的粉絲。這一模式中的唯一真正不同之處在于 GraphViz的DOT格式文件的構造,GraphViz使用簡單的腳本格式來定義圖形,這些圖形作為你列舉的Twitter用戶的組成部分出現。如清單所展示的那樣,可以簡單地通過指定節點的關系來定義圖形。

清單11. 可視化Twitter粉絲圖(followers-graph.rb)

  1. #!/usr/bin/env ruby  
  2. require "rubygems" 
  3. require "twitter" 
  4. require 'google_chart' 
  5.  
  6. screen_name = String.new ARGV[0]  
  7.  
  8. tweetlocation = Hash.new 
  9.  
  10. # Authenticate  
  11. Twitter.configure do |config|  
  12. config.consumer_key = '' 
  13. config.consumer_secret = '' 
  14. config.oauth_token = '' 
  15. config.oauth_token_secret = '' 
  16. end 
  17.  
  18. my_file = File.new("graph.dot""w")  
  19.  
  20. my_file.puts "graph followers {" 
  21. my_file.puts " node [ fontname=Arial, fontsize=6 ];" 
  22.  
  23. # Iterate followers, hash their location  
  24. followers = Twitter.followers(screen_name, :count=>10 ).users.each do |f|  
  25.  
  26. # Only iterate if we can see their followers  
  27. if (f.protected.to_s != "true")  
  28.  
  29. my_file.puts " \"" + screen_name + "\" -- \"" + f.screen_name.to_s + "\"" 
  30.  
  31. followers2 = Twitter.followers(f.screen_name, :count =>10 ).users.each do |f2|  
  32.  
  33. my_file.puts " \"" + f.screen_name.to_s + "\" -- \"" +  
  34. f2.screen_name.to_s + "\"" 
  35.  
  36. end 
  37.  
  38. end 
  39.  
  40. end 
  41.  
  42. my_file.puts "}" 

在某個用戶上執行清單11的腳本,得出的結果放在一個dot文件中,接著使用GraphViz來生成圖像。首先調用Ruby腳本來收集圖形數據(存儲成graph.dot);接著使用GraphViz來生成圖像(這里用的是circo,該工具指定了一種圓形的布局)。生成圖像的過程定義如下:

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

最終得出的圖像如圖4所示。需要注意的是,由于這一Twitter圖表可能會很大,因為我們通過盡量減少要列舉的用戶及其粉絲的數目來限制圖表的規模(通過清單11中的:count選項)。

圖4. Twitter粉絲圖例子(極端情況的子集)

 

 

位置信息

在功能啟用的情況下,Twitter收集你和你發出tweet消息的地理位置數據。這些由經度和緯度信息組成的數據能夠用來精確地定位用戶的位置或者是tweet消息從何處發出。此外,把搜索和這些消息結合在一起,你就可以根據已定義的位置或是你所處的位置來識別出某些地方或是某些人。

并非所有的用戶或是tweet消息都啟用了地理位置功能(出于隱私原因),但這一信息是所有Twitter體驗當中的一個非常吸引人的方面。讓我們來看一個腳本,該腳本允許你可視化地理定位數據,還有另一個腳本允許你使用這一數據來進行搜索。

第一個腳本(清單12所示)抓取用戶的經度和緯度數據(回想一下清單2中的邊界框(bounding box)),盡管邊界框是一個定義代表了用戶區域的多邊形,但我做了簡化,只用了這一區域中的一個點。有了這一數據,我在一個簡單的HMTL文件中生成了一個簡單的JavaScript函數,這一JavaScript代碼與Google Maps接口,給出了這一位置的一個俯視地圖(給出提取自Twitter用戶的經度和緯度數據)。

清單12. 構造用戶地圖的Ruby腳本(where-am-i.rb)

  1. #!/usr/bin/env ruby  
  2. require "rubygems" 
  3. require "twitter" 
  4.  
  5. Twitter.configure do |config|  
  6. config.consumer_key = '<consumer_key>  
  7. config.consumer_secret = '<consumer_secret>  
  8. config.oauth_token = '<oauth_token>  
  9. config.oauth_token_secret = '<token_secret>  
  10. end 
  11.  
  12. screen_name = String.new ARGV[0]  
  13.  
  14. a_user = Twitter.user(screen_name)  
  15.  
  16. if a_user.geo_enabled == true 
  17.  
  18. long = a_user.status.place.bounding_box.coordinates[0][0][0];  
  19. lat = a_user.status.place.bounding_box.coordinates[0][0][1];  
  20.  
  21. my_file = File.new("test.html""w")  
  22.  
  23. my_file.puts "<!DOCTYPE html>  
  24. my_file.puts "<html>< head>  
  25. my_file.puts "<meta name=\"viewport\" content=\"initial-scale=1.0, user-scalable=no\"/>" 
  26. my_file.puts "<style type=\"text/css\">" 
  27. my_file.puts "html { height: 100% }" 
  28. my_file.puts "body { height: 100%; margin: 0px; padding: 0px }" 
  29. my_file.puts "#map_canvas { height: 100% }" 
  30. my_file.puts "</style>" 
  31. my_file.puts "< script type=\"text/javascript\"" 
  32. my_file.puts "src=\"http://maps.google.com/maps/api/js?sensor=false\">" 
  33. my_file.puts "</script>" 
  34. my_file.puts "<script type=\"text/javascript\">" 
  35. my_file.puts "function initialize() {" 
  36. my_file.puts "var latlng = new google.maps.LatLng(" + lat.to_s + ", " + long.to_s + ");" 
  37. my_file.puts "var myOptions = {" 
  38. my_file.puts "zoom: 12," 
  39. my_file.puts "center: latlng," 
  40. my_file.puts "mapTypeId: google.maps.MapTypeId.HYBRID" 
  41. my_file.puts "};" 
  42. my_file.puts "var map = new google.maps.Map(document.getElementById(\"map_canvas\")," 
  43. my_file.puts "myOptions);" 
  44. my_file.puts "}" 
  45. my_file.puts "</script>" 
  46. my_file.puts "</head>" 
  47. my_file.puts "<body onload=\"initialize()\">" 
  48. my_file.puts "<div id=\"map_canvas\" style=\"width:100%; height:100%\"></div>" 
  49. my_file.puts "</body>" 
  50. my_file.puts "</html>" 
  51.  
  52. else 
  53.  
  54. puts "no geolocation data available." 
  55.  
  56. end 

清單12中的腳本執行起來很簡單:

  1. $ ./where-am-i.rb MTimJones 

最終得出的HTML文件可以通過瀏覽器來渲染,像這樣:

  1. $ firefox test.html 

如果沒有可用的位置信息的話,這一腳本就會執行失敗;不過如果執行成功的話,就會生成一個HTML文件,瀏覽器可以讀入該文件來渲染出地圖。圖5給出了最終生成的地圖圖像,其顯示了美國科羅拉多州北部Front Range的部分地區。

圖5. 清單12中的腳本渲染圖像的例子

 

 

有了地理位置,你還可以通過搜Twitter來識別出與某個特定位置相關聯的Twitter用戶和tweet消息。Twitter搜索API允許使用地理編碼信息來限定搜索結果。下面清單13中的例子提取用戶的經度和緯度,然后使用這些數據獲取該位置方圓5公里之內的所有tweet消息。

清單13. 使用經度和緯度數據來搜索局部地區的tweet消息(tweets-local.rb)

  1. #!/usr/bin/env ruby  
  2. require "rubygems" 
  3. require "twitter" 
  4.  
  5. Twitter.configure do |config|  
  6. config.consumer_key = '' 
  7. config.consumer_secret = '' 
  8. config.oauth_token = '' 
  9. config.oauth_token_secret = '' 
  10. end 
  11.  
  12. screen_name = String.new ARGV[0]  
  13.  
  14. a_user = Twitter.user(screen_name)  
  15.  
  16. if a_user.geo_enabled == true 
  17.  
  18. long = a_user.status.place.bounding_box.coordinates[0][0][0]  
  19. lat = a_user.status.place.bounding_box.coordinates[0][0][1]  
  20.  
  21. Array tweets = Twitter::Search.new.geocode(lat, long, "5mi").fetch  
  22.  
  23. tweets.each do |t|  
  24.  
  25. puts t.from_user + " | " + t.text  
  26.  
  27. end 
  28.  
  29. end 

清單13中的腳本的執行結果顯示在清單14中,這是指定位置范圍內的Twitter用戶發布的tweet消息的一個子集。

清單14. 查詢我所在位置方圓5公里之內的這一局部地區的tweet消息。

  1. $ ./tweets-local.rb MTimJones  
  2. Breesesummer | @DaltonOls did he answer u  
  3. LongmontRadMon | 60 CPM, 0.4872 uSv/h, 0.6368 uSv/h, 2 time(s) over natural radiation  
  4. graelston | on every street there is a memory; a time and place we can never be again.  
  5. Breesesummer | #I'minafight with @DaltonOls to see who will marry @TheCodySimpson I will   
  6. marry him!!! :/  
  7. _JennieJune_ | ok I'm done, goodnight everyone!  
  8. Breesesummer | @DaltonOls same  
  9. _JennieJune_ | @sylquejr sleep well!  
  10. Breesesummer | @DaltonOls ok let's see what he says  
  11. LongmontRadMon | 90 CPM, 0.7308 uSv/h, 0.7864 uSv/h, 2 time(s) over natural radiation  
  12. Breesesummer | @TheCodySimpson would u marry me or @DaltonOls 
  13. natcapsolutions | RT hlovins: The scientific rebuttal to the silly Forbes release this   
  14. morning: Misdiagnosis of Surface Temperatu... http://bit.ly/nRpLJl  

繼續深入

本文給出了一些簡單的腳本,這些腳本使用Ruby語言來從Twitter中提取數據,文章的重點放在用來說明一些基本概念的腳本的開發和演示方面,但我們能做的遠不止于此。例如,你還可以使用API來瀏覽你的朋友的網絡,并找出你感興趣的最受歡迎的Twitter用戶。另一個吸引人的方面是對tweet消息本身進行挖掘,使用地理位置數據來了解基于位置的行為或是事件(比如說流感暴發)。本文只是做了一個淺顯的介紹,請在下面隨意發表你的評論,附上你自己的各種混搭程序。Ruby和Twitter gem把為數據挖掘需要開發有用的混搭應用程序和儀表盤工具的工作變得很容易。

關于作者

 

M. Tim Jones是一位嵌入式固件架構師,也是Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (現在是第二版)、AI Application Programming (第二版)和BSD Sockets Programming from a Multilanguage Perspective等書的作者。他的工程背景涉及廣泛,從同步宇宙飛船的內核開發到嵌入式系統架構和網絡協議開發都有。Tim是Intel的一位平臺架構師,也是一位作家,居住在科羅拉多州的 Longmont。

原文:http://select.yeeyan.org/view/213582/223628

【編輯推薦】

  1. Ruby開發者應該熟悉的10個工具
  2. JRuby和Java 7 我們可以期待什么
  3. Perl、PHP、Python、Java和Ruby的比較
  4. 關于Ruby/RoR我的體驗和看法
  5. 在Nginx上運行Ruby on Rails
責任編輯:陳貽新 來源: 譯言網
相關推薦

2017-10-31 11:55:46

sklearn數據挖掘自動化

2009-03-16 10:29:45

數據挖掘過濾器Access

2016-08-18 00:35:39

Pythonwitte數據采集

2009-07-01 10:46:57

JSP程序JSP代碼

2022-06-24 09:58:35

大數據JavaPython

2023-09-27 15:34:48

數據編程

2019-09-30 10:12:21

機器學習數據映射

2022-11-02 14:45:24

Python數據分析工具

2009-09-08 16:50:12

使用LINQ進行數據轉

2024-11-12 07:36:39

Python編程數據挖掘

2017-02-16 08:41:09

數據Vlookup匹配

2023-08-15 16:20:42

Pandas數據分析

2023-10-18 18:38:44

數據校驗業務

2022-03-28 14:08:02

Python數據清洗數據集

2017-05-25 08:29:30

文本挖掘技術

2009-07-16 14:46:48

jdbc statem

2023-02-15 08:24:12

數據分析數據可視化

2017-09-26 19:02:09

PythonInstagram數據分析

2021-11-09 08:15:18

Grafana 數據可視化運維

2024-01-30 01:01:48

數據集核模型高斯過程機器學習
點贊
收藏

51CTO技術棧公眾號

亚洲 国产 欧美 日韩| 国模大尺度视频| 成年人黄色片视频| 色视频在线观看免费| 石原莉奈一区二区三区在线观看| 这里只有精品视频| 久久国产色av免费观看| 麻豆一区在线观看| 清纯唯美激情亚洲| 精品日韩美女的视频高清 | 激情久久99| 亚洲美女在线一区| 欧美日韩国产综合视频在线| 国产精品视频在线观看免费| 国产情侣久久| 久久天天躁狠狠躁夜夜av| a天堂视频在线观看| 国产精品传媒麻豆hd| 亚洲一卡二卡三卡四卡五卡| 亚洲 日韩 国产第一区| 国产 欧美 精品| 久久国产福利国产秒拍| 91福利视频在线观看| 亚洲国产123| 操欧美老女人| 亚洲精品久久久久中文字幕欢迎你 | av日韩国产| 国产精品国产馆在线真实露脸 | www.久久com| 成人啊v在线| 亚洲成a人v欧美综合天堂下载| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 亚洲av成人无码久久精品老人| 国产精品中文字幕一区二区三区| 国产精品扒开腿做爽爽爽男男| 日本中文字幕免费| 欧美日本不卡高清| 久久中文字幕在线视频| 东京热无码av男人的天堂| 亚洲精品小区久久久久久| 精品福利一区二区三区免费视频| 91 视频免费观看| 免费高清视频在线一区| 欧美日韩亚洲激情| 可以在线看的av网站| 俄罗斯一级**毛片在线播放 | 欧美精品久久96人妻无码| eeuss影院www在线观看| 久久久天堂av| 欧美区高清在线| 外国精品视频在线观看| 国产一区二区剧情av在线| 国产拍精品一二三| 伊人影院中文字幕| 美女mm1313爽爽久久久蜜臀| 国产精品成人一区二区| 无码视频在线观看| 视频一区二区国产| 国产精品久久久久久久午夜| 成人小视频在线播放| 美女网站久久| 国产精品av在线播放| 亚洲精品国产精品乱码视色| 日本视频一区二区| 国产精品揄拍500视频| 一本色道久久综合亚洲| 精品一区二区三区欧美| 91精品中国老女人| 亚洲AV无码国产精品午夜字幕| 国产美女一区二区三区| 国产a一区二区| 四虎精品一区二区三区| 免费**毛片在线| 香蕉在线观看视频| 欧美日韩不卡| 欧美视频一区在线| 不用播放器的免费av| 国产精品18| 亚洲第一天堂av| 精品无人区无码乱码毛片国产 | 精品亚洲国产成人av制服丝袜 | 一本久道中文无码字幕av| 成人在线爆射| 欧美精品久久一区二区三区| 中国特级黄色片| 国产欧美日韩精品一区二区三区| 视频一区视频二区国产精品| 青娱乐国产盛宴| 久久精品官网| 99电影在线观看| 九色在线视频| 亚洲天堂免费在线观看视频| 国产96在线 | 亚洲| 一呦二呦三呦精品国产| 欧美一级片在线看| 国产福利短视频| 外国成人免费视频| 91chinesevideo永久地址| 一区二区视频免费观看| 成人看片黄a免费看在线| 任我爽在线视频精品一| 宅男网站在线免费观看| 日韩欧美在线播放| 欧美体内she精高潮| 亚洲免费成人av在线| 久久成人国产精品| 无码人妻丰满熟妇奶水区码| 国产精品系列在线观看| 日本一区二区免费看| 国产黄色在线网站| 欧美在线三级电影| 中文字幕免费高清视频| 手机亚洲手机国产手机日韩| 97国产精品视频人人做人人爱| 亚洲图片视频小说| 久久先锋影音av鲁色资源| 欧美h视频在线观看| 韩国美女久久| 亚洲国产精品久久久久秋霞蜜臀| 91麻豆精品久久毛片一级| 99re国产精品| 99久久精品免费看国产一区二区三区| 电影在线一区| 欧美日韩在线一区| 免费观看污网站| 天天做天天爱天天爽综合网| 国产精品白嫩美女在线观看| 五月天婷婷激情网| 亚洲在线成人精品| 亚洲国产午夜精品| 久久伦理在线| 国产精品99久久久久久久久久久久 | 国产一级黄色av| 精品一区二区在线观看| 无码免费一区二区三区免费播放 | 国产免费一区二区三区在线观看| 欧美18xxxxx| 色哟哟国产精品| 亚洲精品女人久久久| 国产一区二区三区自拍| 7777精品伊久久久大香线蕉语言| 日本中文字幕在线观看| 欧美视频三区在线播放| 日本成人免费视频| 日韩精品一卡二卡三卡四卡无卡| 欧美精品欧美精品| 亚洲校园激情春色| 亚洲精品视频在线播放| 成人午夜视频在线播放| 久久视频一区二区| 黄色片久久久久| 欧美激情在线精品一区二区三区| 欧美自拍大量在线观看| 免费a在线观看| 在线免费不卡视频| 亚洲一二三四视频| 久久99国产精品免费网站| 一区二区三区|亚洲午夜| 欧美特黄色片| 欧美另类极品videosbestfree| 国产99久一区二区三区a片| 亚洲精品成a人| 性农村xxxxx小树林| 亚洲人妖在线| 欧美一级爱爱| 欧美亚洲二区| 色综合天天狠天天透天天伊人| 亚洲黄色片视频| 欧美日韩裸体免费视频| 丰满少妇高潮一区二区| 日韩成人精品在线观看| 中文字幕久精品免| 亚洲精品在线播放| 91精品国产乱码久久久久久蜜臀 | 欧美亚洲日本网站| 国产免费a∨片在线观看不卡| 欧美亚洲国产一区二区三区va| 精品视频第一页| 国产成人av电影在线| 成人av一级片| 日韩一区电影| 国产精品久久久久久久小唯西川 | 国产精品v欧美精品∨日韩| 欧美调教sm| 日韩中文娱乐网| 亚洲精品成人区在线观看| 日韩人体视频一二区| 日韩在线视频网址| 99国产精品一区| 日韩成人精品视频在线观看| 亚洲日本激情| 亚洲一区三区电影在线观看| 电影一区二区在线观看| 国产精品精品久久久| 青草av在线| 夜夜躁日日躁狠狠久久88av | 亚洲日本成人网| 国产丰满果冻videossex| 欧美视频一二三| 成熟的女同志hd| 国产视频一区二区在线| 岛国大片在线免费观看| 日本美女一区二区三区| 黄色国产一级视频| 婷婷综合激情| 日韩精品成人一区二区在线观看| 视频一区在线| 国产精品揄拍500视频| 中文在线аv在线| 久久福利网址导航| seseavlu视频在线| 日韩精品亚洲精品| 亚洲国产精品成人久久蜜臀| 欧美午夜精品久久久久久孕妇| 日韩精品视频免费播放| 亚洲日本韩国一区| 中文字幕伦理片| 91麻豆免费在线观看| 国产乱淫av片| 国产精品69久久久久水密桃| 国产视频手机在线播放| 国产精品女主播一区二区三区| av久久久久久| 婷婷综合视频| 中文精品一区二区三区| 欧美日韩性在线观看| 蜜桃精品久久久久久久免费影院| 91精品入口| 99re在线国产| 国产一区二区视频在线看| 国产精品视频久久久| 粉嫩一区二区三区| 欧美综合第一页| 手机av在线| 91av视频在线| 男人av在线播放| 5566成人精品视频免费| 9999在线视频| 亚洲91精品在线观看| 电影在线观看一区| 2024亚洲男人天堂| 午夜影院在线播放| 欧美一区二区三区免费观看| 国产资源在线观看入口av| 欧美劲爆第一页| brazzers在线观看| 午夜精品久久久久久99热| 爱情岛亚洲播放路线| 国产69精品久久久久99| 波多野在线观看| 97视频国产在线| 成人美女视频| 国产精品久久久久影院日本| 色老太综合网| 国产精品久久久久久超碰| 日本精品网站| 91精品国产综合久久香蕉最新版 | 欧美日韩和欧美的一区二区| 亚洲综合免费视频| 欧美一区二区三区免费大片| 超碰在线人人干| 亚洲成人在线视频播放| 亚洲av电影一区| 一区二区三区在线播放欧美| 日本中文字幕视频在线| 久久久999国产| 搞黄网站在线看| 欧美专区第一页| 五月天色综合| 国产一区二区不卡视频在线观看| 天堂在线精品| 亚洲欧美影院| 欧美激情视频一区二区三区免费| 97中文字幕在线| 免播放器亚洲| 一个色综合久久| 国产91精品在线观看| 亚洲中文字幕一区| 国产亚洲精品超碰| 成人在线观看小视频| 亚洲成人777| 国产成人精品一区二区色戒| 日韩一区二区视频在线观看| 视频国产一区二区三区| 国产亚洲综合久久| 性直播体位视频在线观看| 欧美一级淫片aaaaaaa视频| 人人玩人人添人人澡欧美| 国产成人免费观看| 清纯唯美日韩| 日韩伦理在线免费观看| 日韩精品国产精品| 日韩女优在线视频| 国产精品麻豆久久久| 欧美日韩激情在线观看| 色婷婷av一区二区三区大白胸| 国产美女自慰在线观看| 日韩激情视频在线播放| 欧美成人三区| 欧美亚洲成人免费| 日韩精品一级毛片在线播放| 国产传媒一区| 91欧美在线| 国产精品-区区久久久狼| 久久99久久99小草精品免视看| 看全色黄大色黄女片18| 国产精品国产自产拍高清av| 日韩在线视频免费播放| 在线综合视频播放| 亚洲人在线观看视频| 美女精品视频一区| 国产精品xxx| 日本精品一区二区三区视频 | 色综合视频在线| 久久人体大胆视频| 日韩精品第一| 麻豆成人av| 亚洲福利免费| 一个人看的视频www| 国产精品无人区| 97人妻一区二区精品视频| 亚洲激情国产精品| 久久久123| 91精品天堂| 一级毛片免费高清中文字幕久久网| 日本熟妇人妻xxxxx| 成人自拍视频在线| 欧美成欧美va| 欧美一区二区不卡视频| 免费a级人成a大片在线观看| 国产精品美女免费视频| 奇米狠狠一区二区三区| 国产精品视频一区二区三区四区五区| 国产电影一区在线| 日本少妇高清视频| 9191国产精品| 操你啦在线视频| 91入口在线观看| 欧美国产日本| 97中文字幕在线观看| 一区二区三区日韩| 亚洲av少妇一区二区在线观看 | 夜夜爽99久久国产综合精品女不卡| 日韩黄色在线观看| 日本成人午夜影院| 欧美无人高清视频在线观看| 91在线观看| 成人免费自拍视频| 天天揉久久久久亚洲精品| 日本不卡一区二区在线观看| 国产精品久久久久久久久晋中| 在线观看免费中文字幕| 日韩天堂在线视频| www.久久热| 国产在线视频综合| 不卡的av中国片| 午夜婷婷在线观看| 一个人看的www久久| 国产精品无码久久久久| 欧美 另类 交| 成人美女在线视频| 日韩精品久久久久久免费| 亚洲欧洲第一视频| 国产精品麻豆成人av电影艾秋| 中文字幕欧美日韩一区二区| 国产精品中文字幕日韩精品| 国产精彩视频在线观看| 亚洲男子天堂网| 日韩深夜福利网站| avav在线播放| 久久久午夜精品理论片中文字幕| 欧美 亚洲 另类 激情 另类| 操91在线视频| 日日天天久久| 999在线观看| 亚洲一级二级三级在线免费观看| 无码精品一区二区三区在线| 国产精品第七影院| 911久久香蕉国产线看观看| 蜜桃视频无码区在线观看| 欧美性xxxxxxx| 黄网站免费在线观看| 国产一区二区在线观看免费播放 | 女女调教被c哭捆绑喷水百合| 天天色图综合网| 在线看av的网址| 国产精品一区二区三区四区五区| 日韩精品欧美精品| 欧美人妻一区二区| 亚洲欧美日韩精品| 日韩欧美中文字幕在线视频| 播放灌醉水嫩大学生国内精品| 国产精品美女久久久久久久 | 奇米精品一区二区三区| 中文字幕av免费专区久久| 国产综合视频在线| 国产精品一区二区久久国产| 伊人精品成人久久综合软件| 免费黄色国产视频| 精品亚洲一区二区三区在线播放 |