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

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

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

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

Q&A

解決済

2回答

1477閲覧

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

abcdtaichi

総合スコア18

Ruby

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

1グッド

3クリップ

投稿2017/09/13 08:05

###前提・実現したいこと
はじめまして。
Rubyで「キーワードを検索したら、Googleの検索結果上位10サイトの記事タイトルと見出しをテキストで出力できる」というツールを作っています。

本やネットを参考に作っているのですが、色々と困っています汗
今質問したいのは

・実行をすると文字化けするものとそうでないものがある
・上位10サイト以外の画像・動画・ショッピング・地図といった部分を出力してしまう

他にも質問したいことは山ほどありますが、今はこの2つを解決したいです。
下記がコードになります。

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

require 'anemone' require 'URI' #キーワード入力からグーグルの検索URLまで puts "キーワードを入力してください" keyword = gets.chomp word = URI.encode("https://www.google.co.jp/search?q=#{keyword}") #巡回対象サイトのURLを指定・1階層下にいって探索 Anemone.crawl(word, :delay => 3,:depth_limit => 2) do |anemone| #すべてのページに対しての処理 anemone.on_every_page do |page| page.doc.xpath("a","//h2","//h3","//h4","//h5","//h6").each do |title| puts "----------------" puts title.text end end end

###お願い
プログラミングを独学で始めて5日目なので、かなり未熟です。
わからない部分は調べますが、できるだけわかりやすくご回答していただけると助かります。
それではよろしくお願いいたします。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

Ruby

