CoderCastrov logo
CoderCastrov
Парсинг данных

Необходимо сгенерировать мейлер и выполнить шаги по отправке мейла

Необходимо сгенерировать мейлер и выполнить шаги по отправке мейла
просмотров
3 мин чтение
#Парсинг данных

Парсинг данных в Rails путем обработки CSV

Приложение Ruby on Rails для парсинга ссылок, загруженных из файла CSV, и поиска их в определенной странице.

В приложении пользователь должен передать CSV-файл и список электронных адресов пользователей, которым будет отправлен разобранный CSV.

В CSV-файле будет три столбца:

  • refferal_link

  • home_link

  • и их значения, как показано ниже

Сначала мы создадим приложение Rails

$ rails new scrape_data

$ cd scrape_data

Затем мы сгенерируем модуль UploadCsv, выполните следующую команду

$ rails g scaffold UploadCsv generated_csv:string csv_file:string

Это создаст все необходимые модели, контроллеры и миграции для csv_file.

Затем мы начнем с загрузки файла в базу данных

замените следующий код в файлах _app/views/upload_csvs/form.html.erb

мы добавили следующий код для загрузки файла в представлении

<%= form_with(model: upload_csv, local: true) do |form| %>

<% if upload_csv.errors.any? %>

<div id=”error_explanation”>

<h2>``<%= pluralize(upload_csv.errors.count, “error”) %> запрещено сохранение этого upload_csv:</h2>

<ul>

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

<li>``<%= message %>``</li>

<% end %>

</ul>

</div>

<% end %>

<div class=”field”>

<%= form.label :csv_file %>

<%= form.file_field :csv_file %>

</div>

<div class=”actions”>

<%= form.submit %>

</div>

<% end %>

Затем мы добавим гем для загрузки csv-файла

добавьте следующую строку в файл gem

gem ‘carrierwave’, ‘~> 2.0’

bundle install

Затем мы создадим загрузчик в CarrierWave

rails generate uploader Avatar

мы прикрепим загрузчик к модели

app/models/upload_csv.rb

class UploadCsv `< ApplicationRecord

mount_uploader :csv_file, AvatarUploader

end

прежде чем продолжить, проверьте, работает ли ваше приложение

выполните следующие команды

rake db:create db:migrate

обновите маршруты

Rails.application.routes.draw do

resources :upload_csvs

root ‘upload_csvs#index’

end

rails s

Затем мы создадим задание для чтения CSV-файла и парсинга ссылок из него

и сгенерированный файл будет сохранен в столбце generated_csv этой записи

чтобы создать задание, выполните следующее

rails generate job _genrate__csv

добавьте следующий гем и выполните bundle install

gem ‘httparty’

gem ‘nokogiri’

затем замените код на следующий

class GenrateCsvJob < ApplicationJob

queue_as :default

def perform(upload_csv)

processed_csv(upload_csv)

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

csv << %w[referal_link home_link count]

@new_array.each do |new_array|

csv << new_array

end

file = “#{Rails.root}/public/product_data.csv”

headers = [‘referal_link’, ‘home_link’, ‘count’]

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

@new_array.each do |new_array|

writer << new_array

end

upload_csv.update(generated_csv: file)

end

end

NotificationMailer.send_csv(upload_csv).deliver_now! if @new_array.present?

end

# Метод для получения количества ссылок и сохранения их в массиве

def processed_csv(upload_csv)

@new_array = []

CSV.foreach(upload_csv.csv_file.path, headers: true, header_converters: :symbol) do |row|

row_map = row.to_h

page = HTTParty.get(row_map[:refferal_link])

page_parse = Nokogiri::HTML(page)

link_array = page_parse.css('a').map { |link| 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])

end

end

end

Затем мы прикрепим задание после создания upload_csv и добавим проверку на обязательное поле csv_file

пожалуйста, обновите код в app/models/upload_csv.rb

class UploadCsv < ApplicationRecord

mount_uploader :csv_file, AvatarUploader

after_create :processed_csv

def processed_csv

GenrateCsvJob.perform_later(self)

end

end

затем проверьте, после загрузки файла, ваш сгенерированный файл будет обновлен, вы можете проверить сгенерированный csv

внутри /scrape_data/public/product_data.csv

мы можем отправить по электронной почте, используя следующую инструкцию

Сначала мы сгенерируем мейлер

$ rails generate mailer NotificationMailer

обновите код в app/mailers/notification_mailer.rb

def send_csv(upload_csv)

@greeting = 'Привет'

attachments['parsed.csv'] = File.read(upload_csv.generated_csv)

mail(to: "sample@gmail.com", subject: 'CSV успешно обработан.')

end

end

пожалуйста, настройте отправку почты также в config/environments/development.rb or production.rb

добавьте следующие строки в файл

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

config.action_mailer.delivery_method = :smtp

config.action_mailer.smtp_settings = {

user_name: 'sample@gmail.com',

password: '*******123456',

domain: 'gmail.com',

address: 'smtp.gmail.com',

port: '587',

authentication: :plain

}

config.action_mailer.raise_delivery_errors = false

и обновите также представление в app/views/notification_mailer/send_csv.html.erb

<h1> CSV был обработан, спасибо! </h1>

<p>

<%= @greeting %>, Пожалуйста, проверьте вложение, чтобы получить письмо

</p>

Спасибо!!