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

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

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

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

Q&A

解決済

1回答

1724閲覧

Ruby 複数ページからのスクレイピング

Komama

総合スコア28

Ruby

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

0グッド

0クリップ

投稿2019/01/05 03:41

■分からないこと

複数ページからのスクレイピングのやり方を教えていただきたいです。
下記の2つのコードで「list_1」がベースになり、会社名を紐づけて「list_2」のEmailを取得したいと思っています。
list_2のURLの"https://job.rikunabi.com/2019/company/r294900083/"の最後の「r + 9桁数字」もランダムな数字になっているので、そこをどう書いていいのかも分かりません。

よろしくお願い致します。

■list_1

ruby

1require 'open-uri' 2require 'nokogiri' 3require 'csv' 4require 'byebug' 5 6def get_data(uri, companies) 7 html = open(uri).read 8 documents = Nokogiri::HTML(html) 9 documents.xpath("//a[@class='ts-h-search-cassetteTitleMain js-h-search-cassetteTitleMain']").each {|n| companies << n.text.strip} 10 return companies 11end 12 13def main() 14 uri = "https://job.rikunabi.com/2019/s/__13_0_______/" 15 puts "What is the page? " 16 page = gets.to_i 17 18 companies = [] 19 data = get_data(uri,companies) 20 (2..page).to_a.each do |idx| 21 uri = "https://job.rikunabi.com/2019/s/__13_0_______/?moduleCd=2&isc=ps054&pn=#{idx}" 22 data = get_data(uri,companies) 23 end 24 25 len = [companies.size].min - 1 26 27 headers = ["会社名"] 28 time = Time.new.strftime("%Y-%m-%d") 29 CSV.open("rikunabi_tokyo_2019-#{time}.csv", "a",headers: headers, write_headers: true) do |csv| 30 (0..len).to_a.each do |idx| 31 csv_column_values = [companies[idx]] 32 csv << csv_column_values 33 end 34 end 35end 36 37if __FILE__ == $0 38 puts("Process Start") 39 main() 40 puts("Process Finished") 41end

■list_2

ruby

1require 'open-uri' 2require 'nokogiri' 3require 'csv' 4require 'byebug' 5require 'kconv' 6 7def get_data(uri, data) 8 companies = data[0] 9 parameters = data[1] 10 html = open(uri).read 11 documents = Nokogiri::HTML(html.toutf8, nil, 'utf-8') 12 companies << documents.xpath("//h1[@class='ts-h-company-mainTitle']").text 13 parameters << documents.xpath("//div[@class='ts-h-company-sentence']")[1].text.strip.gsub(/(\r)/, " ") 14 return [companies, parameters] 15end 16 17def main() 18 uri = "https://job.rikunabi.com/2019/company/r294900083/" 19 puts "What is the page? " 20 page = gets.to_i 21 22 companies = [] 23 parameters = [] 24 data = [companies, parameters] 25 data = get_data(uri,data) 26 (2..page).to_a.each do |idx| 27 uri = "https://job.rikunabi.com/2019/company/r294900083/" 28 data = get_data(uri,data) 29 end 30 31 len = [companies.size,parameters.size].min - 1 32 33 headers = ["会社名","Email"] 34 time = Time.new.strftime("%Y-%m-%d") 35 CSV.open("rikunabi_tokyo_2019-#{time}.csv", "a",headers: headers, write_headers: true) do |csv| 36 (0..len).to_a.each do |idx| 37 csv_column_values = [companies[idx], parameters[idx]] 38 csv << csv_column_values 39 end 40 end 41end 42 43if __FILE__ == $0 44 puts("Process Start") 45 main() 46 puts("Process Finished") 47end

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

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

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

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

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

guest

回答1

0

ベストアンサー

Ruby

1require 'open-uri' 2require 'nokogiri' 3 4main_url = 'https://job.rikunabi.com/2019/s/__13_0_______/' 5 61.upto(84) do |i| 7 doc = Nokogiri::HTML.parse(open("#{main_url}?moduleCd=100&isc=ps054&pn=#{i}")) 8 9 doc.xpath('//*[contains(@id,"cassette-r")]/div[1]/div/a').each do |a| 10 com_page = Nokogiri::HTML.parse(open("https://job.rikunabi.com#{a.xpath('@href').text}")) 11 puts a.text 12 puts com_page.xpath('//*[@id="company-data04"]/div').inner_html.gsub('<br>', "\n") 13 puts "\n" + '-' * 80 14 sleep(rand(3..5)) 15 end 16end 17 18

投稿2019/01/05 14:50

編集2019/01/05 14:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Komama

2019/01/06 01:16

ありがとうございます! 取得できました! コードも書き方も非常に勉強になります! しっかり理解して次に活かしたいと思います。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問