質問: Nokogiri::HTML.parse(html, nil, charset) #xpath指定 doc.xpath('//*[@id="all-bookmarks"]/*[@id="public-bookmarks"]/*[@id="remaining-all-bookmarks"]/ul').each do |node| puts node.css('li').size end ``` ### 試したこと、発生している問題 各ブックマークデータは、 1) $x('//*[@id="all-bookmarks"]/*[@id="public-bookmarks"]/ul')に上位30個 2) $x(''//*[@id="all-bookmarks"]/*[@id="public-bookmarks"]/*[@id="remaining-all-bookmarks"]/ul')に残りすべて が格納されているようです。 これらを上記コードに入れてみたとき、1)の30個は出てくるのですが、2)が出てきません。 どうすれば全てのブックマークを取得できるでしょうか? ### 補足 Ruby2.3.0 はてなAPIでブックマーク情報は取得できますが、APIではブックマークについたスターの数などまでは取得できないのであくまでスクレイピングで行いたいです。 ### 追記 どうも無限スクロールページでのスクレイピングの問題のようです。 少し調べたらとちょっと難しそうなのでやっぱりAPIから攻めたほうがいいのかなとも思っています。
回答: はてなブックマークに全く詳しくないので、 スクレイピングしたい箇所があっているか微妙ですが。。 「すべてのブックマーク」の中身を取得する場合、 無限スクロールではありませんが、 「すべてのブックマーク」がActiveな時にappendするようになってるぽいです。 制御はCookieで行ってるぽいので、optionに追加してあげれば取れました。 ``` require 'open-uri' require 'nokogiri' # スクレイピング先のURL url = 'http://b.hatena.ne.jp/entry/s/www.ruby-lang.org/ja/' opt = { 'User-Agent' => 'Opera/9.80 (Windows NT 5.1; U; ja) Presto/2.7.62 Version/11.01', 'Cookie' => 'bookmarks_tab=all-bookmarks' } charset = nil html = open(url, opt) do |f| charset = f.charset f.read end doc = Nokogiri::HTML.parse(html, nil, charset) # xpath指定 doc.xpath('//*[@class="bookmark-list"]/li').each do |node| puts node.css('.comment').inner_text end ``` 追記(2016/12/14) =============== 失礼しました。 最後まで取得できてませんでしたね。。 30件以降はAjaxを使用して分割取得しているみたいです。 ``` // BookMark.js?... B.Entry.CommentListLoader = new B.Class({ // 移すとなんかあるかもしれないので省略 ``` ``` # Request Header Accept:*/* Accept-Encoding:gzip, deflate, sdch Accept-Language:ja,en-US;q=0.8,en;q=0.6 Cache-Control:no-cache Connection:keep-alive Cookie:# ~~~ Pragma:no-cache Referer:http://b.hatena.ne.jp/entry/qiita.com/seki_uk/items/4001423b3cd3db0dada7 User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36 # Query String Parameters view source view URL encoded eid:312351169 page:1 per_page:500 shown:30 comment_only:0 ``` nokogiriを使用したのは今回が初めてで詳しくないのですが、 一度hatenaにアクセス後、cookie情報をメモリに格納し、 スクレイピング時に使用して、 以下のURLにヘッダとパラメータを偽装してアクセスする形になるのかなと思いました。 `http://b.hatena.ne.jp/entry.comment_fragments`