[Go To トラベル] じゃらんでクオカード付きプランを検索してみた

# dockerを使う

```yml:docker-compose.yml
version: "3.7"
services:
  chrome:
    image: selenium/standalone-chrome
    shm_size: 256m

  backend:
    build:
      context: ./backend
    working_dir: /app
    volumes:
      - ./backend:/app
    command: ash -c "tail -f README.md"
```

`rails c`できればいいだけなので、`docker-compose up`してもbackendが終了しないように`command`が`tail -f`

あとは`docker exec -it backend_1 ash`的なコマンドで中に入る。

# selenium/standalone-chromeをrails側から呼ぶ

```rb:models/concerns/chromeable.rb
require "selenium-webdriver"
require "capybara"

module Chromeable
  extend ActiveSupport::Concern

  DOCKER_CHROME_SELENIUM_HOST_NAME = "chrome"
  Capybara.register_driver :chrome do |app|
    args = %w[
      --headless
      --disable-gpu
      --window-size=1280,800
      --blink-settings=imagesEnabled=false
    ]

    caps =
      Selenium::WebDriver::Remote::Capabilities.chrome(
        "goog:chromeOptions" => {
          args: args,
          prefs: {
            credentials_enable_service: false,
            profile: { password_manager_enabled: false }
          }
        }
      )

    Capybara::Selenium::Driver.new(
      app,
      browser: :remote,
      desired_capabilities: caps,
      url: "http://#{DOCKER_CHROME_SELENIUM_HOST_NAME}:4444/wd/hub"
    )
  end

  included {}

  module ClassMethod; end

  def create_session
    session = Capybara::Session.new(:chrome)
    if block_given?
      begin
        yield session
      ensure
        session&.driver&.quit
      end
    else
      session
    end
  end
end
```

適当にこういうdocker-composeの`chrome`サービスを呼べるようなconcernを作って、じゃらんを検索し、表示されるプラン名に`/([\d,]+)円/`があるものをピックアップして、データベースに保存。
これを最後のページまでやっていく。

```rb:models/Jalan.rb
class Jalan < ApplicationRecord
  class Crawler
    include Chromeable

    def ensure_session
      @session = create_session
      session.visit "https://www.jalan.net/uw/uwp2011/uww2011init.do?keyword=%83N%83I%83J%81%5B%83h&distCd=06&rootCd=7701&screenId=FWPCTOP&image1.x=11&image1.y=13"
      session.select "1", from: "adultNum"
      session.click_on "再検索"

      yield
    ensure
      session&.driver&.quit
    end

    ...
  end 
end
```

# 結果

```rb
Jalan.group(:value).count
=> {3000=>201, 4000=>15, 5000=>37, 6000=>3, 7000=>2, 7700=>2, 8000=>1, 10000=>3, 30000=>2}
```

ノイズも入ってるけど ...


# 見つけたすごいプラン

<img src="https://stat.ameba.jp/user_images/20190919/00/takeshi-tomizawa/56/8a/j/o0480064014592390434.jpg" height="200">

- [特典 衝撃プライス！ビジネス出張応援 QUOカード30,000円付きプラン【素泊り】男女別大浴場][1]
- [特典 衝撃プライス！ビジネス出張応援 QUOカード30000円付きプラン【素泊り】男女別大浴場][2]
- [【じゃらん限定】★☆★出張の!!!鉄人!!!★☆★【JCBギフトカード10000円付】プラン♪《朝食付》][3]

3万円のクオカードが付く5万円のホテルは、ちょっと何言ってるかわからない。
JCBギフトカード1万円付きはクオカードに比べてだいぶ使い勝手が良さそう。


[1]: https://www.jalan.net/uw/uwp3200/uww3201init.do?yadNo=368500&planCd=02825037&roomTypeCd=0440653&showSpFooterFlg=0&ntaLinkFlg=1&anaLinkFlg=1&jalLinkFlg=1&kekakuStatus=0&taxType=1&keyword=%E3%82%AF%E3%82%AA%E3%82%AB%E3%83%BC%E3%83%89&sumPntRate=2&pointIconDisplayFlg=1&dayNum=1&loginChk=&hitOverFlg=1&stayYear=2020&stayMonth=07&stayDay=17&dateUndecided=1&adultNum=1&minPrice=0&maxPrice=999999&rootCd=7701&pageListNumPlanFw=990_5_28_1

[2]: https://www.jalan.net/uw/uwp3200/uww3201init.do?yadNo=382499&planCd=02672085&roomTypeCd=0362322&showSpFooterFlg=0&ntaLinkFlg=1&anaLinkFlg=1&jalLinkFlg=1&kekakuStatus=0&taxType=1&keyword=%E3%82%AF%E3%82%AA%E3%82%AB%E3%83%BC%E3%83%89&sumPntRate=2&pointIconDisplayFlg=1&dayNum=1&loginChk=&hitOverFlg=1&stayYear=2020&stayMonth=07&stayDay=17&dateUndecided=1&adultNum=1&minPrice=0&maxPrice=999999&rootCd=7701&pageListNumPlanFw=990_10_3_1

[3]:https://www.jalan.net/uw/uwp3200/uww3201init.do?yadNo=334269&planCd=02494922&roomTypeCd=0158498&showSpFooterFlg=0&ntaLinkFlg=1&anaLinkFlg=1&jalLinkFlg=1&kekakuStatus=0&taxType=1&keyword=%E3%82%AF%E3%82%AA%E3%82%AB%E3%83%BC%E3%83%89&sumPntRate=2&pointIconDisplayFlg=1&dayNum=1&loginChk=&hitOverFlg=1&stayYear=2020&stayMonth=07&stayDay=17&dateUndecided=1&adultNum=1&minPrice=0&maxPrice=999999&rootCd=7701&pageListNumPlanFw=990_19_25_1