HTMLで言うと、例えば
<a href="http://q.hatena.ne.jp/">はてな</a>
ならば、
「http://q.hatena.ne.jp/」
と
「はてな」
を取得してくれると嬉しいです。
WebページのURLを入力したら、該当ページ内にある全ての「リンク先のURLと文字列」をドーッっと取得してくれるのが理想です。調べたいWebページは数百あるので、できるだけ力作業にならないようにしたいです。
フリーソフトやプログラムでも構いませんが、上記が叶う「使いやすい!」という方法等ありましたら、どうぞよろしくお願い致します。
Ruby で書いてみました。
require 'net/http' require 'uri' Net::HTTP.version_1_1 #RE_A = %r|<a\s[^>]+href="([^"]+)"[^>]*>([^<]+)</a>|i TransFreeBSD さんの突っ込みを受けて RE_A = %r|<a\s[^>]*href="([^"]+)"[^>]*>(.+?)</a>|i def extract_anchor(url) response = http_get(url,10) body = response.body index = 0 last = body.length - 1 while (p = (RE_A =~ body[index, last])) puts "#{$1} --> #{$2}" index += p + $1.length + $2.length end end $http_clazz = Net::HTTP def http_get( uri_str, limit = 10 ) raise ArgumentError, 'http redirect too deep' if limit == 0 uri = URI.parse(uri_str) response = nil target = $http_clazz.new(uri.host, uri.port) target.read_timeout = 600 target.start { |http| if uri.query.nil? then response, = http.get(uri.path) else response, = http.get(uri.path + '?' + uri.query) end } return response end target_url = "http://q.hatena.ne.jp/1334564001" extract_anchor(target_url)
抽出対象のページを、この質問の URL にしてみました。
結果は、こちら。
https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> ユーザー登録 https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> ログイン /help --> ヘルプ / --> トップ /list --> 質問一覧 /ranking --> 注目の質問 /c/korenani --> コレナニ? /enter --> 質問する /enter?type=enquete --> アンケートする / --> 人力検索はてな http://q.hatena.ne.jp/"> --> http://q.hatena.ne.jp/"> http://q.hatena.ne.jp/ --> http://q.hatena.ne.jp/ #c236156 --> 2012/04/16 19:13:08 https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> すでに登録されている方はこちらからログイン
最後の
target_url = "http://q.hatena.ne.jp/1334564001" extract_anchor(target_url)
の部分を、
while gets extract_anchor($_.chomp) end
とすると、URL の一覧を別ファイルに持っておいて、それを順次処理するようにできます。
言語は何でも良いと思いますが、何か一つ覚えておくと、こういうときに便利です。
もし、Ruby 以外をお望みなら「○○のコードが欲しいー」と、大きい声で叫ぶと、あんな人や、こんな人(どんな人?)が、コードを書いてくれそうな気がします。
とりあえず、Perl や PHP だったら、もう試している人がいるような気がします。
/ --> <img class="service-logo" src="/images/logo_question.png?new" alt="人力検索はてな" title="人力検索はてな"> https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> ユーザー登録 https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> ログイン /help --> ヘルプ http://www.hatena.ne.jp/ --> <img src="http://cdn.www.st-hatena.com/images/header/global-logo.png" alt="Hatena"> / --> トップ /list --> 質問一覧 /ranking --> 注目の質問 /c/korenani --> コレナニ? /enter --> 質問する /enter?type=enquete --> アンケートする / --> 人力検索はてな /c/computer --> コンピュータ /miku1973/ --> <img src="http://www.st-hatena.com/users/mi/miku1973/profile_l.gif" width="32" height="32" title="id:miku1973" alt="id:miku1973" class="hatena-id-image"> /miku1973/ --> miku1973 /miku1973/ --> もっと見る /1334564001 --> <img src="/images/icon-jinriki-s.gif" alt="" title="" class="question-type"> /c/computer --> コンピュータ /c/internet --> インターネット http://q.hatena.ne.jp/"> --> http://q.hatena.ne.jp/"> http://q.hatena.ne.jp/ --> http://q.hatena.ne.jp/ https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> <img src="/images/button-login-hatena.gif" alt="はてなIDでログイン" title="はてなIDでログイン"> ${url} --> <img src="${image_url}" alt="${alt}" data-urlname="${urlname}" class="hatena-id-image">{{if exuser}}<img src="/images/q/border-${exservice}.gif" class="badge-service">{{/if}}<img src="${emoticon_url}" alt="${emoticon_alt}" class="emoticonicon"> /a-kuma3/ --> <img src="http://www.st-hatena.com/users/a-/a-kuma3/profile_l.gif" width="32" height="32" title="id:a-kuma3" alt="id:a-kuma3" class="hatena-id-image"> /a-kuma3/ --> a-kuma3 /1334564001#a1142689 --> 2012/04/16 21:32:39 https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 http://q.hatena.ne.jp/"> --> http://q.hatena.ne.jp/"> http://q.hatena.ne.jp/"> --> http://q.hatena.ne.jp/"> http://q.hatena.ne.jp/ --> http://q.hatena.ne.jp/ http://q.hatena.ne.jp/ --> http://q.hatena.ne.jp/ https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 /maya70828/ --> <img src="http://www.st-hatena.com/users/ma/maya70828/profile_l.gif" width="32" height="32" title="id:maya70828" alt="id:maya70828" class="hatena-id-image"> /maya70828/ --> 楽1978 /1334564001#a1142690 --> 2012/04/16 21:36:21 http://www.forest.impress.co.jp/article/2005/06/17/ablink.html --> http://www.forest.impress.co.jp/article/2005/06/17/ablink.html http://www.vector.co.jp/soft/dl/win95/net/se261717.html --> http://www.vector.co.jp/soft/dl/win95/net/se261717.html http://inforati.jp/apple/mac-tips-techniques/windows-hints/how-to-install-virtualbox-and-use-windows-software-in-mac.html --> http://inforati.jp/apple/mac-tips-techniques/windows-hints/how-to-install-virtualbox-and-use-windows-software-in-mac.html https://www.virtualbox.org/wiki/Downloads --> https://www.virtualbox.org/wiki/Downloads http://wayohoo.com/mac/apps/utilities/mikuinstaller.html --> http://wayohoo.com/mac/apps/utilities/mikuinstaller.html /language_and_engineering/ --> <img src="http://www.st-hatena.com/users/la/language_and_engineering/profile_l.gif" width="32" height="32" title="id:language_and_engineering" alt="id:language_and_engineering" class="hatena-id-image"> /language_and_engineering/ --> lang_and_engine /1334564001#a1142745 --> 2012/04/17 10:41:36 /TransFreeBSD/ --> <img src="http://www.st-hatena.com/users/Tr/TransFreeBSD/profile_l.gif" width="32" height="32" title="id:TransFreeBSD" alt="id:TransFreeBSD" class="hatena-id-image"> /TransFreeBSD/ --> <img src="http://www.st-hatena.com/users/Tr/TransFreeBSD/profile_s.gif" width="16" height="16" alt="" class="hatena-id-icon">TransFreeBSD #c236156 --> 2012/04/16 19:13:08 http://twitter.com/#!/${screen_name}/status/${id} --> <img src="${profile_image_url}" class="profile-image" width="32" height="32"> http://twitter.com/#!/${screen_name}/status/${id} --> @${screen_name} /help/answer_request --> 制限について #ar-tabs-3 --> ともだちから選択 #ar-tabs-4 --> リクエスト送信済 http://rikunabi-next.yahoo.co.jp/ --> 転職ならリクナビNEXT http://b.hatena.ne.jp/entry/http://q.hatena.ne.jp/1334564001 --> <img src="http://b.st-hatena.com/images/entry-button/button-only.gif" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /> http://twitter.com/share --> ツイートする /TransFreeBSD/watchlist --> <img src="http://www.st-hatena.com/users/Tr/TransFreeBSD/profile.gif" width="24" height="24" title="id:TransFreeBSD" alt="id:TransFreeBSD" class="hatena-id-image"> /a-kuma3/watchlist --> <img src="http://www.st-hatena.com/users/a-/a-kuma3/profile.gif" width="24" height="24" title="id:a-kuma3" alt="id:a-kuma3" class="hatena-id-image"> /keyword/%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BD%E3%83%95%E3%83%88 --> <span class="list-tag-word" data-score="47">フリーソフト</span><span class="related-count">1732</span> /keyword/%E3%81%AF%E3%81%A6%E3%81%AA --> <span class="list-tag-word" data-score="43">はてな</span><span class="related-count">4842</span> /keyword/HTML --> <span class="list-tag-word" data-score="34">HTML</span><span class="related-count">3994</span> /keyword/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0 --> <span class="list-tag-word" data-score="23">プログラム</span><span class="related-count">4106</span> /keyword/URL --> <span class="list-tag-word" data-score="23">URL</span><span class="related-count">9396</span> /keyword/%E6%96%87%E5%AD%97%E5%88%97 --> <span class="list-tag-word" data-score="23">文字列</span><span class="related-count">1672</span> https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001&via=200101 --> <img src="/images/button-register.gif" alt="いますぐ利用登録!無料" /> https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> すでに登録されている方はこちらからログイン /1237778469 --> <span class="question-content">★採用回答には 300 ~ 800 pt★ 以下に示す「ユーザーの動作」を私が行った場合に、「プログラム/スクリプトの動作」を自動で行ってくれる方法を教えて下さい…</span> /Nigitama/ --> にぎたま /1323393541 --> <span class="question-content">A8の楽天市場のアフィリエイトがリニューアルされてA8の管理画面からリンクを作るようになりましたが、以前のように商品の検索結果をアフィリエイトのリンクに…</span> /ringomaru/ --> ringomaru /1323393541#a1122008 --> <img src="/images/badge-bestanswer-s.gif" alt="ベストアンサーあり"> /1164276573 --> <span class="question-content">IISのASP(VBScript)でWiki記法のパーサーのようなものを実装したいとおもっています。…</span> /youichirou/ --> よーいち /1200474454 --> <span class="question-content">フリーソフトを探しています。自分で作る場合のヒントでも結構ですので情報をお願いします。…</span> /freewriter/ --> にらたま /1155130885 --> <span class="question-content">SSL、CGI を使ったサイトの質問です。 https://www.example.jp/form.html にアクセスしたときの form.html に張られている相対リンク(例えば、./help.html) をク…</span> /ishideo/ --> ishideo /1328175221 --> <span class="question-content">Ubuntu11.04でGVIMを利用していますが、 コマンドモード時に日本語入力ができなくて困っています。…</span> /hardboiled243/ --> hardboiled243 /1328926452 --> <span class="question-content">WEB上でテキストを入力すると、その内容に応じて情報を表示するシステムの作成方法について 以下のようなサイト内のシステムをどのように作ったらよいのか 質問…</span> /lilmo345/ --> lilmo345 /1328926452#a1132033 --> <img src="/images/badge-bestanswer-s.gif" alt="ベストアンサーあり"> ${url} --> <img src="${image_url}"> ${url} --> ${title} http://b.hatena.ne.jp/entry/${url} --> <img src="http://b.hatena.ne.jp/entry/image/${url}">
先の回答は、自戒の意味を込めて、元の形が残るように修正しました。
>WebページのURLを入力したら~
理想のソフトではありませんが、リンク先のURLと文字列を取得するソフトがあります。
AB-Link説明(ページ内にあるリンクは切れています)
http://www.forest.impress.co.jp/article/2005/06/17/ablink.html
AB-Linkダウンロード
http://www.vector.co.jp/soft/dl/win95/net/se261717.html
*Macでは使えないのと別途VB6.0ランタイムが必要です。
もしMacでどうしても使うのであれば
MacとWindowsを同時使用できる無料の仮想化ソフト「VirtualBox」の使い方
http://inforati.jp/apple/mac-tips-techniques/windows-hints/how-to-install-virtualbox-and-use-windows-software-in-mac.html
「VirtualBox」ダウンロード
https://www.virtualbox.org/wiki/Downloads
Mac上でWindowsのソフトが動いてしまうフリーソフト「MikuInstaller」の使い方
http://wayohoo.com/mac/apps/utilities/mikuinstaller.html
も検討してみるのもいいかもしれません。(VB6.0ランタイムがちゃんと動くかどうかは不明)
ブックマークレットとして,1行で実装しました。
IEで該当ページを開き,ブラウザのURLバーに下記の文字列をコピペして,Enterを押してください。
javascript:(function(){var d=window.document;var as=d.getElementsByTagName("a");var s="";var v=d.createElement("div");for(var i=0,len=as.length;i<len;i++){s+=i+", "+as[i].href+", "+as[i].innerText+"<br>";}v.innerHTML=s;d.body.appendChild(v);alert("完了");})();void(0);
サンプルとして,このページで実行すると,画面の末尾に下記のように結果が一瞬で出力されます。
0, http://q.hatena.ne.jp/, 1, https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001, ユーザー登録 2, https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001, ログイン 3, http://q.hatena.ne.jp/help, ヘルプ 4, http://www.hatena.ne.jp/, 5, http://q.hatena.ne.jp/, トップ 6, http://q.hatena.ne.jp/list, 質問一覧 7, http://q.hatena.ne.jp/ranking, 注目の質問 8, http://q.hatena.ne.jp/c/korenani, コレナニ? 9, http://q.hatena.ne.jp/enter, 質問する 10, http://q.hatena.ne.jp/enter?type=enquete, アンケートする ・・・ 109, http://www.amazon.co.jp/exec/obidos/ASIN/B007BRSJP8/hatena-q-22/ref=nosim, ハテナ/夢みたいだ 110, http://b.hatena.ne.jp/entry/http://www.amazon.co.jp/exec/obidos/ASIN/B007BRSJP8/hatena-q-22/ref=nosim, 111, http://www.amazon.co.jp/exec/obidos/ASIN/4798126179/hatena-q-22/ref=nosim, 112, http://www.amazon.co.jp/exec/obidos/ASIN/4798126179/hatena-q-22/ref=nosim, HTML5の絵本 113, http://b.hatena.ne.jp/entry/http://www.amazon.co.jp/exec/obidos/ASIN/4798126179/hatena-q-22/ref=nosim, 114, http://www.amazon.co.jp/exec/obidos/ASIN/4822283151/hatena-q-22/ref=nosim, 115, http://www.amazon.co.jp/exec/obidos/ASIN/4822283151/hatena-q-22/ref=nosim, プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識 116, http://b.hatena.ne.jp/entry/http://www.amazon.co.jp/exec/obidos/ASIN/4822283151/hatena-q-22/ref=nosim, 117, http://www.amazon.co.jp/exec/obidos/ASIN/4789818446/hatena-q-22/ref=nosim, 118, http://www.amazon.co.jp/exec/obidos/ASIN/4789818446/hatena-q-22/ref=nosim, PerlによるWebユーザビリティ向上テクニック―ユーザ追跡/対ロボット/ログ解析;エラー回避/検索/URL転送/文字コード/パフォーマンス/セキュリティ (Web Proシリーズ) 119, http://b.hatena.ne.jp/entry/http://www.amazon.co.jp/exec/obidos/ASIN/4789818446/hatena-q-22/ref=nosim,
ありがとうございます!
いちばん簡単そうだったlang_and_engineさんのをやってみましたが、凄すぎです。感動しました。使わさせていただきますね!お礼まで。
エエー いいのでしょうか。
ページが数百あると各ページでの手動作業になってしまいます。
でも1ページ分の抽出は一瞬で,ブラウザさえあれば実行できるので,使いやすいのは確かです。
複数人で手分け等すれば,この方法は堅実かもしれません。
もし,これ系の要望を自作プログラムで実現したい場合,必要になるキーワードを下記に記しておきます。
今後の質問等にお役立て下さい。
・Webスクレイピング。
・DOM構造のパース。(正規表現による文字列解析は,泥沼にはまるのでNG)
・ブラウザの自動操作。
・HTTPクローラ。
時間さえあれば,複数ページでも一発で手軽に実行できるようなバッチを書きたい所なんですがね。
つNokogiri
id:Cherenkov さんから、Nokogiri(という XML/HTML を解釈してくれるライブラリ)を使えばええやん、という突っ込みを受けたので、別のソースを書きました。
言いなりだと芸が無いので、Mechanize というライブラリを使ってみました(Mechanize は Nokogiri を使ってます)。
require 'mechanize' agent = Mechanize.new agent.get('http://q.hatena.ne.jp/1334564001') agent.page.links.each { |link| puts "#{link.href} --> #{link.text}" }
# うぉ、短い
使ったことが無いライブラリだったので、サンプルコードのお世話になりました。
http://mechanize.rubyforge.org/EXAMPLES_rdoc.html
http://d.hatena.ne.jp/kitamomonga/touch/searchdiary?word=*[Mechanize]&of=15
http://w.livedoor.jp/ruby_mechanize/d/Mechanize%3a%3aPage
http://w.livedoor.jp/ruby_mechanize/d/Mechanize%3a%3aPage%3a%3aLink
回答4を発展させてみました。
https://gist.github.com/2410393
ruby get_anchor.rb url_list.txt
のようにURLが一行ずつ書いてあるテキストファイルを読み込むと、outputフォルダに各URLの結果のテキストファイルを作成します。
でいけると思います。
なはは、穴だらけ :-)
2012/04/17 11:51:11つNokogiri
2012/04/17 21:28:12