質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

9547閲覧

【Ruby】Nokogiriを使ってブックマークのデータを取得したい

ankored

総合スコア25

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2016/12/13 06:02

編集2016/12/13 13:05

プログラミング初心者です。

###前提・実現したいこと
Nokogiriで「はてなブックマーク」一覧ページから各ブックマークの情報を参照したい。

処理したいブックマークページの一例
http://b.hatena.ne.jp/entry/s/www.ruby-lang.org/ja/

上記のような一覧ページから各ブックマークの情報を取り出したいです。

###該当のソースコード

require 'open-uri' require 'nokogiri' #スクレイピング先のURL url = 'http://b.hatena.ne.jp/entry/s/www.ruby-lang.org/ja/' opt = {} opt['User-Agent'] = 'Opera/9.80 (Windows NT 5.1; U; ja) Presto/2.7.62 Version/11.01 ' charset = nil html = open(url,opt) do |f| charset = f.charset f.read end doc = 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から攻めたほうがいいのかなとも思っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

はてなブックマークに全く詳しくないので、
スクレイピングしたい箇所があっているか微妙ですが。。

「すべてのブックマーク」の中身を取得する場合、
無限スクロールではありませんが、
「すべてのブックマーク」がActiveな時にappendするようになってるぽいです。

制御はCookieで行ってるぽいので、optionに追加してあげれば取れました。

Ruby

1require 'open-uri' 2require 'nokogiri' 3 4# スクレイピング先のURL 5url = 'http://b.hatena.ne.jp/entry/s/www.ruby-lang.org/ja/' 6opt = { 7 'User-Agent' => 'Opera/9.80 (Windows NT 5.1; U; ja) Presto/2.7.62 Version/11.01', 8 'Cookie' => 'bookmarks_tab=all-bookmarks' 9} 10 11charset = nil 12html = open(url, opt) do |f| 13 charset = f.charset 14 f.read 15end 16 17doc = Nokogiri::HTML.parse(html, nil, charset) 18 19# xpath指定 20doc.xpath('//*[@class="bookmark-list"]/li').each do |node| 21 puts node.css('.comment').inner_text 22end

追記(2016/12/14)

失礼しました。
最後まで取得できてませんでしたね。。
30件以降はAjaxを使用して分割取得しているみたいです。

JavaScript

1// BookMark.js?... 2B.Entry.CommentListLoader = new B.Class({ 3// 移すとなんかあるかもしれないので省略
# 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

投稿2016/12/13 13:57

編集2016/12/14 00:31
mukkun

総合スコア882

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ankored

2016/12/14 04:23

丁寧にご回答いただき、ありがとうございます。 >一度hatenaにアクセス後、cookie情報をメモリに格納し、 >スクレイピング時に使用して、 >以下のURLにヘッダとパラメータを偽装してアクセスする形になるのかなと思いました。 >http://b.hatena.ne.jp/entry.comment_fragments 頂いた情報をもとにこの方針で試行錯誤してみようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問