1require 'capybara/poltergeist' 2require 'nokogiri' 3 4Capybara.register_driver :poltergeist do |app| 5 Capybara::Poltergeist::Driver.new(app, {:js_errors => false, :timeout => 5000 }) 6end 7 8session = Capybara::Session.new(:poltergeist) 9 10session.driver.headers = { 11 'User-Agent' => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2564.97 Safari/537.36" 12} 13 14url = "https://www.google.co.jp/search?q=#{URI.escape(ARGV[0])}" 15session.visit url 16 17doc = Nokogiri::HTML.parse(session.html) 18 19doc.xpath('//h3[@class="r"]/a[contains(@onmousedown, "return")]').each do |node| 20 puts node.text 21end 22 23=begin 24 「ruby test.rb あいう」で実行 25 結果 26 あいうべ体操で口呼吸を鼻呼吸に改善 | 福岡のみらいクリニック 27 福岡のみらいクリニック | あいうべ体操とゆびのば体操で病気にならない体 ... 28 口呼吸を改善する「あいうべ体操」 口腔ケアチャンネル 165 - YouTube 29 あいうべ体操のブログ|インフルエンザ、口臭予防、歯並び改善、小顔 ... 30 資格でできること - 資格コースのご案内|あいうべ協会 31 口呼吸:「あいうべ体操」で舌筋を鍛えて舌と顔のたるみをとろう!:顔の ... 32 1週間で実感!たった5秒で免疫力を上げるお口の体操「あいうべ体操」の ... 33 インフルエンザ激減!【あいうべ体操】のスゴイ効果! - NAVER まとめ 34 あいうべ体操 ~ 口呼吸をやめて健康になろう! ~|山口県下関市の ... 35 あいうべ体操のやり方 36=end

参考
Rubyでスクレイピング

投稿2017/09/13 10:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

abcdtaichi

2017/09/13 10:30

ご回答ありがとうございます。 ソースコードとリンク先のサイトは参考にさせていただきます。 またアドバイス通りに修正したら、上手くいきました! 本当にありがとうございます!
guest

0

ベストアンサー

原因は、anemoneというgemがUTF-8という文字コード以外を全く考慮していないからです。
anemoneが内部で使用しているNokogiriはUTF以外からのエンコーディングにも対応しているので以下のように書き換えてあげてみてください。

ruby

1anemone.on_every_page do |page| 2 encoded_page = Nokogiri::HTML.parse(page.body.encode("utf-8","shift_jis")) 3 encoded_page.xpath("a","//h2","//h3","//h4","//h5","//h6").each do |title| 4 puts "----------------" 5 puts title.text 6 end 7 ... 8end

ちなみに、Google検索結果へのクローリングですが、基本的にGoogleからは非推奨とされています。
なので何回も同じWifiなどから行っているとクローリングできないようになりますのでご注意ください。

担当媒体の検索順位を自動的に取得できるツールなどは、SEOの会社などが自作していたり、購入できたりするのですが、あれもどのIPから検索しているのかを、偽装するようにして実現できているという感じです。

仮に質問者様がどうしても検索順位の10位を取得する機能を作りたい場合は、以下のような感じになるかと思います!

  1. プロキシサーバ(踏み台にするサーバ)を介して上記のrubyを実行
  2. 仮にGoogleから弾かれたら他のIPを設定する(このIPはネットでプロキシサーバ フリーなどで調べれば出てくるのでそのサイトを再度スクレイピングしてIPを見つけるみたいな感じです)
  3. 再度実行. 1に戻る

ちなみにanemoneがプロキシサーバのIPをセットできるかはわかりません。
rubyで同じようなことが出来るMechanizeというgemは可能でした。

頑張ってください!

投稿2017/09/13 09:20

MasakazuFukami

総合スコア1869

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

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

abcdtaichi

2017/09/13 10:08

Masakakazu Fukami様 ご回答ありがとうございます。 書き換えをしたら、文字化けせずに取得できました。 ただ上位10サイトの記事タイトルを出力してからがエラーになってしまいます。 -------------------------------------------------- キーワードを入力してください マリオ ---------------- Search Options ---------------- マリオ のニュース検索結果 ---------------- マリオポータル | Nintendo ---------------- New スーパーマリオブラザーズ 2 - 任天堂 ---------------- マリオ (ゲームキャラクター) - Wikipedia ---------------- マリオ&ルイージRPG1 DX トレーラー [E3 2017] - YouTube ---------------- スーパーマリオ オデッセイ 2nd トレーラー [E3 2017] - YouTube ---------------- 開発者が紹介する スーパーマリオ オデッセイ [E3 2017] - YouTube ---------------- スーパーマリオ ラン | 任天堂 ---------------- スーパーマリオ オデッセイ (@mario_odysseyJP) | Twitter ---------------- マリオ の画像検索結果 test2.rb:14:in `encode': "\x80" on Shift_JIS (Encoding::InvalidByteSequenceError) from test2.rb:14:in `block (2 levels) in <main>' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/anemone-0.7.2/lib/anemone/core.rb:229:in `block in do_page_blocks' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/anemone-0.7.2/lib/anemone/core.rb:228:in `each' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/anemone-0.7.2/lib/anemone/core.rb:228:in `do_page_blocks' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/anemone-0.7.2/lib/anemone/core.rb:167:in `block in run' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/anemone-0.7.2/lib/anemone/core.rb:163:in `loop' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/anemone-0.7.2/lib/anemone/core.rb:163:in `run' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/anemone-0.7.2/lib/anemone/core.rb:92:in `block in crawl' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/anemone-0.7.2/lib/anemone/core.rb:83:in `initialize' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/anemone-0.7.2/lib/anemone/core.rb:90:in `new' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/anemone-0.7.2/lib/anemone/core.rb:90:in `crawl' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/anemone-0.7.2/lib/anemone/core.rb:18:in `crawl' from test2.rb:10:in `<main>' ---------------------------------------------------- 「Encoding::InvalidByteSequenceError」について調べてみると、色々な種類があるようでどういうエラーかすらよくわかりません。 このエラーはどう修正すればよろしいでしょうか? プロキシサーバーの件は承知いたしました。 Googleは非推奨なんですね・・・汗 サーバーを通してやってみます! 詳しく説明していただき、ありがとうございます。!
退会済みユーザー

退会済みユーザー

2017/09/13 10:19

もしかしたら require 'kconv' ~省略~ Nokogiri::HTML.parse(page.body.toutf8) とかでいけるかもしれないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問