L'application Ruby on Rails pour récupérer le lien téléchargé à partir du fichier CSV et
trouver l'occurrence d'un lien dans une page particulière.
Dans l'application, l'utilisateur doit transmettre un fichier CSV et une liste de courrier électronique des utilisateurs auxquels le CSV analysé sera envoyé.
Dans le csv, il y aura trois 2 colonnes :
- lien_de référence
- lien_accueil
- et il y a des valeurs comme ci-dessous
Tout d’abord nous allons créer l’application rails
$ lance le nouveau scrape_data
$ cd scrape_data
Ensuite, nous générerons le module UploadCsv, exécuterons la commande ci-dessous
$ rails g échafaudage UploadCsv généré_csv : chaîne csv_file : chaîne
Cela créera tous les modèles, contrôleurs et migrations requis pour csv_file
Ensuite, nous commencerons par télécharger le fichier dans DB
remplacez le code ci-dessous dans les fichiers app/views/upload_csvs/_form.html.erb
nous avons ajouté le code ci-dessous pour télécharger le fichier en vue
<%= form_with(modèle : upload_csv, local : true) do |form| %>
<% si upload_csv.errors.any ? %>
<div id="”error_explanation”">
<h2><%= pluralize(upload_csv.errors.count, “error”) %> interdit l'enregistrement de ce upload_csv :</h2>
- <%=message %>
<% upload_csv.errors.full_messages.each fait |message| %>
<% fin %>
</div>
<% fin %>
<div class="”field”">
<%=form.label :csv_file %>
<%=form.file_field :csv_file %>
</div>
<div class="”actions”">
<%=form.submit %>
</div>
<% fin %>
Ensuite, nous ajouterons la gemme pour télécharger un fichier_csv
ajoutez la ligne ci-dessous dans le fichier gem
gemme 'carrierwave', '~> 2.0'
Installation du bundle $
Ensuite, nous créerons le téléchargeur dans Carrierwave
Les rails $ génèrent un avatar de téléchargeur
nous joindrons le téléchargeur dans le modèle
app/models/upload_csv.rb
classe UploadCsv <ApplicationRecord
mount_uploader :csv_file, AvatarUploader
fin
avant d'aller plus loin, vérifiez simplement que votre application fonctionne
exécuter les commandes ci-dessous
$ rake db: créer une base de données: migrer
mettre à jour les itinéraires
Rails.application.routes.draw faire
ressources :upload_csvs
racine 'upload_csvs#index'
fin
Rails $
Ensuite, nous créerons un Job pour lire le fichier CSV et en extraire le lien
et le fichier généré sera enregistré dans la colonne générée_csv de ces enregistrements
pour générer le travail, nous ferons comme ci-dessous
Les rails $ génèrent du travail générer_csv
ajoutez la gemme ci-dessous et exécutez l'installation du bundle
joyau 'httpparty'
gemme 'nokogiri'
alors nous remplacerons le code par ci-dessous
classe GenrateCsvJob < ApplicationJob
queue_as : par défaut
def effectuer (upload_csv)
traité_csv (upload_csv)
file = Tempfile.open([“#{Rails.root}/public/generated_csv”, '.csv']) do |csv|
csv << %w[referal_link home_link count]
@new_array.each fait |new_array|
csv << nouveau_array
fin
fichier = « #{Rails.root}/public/product_data.csv »
en-têtes = ['referal_link', 'home_link', 'count']
file = CSV.open(file, 'w', write_headers : true, headers : headers) do |writer|
@new_array.each fait |new_array|
écrivain << new_array
fin
upload_csv.update(generated_csv : fichier)
fin
fin
NotificationMailer.send_csv(upload_csv).deliver_now ! si @new_array.present ?
#besoin de générer le mailer et de suivre les étapes du mailer
fin
Méthode # pour obtenir le nombre de liens et les magasins dans le tableau
def traité_csv (upload_csv)
@new_array = []
CSV.foreach(upload_csv.csv_file.path, headers : true, header_converters : :symbol) do |row|
row_map = rangée.to_h
page = HTTParty.get(row_map[:refferal_link])
page_parse = Nokogiri :: HTML (page)
link_array = page_parse.css('a').map { |lien| lien['href'] }
link_array_group = link_array.group_by(&:lui-même).map { |k, v| [k, longueur v.] }.to_h
@new_array.push([row_map[:refferal_link], row_map[:home_link], (link_array_group[row_map[:home_link]]).to_s])
fin
fin
fin
Ensuite, nous joindrons le travail after_create de upload_csvs et nous ajouterons la validation pour csv_file require
veuillez mettre à jour le code de app/models/upload_csv.rb
classe UploadCsv <ApplicationRecord
mount_uploader :csv_file, AvatarUploader
after_create :processed_csv
def traité_csv
GenrateCsvJob.perform_later(self)
fin
fin
puis vérifiez après avoir téléchargé le fichier, votre fichier généré par scrape sera mis à jour, vous pouvez vérifier le csv généré
à l'intérieur /scrape_data/public/product_data.csv
nous pouvons envoyer par e-mail en utilisant les instructions ci-dessous
Nous allons d’abord générer le mailer
Les rails $ génèrent le mailer NotificationMailer
mettre à jour le code de app/mailers/notification_mailer.rb
def send_csv(upload_csv)
@greeting = 'Bonjour'
pièces jointes['parsed.csv'] = Fichier.read(upload_csv.generated_csv)
mail (à : « [email protected] », sujet : « CSV est analysé avec succès. »)
fin
fin
veuillez configurer également la configuration du courrier config/environments/development.rb ou production.rb
ajouter les lignes ci-dessous dans le fichier
config.action_mailer.default_url_options = { hôte : 'https://sample-scrape.herokuapp.com/' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
nom_utilisateur : '[email protected]',
mot de passe : '*******123456',
domaine : 'gmail.com',
adresse : 'smtp.gmail.com',
port : '587',
authentification : plain
}
config.action_mailer.raise_delivery_errors = faux
et mettez également à jour la vue app/views/notification_mailer/send_csv.html.erb
<h1>Le CSV a été traité, merci !</h1>
<p>
<%= @greeting %>, veuillez vérifier la pièce jointe pour recevoir l'e-mail
</p>
Merci !