エックスサーバー上にあるRuby 使いWEBスクレイピング

New Challenge

エックスサーバー上にあるRuby on RailsつかってAPI経由でWEBスクレイピングできる仕組みを考えます。

エックスサーバー上でRuby on Railsを使い、API経由でWebスクレイピングできる仕組みを構築する方法を解説します。


1. 全体の流れ

エックスサーバーにRailsアプリをデプロイし、Webスクレイピングを実行するAPIを提供する手順は以下の通りです:

  1. エックスサーバーにRailsアプリをセットアップ
  2. Webスクレイピング処理を追加(Nokogiri + HTTPリクエスト)
  3. APIエンドポイントを作成
  4. 公開URLを介してスクレイピングAPIを提供

2. エックスサーバーにRailsアプリをデプロイ

念の為にコメントします。本気で対象として考えているサーバーは、エックスサーバーVPSです。エックスサーバー・スタンダードではありません。ユーザーごとの仮想サーバー構築が可能なVPと、HP等の静的な情報を扱うスタンダードを区別しましょう。
国内シェアNo.1のエックスサーバーが提供するVPSサーバー『XServer VPS』

XServerドメイン

3.エックスサーバーVPSの準備

1. サーバーのセットアップ

エックスサーバーVPSは root 権限が付与されるため、必要な環境は自分で構築します。
OS(デフォルトは AlmaLinux)にログインし、アップデートを実行します。

sudo dnf update -y

2. Ruby環境の導入

VPSでは Ruby が標準インストールされていない場合があります。
Rbenv などのバージョン管理ツールを使い、必要な Ruby バージョンを導入します。

# rbenv のインストール例
sudo dnf install -y git gcc bzip2 bzip2-devel zlib-devel
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo ‘export PATH=”$HOME/.rbenv/bin:$PATH”‘ >> ~/.bashrc
echo ‘eval “$(rbenv init – bash)”‘ >> ~/.bashrc
source ~/.bashrc
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 3.2.2
rbenv global 3.2.2

3. Rails のインストール

Ruby が準備できたら、Rails と Bundler をインストールします。

gem install bundler rails

4. SSH接続

エックスサーバーVPSでは root 権限でSSHログインが可能です。
契約時に発行されるIPアドレスを使い、次のように接続します。

ssh root@xxx.xxx.xxx.xxx
⚠️ ポイント
共用サーバー版エックスサーバー
→ Ruby はパネルから有効化可能(ただしRails常駐不可)

エックスサーバーVPS
→ Ruby/Railsは最初から無いので自分でインストール

ssh ユーザー名@サーバー名
  1. Railsアプリのセットアップ Railsアプリをエックスサーバー上に作成、またはアップロードします。新規アプリの作成:
    bash
    rails new scraping_api --api
    cd scraping_api
    
  2. Gemのインストール エックスサーバー上でBundlerを使い、必要なライブラリをインストールします。
    bash
    bundle install --path vendor/bundle
    

4. Webスクレイピング処理の追加

スクレイピング用サービスクラス

app/services/scraper_service.rbを作成し、Webスクレイピング処理を追加します。

ruby
require 'httparty'
require 'nokogiri'

class ScraperService
  def self.scrape_example
    url = "https://example.com" # 取得対象のURL
    response = HTTParty.get(url) # HTTPリクエスト

    # HTML解析
    doc = Nokogiri::HTML(response.body)

    # データ抽出(例: タイトルとリンク)
    data = []
      doc.css('.article').each do |article|
      title = article.css('h2').text.strip
      link = article.css('a').attr('href').value
      data << { title: title, link: link }
    end
  
    data
  end
end

5. APIエンドポイントの作成

コントローラーの作成

api/v1名前空間でスクレイピング結果を返すAPIを作成します。

bash
rails generate controller api/v1/scraper index

app/controllers/api/v1/scraper_controller.rb

ruby
class Api::V1::ScraperController < ApplicationController
  def index
    scraped_data = ScraperService.scrape_example

    render json: { status: 'success', data: scraped_data }, status: :ok
  end
end

ルーティング設定

config/routes.rbにAPIエンドポイントを追加します。

ruby
Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      get 'scrape', to: 'scraper#index'
    end
  end
end

6. デプロイと確認

PassengerとRailsの設定

エックスサーバーではPhusion Passengerが使われているため、Railsアプリの起動設定を行います。

  1. publicディレクトリindex.htmlがある場合は削除。
    bash
    rm public/index.html
    
  2. public.htaccessファイルを作成
    Passengerを有効化する設定を記述します。.htaccess

    apache
    PassengerAppRoot /home/ユーザー名/対象ディレクトリ
    PassengerRuby /usr/bin/ruby
    • PassengerAppRoot: Railsアプリのルートパス
    • PassengerRuby: エックスサーバー上のRuby実行パス
  3. デプロイ後の確認 Railsアプリのエンドポイントにアクセスし、API動作を確認します。
    https://あなたのドメイン/api/v1/scrape

    レスポンス例:json

    {
      "status": "success",
      "data": [
      { "title": "Article 1", "link": "https://example.com/article1" },
      { "title": "Article 2", "link": "https://example.com/article2" }
      ]
    }

7. 注意点

1. スクレイピングのマナー

  • 対象サイトのrobots.txtを確認し、許可されているかを確認します。
  • サーバー負荷を考慮してリクエスト間隔を空けます(sleepの利用)。

2. セキュリティ対策

  • APIを外部に公開する場合、認証機能(例:APIキーやBasic認証)を追加しましょう。
  • rack-corsを設定し、CORSを管理します。

例: CORS設定 (config/initializers/cors.rb)

ruby!
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*' # 許可するドメインを指定
    resource '*', headers: :any, methods: [:get]
  end
end

3. 定期実行の設定

定期的にスクレイピングを行いたい場合は、cronジョブwhenever Gemを活用します。


まとめ

エックスサーバー上でRailsアプリをデプロイし、WebスクレイピングをAPIとして提供する方法を解説しました。RailsのAPI機能とNokogiriを使うことで、効率的にスクレイピングデータを外部に提供できます。

〆最後に〆

以上、間違い・ご意見は
次のアドレスまでお願いします。
最近は全て返信出来てませんが
適時、返信して改定をします。

nowkouji226@gmail.com

全体の纏め記事へ】

雑記の纏め記事に戻る

Pythonをテックジムで学ぼう

Python学習での諸情報

タイトルとURLをコピーしました