エックスサーバー上にある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アプリをデプロイ

エックスサーバーの準備

  1. Ruby環境を有効化
    エックスサーバーではRubyが標準で利用可能です。

    • サーバーパネルから「Ruby設定」に進み、Rubyのバージョンを確認します。
    • Railsが未インストールなら、サーバーにSSH接続してインストールします。
  2. SSH接続 エックスサーバーのサーバーパネルからSSHの有効化を行い、ターミナルからSSH接続します。
    bash
    ssh ユーザー名@サーバー名
    
  3. Railsアプリのセットアップ Railsアプリをエックスサーバー上に作成、またはアップロードします。新規アプリの作成:
    bash
    rails new scraping_api --api
    cd scraping_api
    
  4. Gemのインストール エックスサーバー上でBundlerを使い、必要なライブラリをインストールします。
    bash
    bundle install --path vendor/bundle
    

3. 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

4. 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

5. デプロイと確認

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" }
      ]
    }

6. 注意点

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をコピーしました