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

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

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

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

Q&A

解決済

2回答

2796閲覧

Rubyで作るクローラーについて2

abcdtaichi

総合スコア18

Ruby

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

1グッド

1クリップ

投稿2017/09/13 21:21

昨日も質問して連続するのは避けたかったのですが、昨日の夜からやっていて全然解決しなかったので質問します。
僕はRubyで「キーワードを入力したら、Googleの検索結果上位10サイトの記事タイトルと見出しをテキストで出力できる」というツールを作ろうと思っています。

今できているソースコードが以下です。

require 'anemone' require 'nokogiri' require 'kconv' require 'URI' #キーワード入力からグーグルの検索URLまで puts "キーワードを入力してください" keyword = gets.chomp word = URI.encode("https://www.google.co.jp/search?q=#{keyword}") #巡回対象サイトのURLを指定する場所 Anemone.crawl(word, :delay => 3, :depth_limit => 0) do |anemone| #すべてのページに対しての処理 anemone.on_every_page do |page| #文字化けさせない encoded_page = Nokogiri::HTML.parse(page.body.toutf8) #抽出するタグを指定する場所(//h3だとタイトルを貰えるみたい) encoded_page.xpath("//h3").each do |title| #出力する場所 puts "タイトル:#{title.text}" end end end

一応これでキーワードを入力すると、上位10サイトの記事タイトルを出力してくれるようになりました。
ここからそれぞれのサイトの見出し(Hタグ)を出力させようとしたのですが、できませんでした。

教えていただきたいのは以下の2つです。

・anemoneの階層を「0」から「1」にしたときに出てくる上位サイト以外のもの(Google画像検索など)を排除するコード
・1件の検索結果ごとにタイトルと見出しを出力させるコード

一部でもいいのでわかる部分があったら、アドバイスいただけると幸いです。
よろしくお願いいたします。

mtdsnsk👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

取得方法以前の問題となりますが、Googleの検索結果をスクレイピングすることはGoogle側で利用規約違反とみなされるので、途中でエラーとなります。

本サービスを不正に利用しないでください。たとえば、本サービスの妨害や、Google が提供するインターフェースおよび手順以外の方法による本サービスへのアクセスを試みてはなりません。(利用規約より)

投稿2017/09/13 22:26

maisumakun

総合スコア145183

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

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

abcdtaichi

2017/09/14 06:37

maisumakun様 アドバイスと参考リンクありがとうございます。 ただいくつか疑問に残ることがあるので、再度質問させてください。 >Googleの検索結果をスクレイピングすることはGoogle側で利用規約違反とみなされる とありますが、「Googleが検索結果をスクレイピングすることを利用規約違反」と具体的に明示している文章はあるでしょうか?またGoogleの検索結果をスクレイピングをして利用規約違反として、サービスの停止などがされた例はありますか? というのも「検索順位チェックツール」や「キーワードツール」、「SEOツール」、「被リンクチェックツール」などGoogleの検索エンジンを一般利用とは別の形で利用しているツールは多くあります。もちろん、これらの中には過去Googleが攻撃とみなすような過剰な利用をしてサービス停止にされたツールがあるかもしれません。 しかし逆に言えば、「個人レベルの規模で私的利用に留まるツールについてはGoogleが許容範囲としている」とも考えられます。 僕は数千数万サイトと情報を抜き取って、Googleに攻撃や妨害をするつもりはありませんし、収集した情報についてもあくまで私的利用が目的です。これでGoogleの利用規約違反となって、サービス停止となるものなのでしょうか? 少し棘っぽい文章になってしまいましたが、決して責めたり言い争いをしたりしたいわけではありません。純粋に知識としてほしいだけなので、勘違いをさせてしまったら申し訳ないです。 それではよろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2017/09/14 07:01

自己中心的な人ですね。。。 使用するならルールを守る。ルールが守れないなら利用しない。 社会の基本です。 規約に従えない使い方がしたい場合、個別に利用規約(または契約)を締結するのが、正常な社会です。
abcdtaichi

2017/09/14 07:11

te2ji様 勘違いをされているようですが、もしGoogleが検索結果のスクレイピングを完全な規約違反としているなら僕はそれに従ってルールを守るつもりでいます。 でもGoogleは完全に黒だと言っていないように思えますが、どうなんでしょうか?ってことです。
退会済みユーザー

退会済みユーザー

2017/09/14 07:15

> Google が提供するインターフェースおよび手順以外の方法による本サービスへのアクセスを試みてはなりません。 違反です。
maisumakun

2017/09/14 07:33

