Die Ruby on Rails-Anwendung zum Scrapen des aus einer CSV-Datei hochgeladenen Links und
Finden Sie das Vorkommen eines Links auf einer bestimmten Seite.
In der Anwendung muss der Benutzer eine CSV-Datei und eine Liste der E-Mail-Adressen des Benutzers übergeben, an die die analysierte CSV-Datei gesendet werden soll.
In der CSV-Datei gibt es drei 2-Spalten:
- Empfehlungslink
- home_link
- und es gibt Werte wie unten
Zunächst erstellen wir die Rails-Anwendung
$ veröffentlicht neue scrape_data
$ cd scrape_data
Dann generieren wir das UploadCsv-Modul und führen den folgenden Befehl aus
$-Schienen g-Gerüst UploadCsv generic_csv:string csv_file:string
Dadurch werden alle erforderlichen Modelle, Controller und Migrationen für csv_file erstellt
Dann beginnen wir damit, die Datei zunächst in die Datenbank hochzuladen
Ersetzen Sie den folgenden Code in den Dateien app/views/upload_csvs/_form.html.erb
Wir haben den folgenden Code hinzugefügt, um die Datei in View hochzuladen
<%= form_with(model: upload_csv, local: true) do |form| %>
<% wenn upload_csv.errors.any? %>
<div id="”error_explanation”">
<h2><%= pluralize(upload_csv.errors.count, “error”) %> Das Speichern dieser upload_csv-Datei wurde verboten:</h2>
- <%= Nachricht %>
<% upload_csv.errors.full_messages.each do |message| %>
<% Ende %>
</div>
<% Ende %>
<div class="”field”">
<%= form.label :csv_file %>
<%= form.file_field :csv_file %>
</div>
<div class="”actions”">
<%= form.submit %>
</div>
<% Ende %>
Dann fügen wir den Edelstein zum Hochladen einer CSV-Datei hinzu
Fügen Sie die folgende Zeile in die Gem-Datei ein
gem 'carrierwave', '~> 2.0'
$-Bundle-Installation
Anschließend erstellen wir den Uploader in Carrierwave
$-Schienen generieren einen Uploader-Avatar
Wir werden den Uploader im Modell anhängen
app/models/upload_csv.rb
Klasse UploadCsv < ApplicationRecord
mount_uploader :csv_file, AvatarUploader
Ende
Bevor Sie fortfahren, überprüfen Sie einfach, ob Ihre Anwendung funktioniert
Führen Sie die folgenden Befehle aus
$ rake db:create db:migrate
Aktualisieren Sie die Routen
Rails.application.routes.draw tun
Ressourcen :upload_csvs
root 'upload_csvs#index'
Ende
$ Schienen s
Dann erstellen wir einen Job, um die CSV-Datei zu lesen und den Link daraus zu entfernen
Die generierte Datei wird in der Spalte „generated_csv“ dieser Datensätze gespeichert
Um den Job zu generieren, werden wir wie folgt vorgehen
$-Schienen erzeugen Arbeit generieren_csv
Fügen Sie den folgenden Edelstein hinzu und führen Sie die Bundle-Installation aus
gem 'httparty'
Edelstein „Nokogiri“
Dann ersetzen wir den Code durch den folgenden
Klasse GenrateCsvJob < ApplicationJob
queue_as :default
def perform(upload_csv)
verarbeitete_csv(upload_csv)
file = Tempfile.open([“#{Rails.root}/public/generated_csv”, '.csv']) do |csv|
csv << %w[referal_link home_link count]
@new_array.each macht |new_array|
csv << neues_Array
Ende
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 macht |new_array|
Autor << new_array
Ende
upload_csv.update(generated_csv: Datei)
Ende
Ende
NotificationMailer.send_csv(upload_csv).deliver_now! wenn @new_array.present?
#Sie müssen den Mailer erstellen und die Mailer-Schritte befolgen
Ende
# Methode zum Abrufen der Linkanzahl und der Speicherung im Array
def verarbeitet_csv(upload_csv)
@new_array = []
CSV.foreach(upload_csv.csv_file.path, headers: true, header_converters: :symbol) führt |row| aus
row_map = row.to_h
page = HTTParty.get(row_map[:refferal_link])
page_parse = Nokogiri::HTML(Seite)
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])
Ende
Ende
Ende
Dann hängen wir den Job after_create von upload_csvs an und fügen die Validierung für csv_file require hinzu
Bitte aktualisieren Sie den Code von app/models/upload_csv.rb
Klasse UploadCsv < ApplicationRecord
mount_uploader :csv_file, AvatarUploader
after_create :processed_csv
def verarbeitet_csv
GenrateCsvJob.perform_later(self)
Ende
Ende
Überprüfen Sie dann nach dem Hochladen der Datei, ob Ihre Scrape-generierte Datei aktualisiert wird. Sie können die generierte CSV-Datei überprüfen
innen /scrape_data/public/product_data.csv
Wir können per E-Mail senden, indem wir die folgenden Anweisungen verwenden
Zuerst erstellen wir den Mailer
$-Schienen generieren Mailer NotificationMailer
Aktualisieren Sie den Code von app/mailers/notification_mailer.rb
def send_csv(upload_csv)
@greeting = 'Hallo'
attachments['parsed.csv'] = File.read(upload_csv.generated_csv)
Mail (an: „[email protected]“, Betreff: „CSV wurde erfolgreich analysiert.“)
Ende
Ende
Bitte konfigurieren Sie auch die E-Mail-Konfiguration config/environments/development.rb oder Production.rb
Fügen Sie der Datei die folgenden Zeilen hinzu
config.action_mailer.default_url_options = { host: 'https://sample-scrape.herokuapp.com/' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
Benutzername: „[email protected]“,
Passwort: '*******123456',
Domäne: „gmail.com“,
Adresse: „smtp.gmail.com“,
Port: '587',
Authentifizierung: :plain
}
config.action_mailer.raise_delivery_errors = false
und aktualisieren Sie auch die Ansicht app/views/notification_mailer/send_csv.html.erb
<h1>CSV wurde verarbeitet, Danke!</h1>
<p>
<%= @greeting %>, Bitte überprüfen Sie den Anhang, um die E-Mail zu erhalten
</p>
Danke !