CSV処理によるRailsでのデータスクレイピング

CSV ファイルからアップロードされたリンクをスクレイピングする Ruby on Rails アプリケーション

特定のページ内のリンクの出現を見つけます。

アプリケーションでは、ユーザーは CSV と、解析された CSV の送信先となるユーザーの電子メールのリストを渡す必要があります。

CSV には 2 列が 3 つあります。

  • 紹介リンク
  • ホーム_リンク
  • 以下のような値があります

まずはRailsアプリケーションを作成します

$ は新しい Scrape_data をレールにします

$ cd スクレイプデータ

次に、UploadCsv モジュールを生成し、以下のコマンドを実行します。

$ レール g scaffold UploadCsv generated_csv:string csv_file:string

これにより、csv_file に必要なすべてのモデル、コントローラー、移行が作成されます。

次に、まず DB にファイルをアップロードします。

ファイル内の以下のコードを置き換えます  app/views/upload_csvs/_form.html.erb

ビューにファイルをアップロードするために以下のコードを追加しました

<%= form_with(モデル: Upload_csv, ローカル: true) |form| を実行します。 %>

  <% if Upload_csv.errors.any? %>

    <div id="”error_explanation”">

      <h2><%= pluralize(upload_csv.errors.count, “error”) %> この Upload_csv の保存は禁止されています:</h2>

     

            <% Upload_csv.errors.full_messages.each do |message| %>

             

  • <%= メッセージ %>
  •         <%終了%>

         

    </div>

  <%終了%>

  <div class="”field”">

    <%= フォーム.ラベル :csv_file %>

    <%= フォーム.ファイルフィールド :csv_file %>

  </div>

  <div class="”actions”">

    <%= フォーム.送信 %>

  </div>

<%終了%>

次に、csv_file をアップロードするための gem を追加します。

gemファイルに以下の行を追加します

gem 'carrierwave'、'~> 2.0'

$ バンドルのインストール

次に、carrierwaveでアップローダーを作成します

$ レールはアップローダーのアバターを生成します

モデルにアップローダーを添付します

app/models/upload_csv.rb

クラス UploadCsv < ApplicationRecord

  mount_uploader :csv_file、AvatarUploader

終わり

次に進む前に、アプリケーションが動作していることを確認してください

以下のコマンドを実行します

$ レイク データベース: データベースの作成: 移行

ルートを更新する

Rails.application.routes.draw は実行します

  リソース:upload_csvs

  ルート「upload_csvs#index」

終わり

$ レール

次に、CSV ファイルを読み取り、そこからリンクを取得するジョブを作成します。

生成されたファイルはそのレコードの generated_csv 列に保存されます

ジョブを生成するには以下のようにします

$ レール生成ジョブ 生成する_csv

以下の gem を追加してバンドルインストールを実行します

宝石「httpparty」

宝石「鋸」

コードを以下に置き換えます

クラス GenrateCsvJob < ApplicationJob

  queue_as :デフォルト

  デフォルト実行(upload_csv)

    処理済み_csv(アップロード_csv)

    file = Tempfile.open([“#{Rails.root}/public/generated_csv”, '.csv']) do |csv|

      csv << %w[参照リンク ホームリンク数]

      @new_array.each は |new_array| を実行します

        csv << 新しい配列

      終わり

      ファイル = “#{Rails.root}/public/product_data.csv”

      ヘッダー = ['referal_link', 'home_link', 'count']

      file = CSV.open(file, 'w', write_headers: true, headers: headers) do |writer|

        @new_array.each は |new_array| を実行します

          ライター << new_array

        終わり

        Upload_csv.update(生成された csv: ファイル)

      終わり

    終わり

    NoticeMailer.send_csv(upload_csv).deliver_now! @new_array.present の場合?

    # メーラーを生成し、メーラーの手順に従う必要があります

  終わり

  # リンク数を取得して配列に格納するメソッド

  def 処理済み_csv(アップロード_csv)

    @new_array = []

    CSV.foreach(upload_csv.csv_file.path, headers: true, header_converters: :symbol) は |row| を実行します

      row_map = row.to_h

      ページ = HTTParty.get(row_map[:refferal_link])

      page_parse = ノコギリ::HTML(ページ)

      link_array = page_parse.css('a').map { |link|リンク['href'] }

      link_array_group = link_array.group_by(&:itself).map { |k, v| [k, v.length] }.to_h

      @new_array.push([row_map[:refferal_link], row_map[:home_link], (link_array_group[row_map[:home_link]]).to_s])

    終わり

  終わり

終わり

次に、upload_csvs の after_create ジョブをアタッチし、csv_file require の検証を追加します。

 のコードを更新してください  app/models/upload_csv.rb

クラス UploadCsv < ApplicationRecord

  mount_uploader :csv_file、AvatarUploader

  after_create :processed_csv

  デフォルトの処理済み_csv

    GenrateCsvJob.perform_later(self)

  終わり

終わり

ファイルをアップロードした後、スクレイピングで生成されたファイルが更新されることを確認してください。生成された CSV を確認できます。

内部  /scrape_data/public/product_data.csv

以下の手順を使用して電子メールで送信できます

まずメーラーを生成します

$ レールはメーラーを生成します。

のコードを更新する app/mailers/notification_mailer.rb

  def send_csv(upload_csv)

    @挨拶 = 'こんにちは'

    添付ファイル['parsed.csv'] = File.read(upload_csv.generated_csv)

    mail(宛先:「[email protected]」、件名:「CSVは正常に解析されました。」)

  終わり

終わり

メール設定も設定してください config/environments/development.rb またはproduction.rb

ファイル内の以下の行を追加します

config.action_mailer.default_url_options = { ホスト: 'https://sample-scrape.herokuapp.com/' }

config.action_mailer.delivery_method = :smtp

config.action_mailer.smtp_settings = {

  ユーザー名: '[email protected]',

  パスワード: '*******123456',

  ドメイン: 'gmail.com'、

  アドレス: 'smtp.gmail.com'、

  ポート: '587'、

  認証: :プレーン

}

config.action_mailer.raise_delivery_errors = false

そしてビューも更新します app/views/notification_mailer/send_csv.html.erb

<h1>CSV が処理されました。ありがとうございます。</h1>

<p>

  <%= @greeting %>、メールを受信するには添付ファイルを確認してください

</p>

ありがとう !

最新のアップデートを購読する

関連記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

jaJapanese