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>
ありがとう !