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

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

1172閲覧

検索結果を10件取得したい。

yuzujoe

総合スコア49

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2019/05/15 16:16

編集2019/05/18 14:43

わからないこと

現在Rubyのクローラー作成において検索結果を10件取得するのを当面の目標にしていましてその方法が知りたく質問させて頂きました
まずはコードを載せます

class Search def scraping(keyword) submit_keyword(keyword) # ここで30件取得させたい @agent.page.search('div.g').map do |node| title = node.search('a') next if title.empty? query = URI.decode_www_form(URI(title.attr("href")).query) url = query[0][1] snipped = node.search('div.s > span.st') next if snipped.empty? || snipped.children.empty? { url: url, title: expect_tag(title.children.to_html), } end.reject do |list| list.nil? end end private def submit_keyword(keyword) @agent = Mechanize.new @agent.user_agent_alias = USER_AGENT @agent.get('https://www.google.co.jp/') @agent.page.form_with(name: 'f') do |form| form.q = keyword end.submit end def expect_tag(string) string.gsub(/(<b>|</b>|<br>|</br>|\R)/, '') end end CSV.open('math.csv', 'w') do |rank| rank << ["Keyword","Rank","Title","URL"] end File.open('keyword.txt') do |file| file.each_line do |line| keyword = line result = GoogleSearch.new.scraping(keyword) result.each_with_index do |value, i| puts "----------------------------------------------------------------------------------------------------" puts "Keyword : #{keyword}" puts "Rank : #{i+1}" puts "URL : #{value[:url]}" puts "Title : #{value[:title]}" puts "----------------------------------------------------------------------------------------------------" CSV.open('math.csv', 'a') do |rank| rank << ["#{keyword}","#{i+1}","#{value[:title]}","#{value[:url]}"] end end end end

このコードで検索結果も取得まではできているのですが10件をちゃんと撮れないキーワードの時もありましておそらくURLで次のページにとばいいのでしょうがその方法がうまくわかっていないです。

参考試したもの

https://tanuhack.com/python/google-scraping/

この記事を見てコードを書いてみましたがうまくできず他に何か参考になるようなサイトや方法ご存知でしたらご教授いただけないでしょうか?

追記

https://teratail.com/questions/187572
こちらの質問投稿で30件取得ができるようにはなったのですが取得された結果がgoogleのブラウザでの正確な結果とは違ったものが出てきている為に別の方法で取得できないかと思案しております

具体的には検索のキーワードによって1ページ目で取得できる件数が違ったりするので次のURLに対してアクセスしてきっちり10件取得できるようにしたいと思っております。
例(Rubyの際は10件取得できているがルイヴィトンの際は6件しか取得できてないなど)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/05/15 21:34 編集

前に解決したのでは? https://teratail.com/questions/187572 「10件をちゃんと撮れないキーワード」について具体的な例があったほうが調査しやすいと思います。 (私の環境ではブラウザで「青空文庫」と検索した場合、1ページに目に7件しか表示されていないので正しい挙動な気もします)
yuzujoe

2019/05/18 14:52

ありがとうございます。 追記内容に掲載させて頂きました。 不足点などありましたらご指摘よろしくお願い致します
guest

回答1

0

ベストアンサー

  1. 表示件数分だけ表示する

表示件数(今回の場合は10件)以上になるまでURLを取得して、表示件数分だけ表示するという方法で実現可能です。

  1. 「ブラウザでの正確な結果」を返却できるようにする

ブラウザを自動操作して検索結果のhtmlをパースすることで「ブラウザでの正確な結果」を返せるようにできます。

ruby

1require 'watir' 2require 'nokogiri' 3require 'cgi' 4 5browser = Watir::Browser.new :chrome, switches: ['--headless --disable-gpu --incognito'] 6 7TGT_LIMIT = 10 # 表示する件数の制御をしている箇所 8urls = [] 9pg_cnt = 0 10url_base = 'https://www.google.com/search?q=' 11srch_word = CGI.escape('ルイヴィトン') 12 13catch :while_brk do 14 while urls.size < TGT_LIMIT do 15 pg_url = url_base + srch_word 16 unless pg_cnt.zero? 17 pg_url += "&ei=123&start=#{pg_cnt * 10}" 18 end 19 pg_cnt += 1 20 21 browser.goto(pg_url) 22 html = browser.execute_script('return document.documentElement.innerHTML') 23 doc = Nokogiri::HTML.parse(html) 24 25 catch :loop_brk do 26 loop do 27 doc.xpath('//*[@id="topstuff"]/div/div/p[1]/em').each do |txt| 28 throw :loop_brk 29 end 30 doc.xpath('//*[@id="rso"]/div').each do |tgt| 31 throw :loop_brk 32 end 33 34 sleep(3) 35 36 html = browser.execute_script('return document.documentElement.innerHTML') 37 doc = Nokogiri::HTML.parse(html) 38 end 39 end 40 41 doc.xpath('//*[@id="topstuff"]/div/div/p[1]').each do |txt| 42 throw :while_brk if txt.xpath('text()').text.include?('に一致する情報は見つかりませんでした。') 43 end 44 45 doc.xpath('//*[@id="rso"]/div').each do |div_tag| 46 div_tag.xpath('div/div').each do |dd_tag| 47 dd_tag.xpath('div/div/div[1]').each do |tgt| 48 tgt_url = tgt.xpath('a/@href').text 49 tgt_title = tgt.xpath('a/h3/text()').text 50 next if tgt_title.strip == '' 51 urls << { title: tgt_title, url: tgt_url } 52 end 53 end 54 end 55 56 sleep(rand(3..5)) 57 end 58end 59 60browser.quit 61 62if urls.size.zero? 63 puts '検索結果は 0件 でした' 64else 65 urls.each_with_index do |url, i| 66 break if i >= TGT_LIMIT 67 puts "タイトル:#{url[:title]}" 68 puts "URL:#{url[:url]}" 69 puts 70 end 71end 72

投稿2019/05/19 12:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuzujoe

2019/05/23 01:25

詳細な返答頂きましてありがとうございます。 ブラウザについての知識が低いと自分でも感じたのでしっかり勉強して取り組みたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問