🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Q&A

1回答

2267閲覧

Ruby selenium ブラウザ起動後、スクレイピングの最中に切断される

Komama

総合スコア28

Ruby

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

0グッド

0クリップ

投稿2019/12/17 08:38

■分からないこと
Rubyのseleniumを使ってスクレイピングをしたいのですがブラウザが起動して20件ほどスクレイピングをすると切断されてしまいます。
chromedriverとchromeのバージョンも合っていると思うのですが原因が分かりません。
ご教授いただけると助かります。

■エラー内容

Connection refused - connect(2) for "127.0.0.1" port 9515 (Errno::ECONNREFUSED) Failed to open TCP connection to 127.0.0.1:9515 (Connection refused - connect(2) for "127.0.0.1" port 9515) (Errno::ECONNREFUSED)

■chromedriver

$ which chromedriver /usr/local/bin/chromedriver $ chromedriver -v ChromeDriver 79.0.3945.36 (3582db32b33893869b8c1339e8f4d9ed1816f143-refs/branch-heads/3945@{#614})

■chromeバージョン
バージョン: 79.0.3945.79(Official Build) (64 ビット)

■コード

require 'csv' require 'kconv' require 'open-uri' require 'nokogiri' require 'selenium-webdriver' require 'byebug' def get_params(driver,wait) begin document = Nokogiri::HTML(driver.page_source) params = {} params['name'] = driver.find_element(xpath: '//*[@id="jsi-content-wrapper"]/div[3]/div[1]/div[2]/div[10]/div/dl[1]/dd/p').text if params['name'].include?('(株)') params['name'] = document.xpath("//h1").text.gsub('(株)','株式会社').gsub(/[[:space:]]/, '') elsif params['name'].include?('(有)') params['name'] = document.xpath("//h1").text.gsub('(有)','有限会社').gsub(/[[:space:]]/, '') end params['url'] = driver.find_element(xpath: '//*[@id="jsi-content-wrapper"]/div[3]/div[1]/div[2]/div[10]/div/dl[4]/dd/a').text if params['url'] == nil params['url'] = "-" end params['address'] = driver.find_element(xpath: '//*[@id="jsi-content-wrapper"]/div[3]/div[1]/div[2]/div[10]/div/dl[3]/dd/p').text if params['address'] == nil params['address'] = "-" end return params rescue => e @stdout.fatal(e) driver.close end end def main() headers = ['name','url','address'] @title = 'townwork' @time = Time.new.strftime("%Y_%m_%d") @filename = "#{@title}_new_#{@time}.csv" CSV.open(@filename, "w", write_headers: true) {|csv| csv << headers } @stdout.info("#{@title}_new_#{@time}.csv is created") options = Selenium::WebDriver::Chrome::Options.new options.add_argument('--headless') options.add_argument('--window-size=1440,990') driver = Selenium::WebDriver.for :chrome, options: options wait = Selenium::WebDriver::Wait.new(timeout: 10) driver.navigate.to "https://townwork.net/tokyo" search = driver.find_element(:xpath, '//*[@id="jsi-search-tab-wrapper"]/ul[1]/li[3]/a') search.location_once_scrolled_into_view search.click;sleep 2 occupation = driver.find_element(:xpath, '//*[@id="checkboxfield011"]') #レジャー occupation.click;sleep 2 occu_details_1 = driver.find_element(:xpath, '//*[@id="checkboxfield01110"]') #フロント・受付 occu_details_2 = driver.find_element(:xpath, '//*[@id="checkboxfield01107"]') #ホテルスタッフ occu_details_3 = driver.find_element(:xpath, '//*[@id="checkboxfield01119"]') #ベッドメイキング occu_details_4 = driver.find_element(:xpath, '//*[@id="checkboxfield01109"]') #その他宿泊施設業務 occu_details_1.click;sleep 1 occu_details_2.click;sleep 1 occu_details_3.click;sleep 1 occu_details_4.click;sleep 1 driver.find_element(:xpath, '//*[@id="jbTypeLmtForm"]/div[2]/div/div/ul[1]/li[1]/div/input').click; sleep 2 cnt = 0 100.times do |idx| links = driver.find_elements(xpath: '//*[@id="jsi-content-wrapper"]/div[1]/div[2]/div/div/a/div/div/div[2]/p') links.each do |link| begin # link.location_once_scrolled_into_view # wait.until { link.displayed? } driver.action.key_down(:command).click(link).perform window = driver.window_handles.last driver.switch_to.window(window) wait.until {driver.find_element(xpath: '//*[@id="jsi-content-wrapper"]/div[3]/div[1]/div[2]/div[10]/div/dl[3]/dd/p').displayed?} wait.until {driver.find_element(xpath: '//*[@id="jsi-content-wrapper"]/div[3]/div[1]/div[2]/div[10]/div/dl[4]/dd/a').displayed?} params = get_params(driver,wait) if params.nil? @stdout.fatal("params is nil") next end rescue => e @stdout.fatal(e) #元のページに戻る driver.close driver.switch_to.window(driver.window_handles.first) next end driver.close driver.switch_to.window(driver.window_handles.first) @stdout.info("working on #{params['name']} count #{cnt}") cnt = cnt + 1 CSV.open(@filename, "a", write_headers: true) do |csv| csv << [params['name'],params['url'],params['address']] end end if driver.find_elements(xpath: '//*[@id="jsi-content-wrapper"]/div[1]/div[2]/div[39]/div/div[3]/div/a').size > 0 driver.find_element(xpath: '//*[@id="jsi-content-wrapper"]/div[1]/div[2]/div[39]/div/div[3]/div/a').location_once_scrolled_into_view driver.find_element(xpath: '//*[@id="jsi-content-wrapper"]/div[1]/div[2]/div[39]/div/div[3]/div/a').click else driver.quit end end end if __FILE__ == $0 @stdout = Logger.new(STDOUT) @stdout.info('process started') main() @stdout.info('process finished') end

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

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

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

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

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

guest

回答1

0

ブラウザーなどのタイムアウトなのか、
スクレーピングのプログラムの問題なのか
先方が機械的なデータの抜き取りを嫌っているのか

を切り分ける必要があります。

ブラウザー経由ではなく、独立したスクレーピングとして切り出せませんか?

投稿2019/12/17 13:16

winterboum

総合スコア23567

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

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

Komama

2019/12/17 13:19

ご確認いただきありがとうございます! >独立したスクレーピング これはどうやればいいのでしょうか?
winterboum

2019/12/17 21:44

ブラウザーからのリクエストで起動するルーチンを抜き出して、 必要なgemが取り込めるような前処理をつけて rubyで実行 ということになります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問