明文を見つけました(https://support.google.com/webmasters/answer/66357)。 「Google の利用規約では、どのような種類かに関わらず、自動化されたクエリを Google から明示的な許可を事前に得ずに Google のシステムに送信することは禁止されています。」
abcdtaichi

2017/09/14 07:52

maisumakun様 明文ありがとうございます。 Googleにクローラー出すこと自体すでに規約違反なんですね・・・。 今まで「検索順位チェックツール」や「googleのサジェストキーワードを出力してくれるツール」などをかなり利用していたので半信半疑でしたが、納得がいきました。 具体的な明文まで見つけていただいてありがとうございます。
guest

0

Web上で公開するものをスクレイピングすることが違反になるとは思えませんが・・・
ましてや途中でエラーになるなんてことはないです、どうやって普通のブラウザによるアクセスとbotによるアクセスを区別するのでしょうか?user-Agentは簡単に偽装できます。

公開されているサイトをスクレイピング自体が問題になることはまずありません、
robot.txtの記述に従う、サーバーに高負荷をかけないように一定間隔を空けるようにするなどを守れば大丈夫でしょう

細かいことを恐れていたらどんなことにも挑戦できなくなります。
本題と外れてしまいましたが

Ruby

1encoded_page.xpath("//h3")

ここを工夫すればいけますよ。
xpathは複雑なことができますので、nokogiriの解説サイトはたくさんあるのでそちらで勉強するといいでしょう

参考サイト

投稿2017/09/13 22:45

mtdsnsk

総合スコア789

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

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

maisumakun

2017/09/13 22:48

人間が検索していても、あまりに大量に検索していると「私はロボットではありません」のチェックを求められた、という事例もあるとのことです。
mtdsnsk

2017/09/13 23:07

同じIPから大量にアクセスがあれば遮断したりは当然でしょう。 それはGoogleに限らずどんなサイトでも同じですよ。
maisumakun

2017/09/13 23:18

たしかにGoogleの場合は自明ではないのですが、Instagramなど明文でスクレイピングを禁止している利用規約を持つサイトも、ちょくちょく見かけます。 「Web上で公開するものをスクレイピングすることが違反になるとは思えません」と言うのは、甘い認識です。
退会済みユーザー

退会済みユーザー

2017/09/13 23:33

> 「Web上で公開するものをスクレイピングすることが違反になるとは思えません」と言うのは、甘い認識です。 甘いというか、間違った認識ですね。 > 細かいことを恐れていたらどんなことにも挑戦できなくなります。 利用規約はサイト利用の根幹なので、細かいことではありません。 契約として扱われるので、最大限の注意が必要です。
mtdsnsk

2017/09/13 23:34

禁止するのは勝手ですが、スクレイピングと人間によるアクセスの区別なんかできませんよ。 人間がブラウザでページを開いて画像をクリップすることも禁止されているのですか? もし違反で逮捕されたとして、スクレイピングじゃなくて全部手動で画像を取ってきて保存したと強弁したらどうなるのか大変興味があります。
mtdsnsk

2017/09/13 23:35

じゃあGoogleは犯罪集団ですね。異論はないです。 Googleは利用規約をいちいち読んでるんですね?失笑
mtdsnsk

2017/09/13 23:44

すいません、勉強不足でした。
abcdtaichi

2017/09/14 06:44

mtdsnsk様 ご回答ありがとうございます。 >robot.txtの記述に従う、サーバーに高負荷をかけないように一定間隔を空けるようにするなどを守れば大丈夫でしょう はい。この辺りはしっかりと配慮しようと思います。 >xpathは複雑なことができますので、nokogiriの解説サイトはたくさんあるのでそちらで勉強するといいでしょう xpathやnokogiriの情報ありがとうございます。 もっと調べてみようと思います。 ちなみにアドバイスをいただいたコードは工夫をすると、2つとも解決できますかね?
退会済みユーザー

退会済みユーザー

2017/09/14 09:03

https://teratail.com/questions/44635 こちらの質問みたいに、1000回も閲覧されて注意が1つもつかない場合があるので 気にしなくて大丈夫ですよ。 この場合はサイトの利用規約の第17条(その他の禁止事項)の(12) (12)他者の設備またはサービス用設備(当社がサービスを提供するために用意する通信設備、電子計算機、その他の機器およびソフトウェアをいい、以下同様とします。)に無権限でアクセスし、またはその利用もしくは運営に支障を与える行為(与えるおそれのある行為を含む)。 にクローラがあたる可能性がありますが誰も注意をしていません。 複雑なことがしたい場合はapiを使うことになるかも。 Google Custom Search API を使ってみる(http://qiita.com/megu_ma/items/8cad39f61e35588e5476) まぁteratailでクローラのことは質問しないほうが良いでしょう。 capybara、selenium、Watir、mechanize + rubyで検索したら 参考になるサイトがある程度見つかるかも。
abcdtaichi

2017/09/14 09:24

アドバイスありがとうございます! 確かにグレーな感じなので、納得です。 GoogleのAPIは気になっていたので、試してみようと思います。 >まぁteratailでクローラのことは質問しないほうが良いでしょう。 これは間違いないですね。 クローラーを使いたくてプログラミングを始めましたが、いきなり地雷を踏んだ感じがします(笑) capybara、selenium、Watirは初耳だったので、調べて勉強してみます。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問