1

Nokogiriを使用して、bit.ly 統計ページから Twitter ユーザー名を解析しようとしています。

require 'rubygems'
require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://bitly.com/U026ue+/global'))

twitter_accounts = []

shares = doc.xpath('//*[@id="tweets"]/li')

shares.map do |tweet|
  twitter_accounts << tweet.at_css('.conv.tweet.a')
end

puts twitter_accounts

私の理解では、Nokogiri はsharesドリルダウンに使用できるツリー構造の形式で保存されますが、マイレージはさまざまです。

4

2 に答える 2

4

そのデータは、JSON 応答を含む Ajax 要求から入ってきます。ただし、取得するのは非常に簡単です。

require 'json'
url = 'http://search.twitter.com/search.json?_usragnt=Bitly&include_entities=true&rpp=100&q=nowness.com%2Fday%2F2012%2F12%2F6%2F2643'
hash = JSON.parse open(url).read
puts hash['results'].map{|x| x['from_user']}

Chrome でページを読み込んでからネットワーク パネルを見て、その URL を取得しました。また、タイムスタンプとコールバック パラメータを削除して、少しクリーンアップしました。

于 2012-12-09T09:04:42.183 に答える
2

実際、エリック・ウォーカーは何かに夢中でした。を見るとdoc、ツイートがあるはずのセクションは次のようになります。

<h2>Tweets</h2>
  <ul id="tweets"></ul>
</div>

これは、Nokogiri が実行していない JavaScript 呼び出しによって生成された可能性があります。考えられる解決策の 1 つは、 を使用watirしてページをトラバースし、JavaScript をロードしてから HTML を保存することです。

これを実現するスクリプトを次に示します。XPath 引数にいくつか問題がありましたが、私はそれを解決しました。watir は、このスクリプトを実行するたびに新しいブラウザーを開きます。

require 'watir'
require 'nokogiri'

browser = Watir::Browser.new
browser.goto 'http://bitly.com/U026ue+/global'

doc = Nokogiri::HTML.parse(browser.html)

twitter_accounts = []

shares = doc.xpath('//li[contains(@class, "tweet")]/a')

shares.each do |tweet|
  twitter_accounts << tweet.attr('title')
end

puts twitter_accounts
browser.close

ヘッドレスを使用して、ウィンドウが開かないようにすることもできます。

于 2012-12-09T06:54:24.647 に答える