L'applicazione ruby on rails per raschiare il collegamento caricato dal file CSV e
trovare l'occorrenza del collegamento in una pagina particolare.
Nell'applicazione l'utente deve passare un CSV e un elenco di e-mail degli utenti a cui verrà inviato il CSV analizzato.
Nel csv ci saranno tre colonne da 2:
- referal_link
- home_link
- e ci sono valori come di seguito
Prima di tutto creeremo l'applicazione dei binari
$ lancia il nuovo scrape_data
$ cd scrap_data
Quindi genereremo il modulo UploadCsv, eseguiremo il comando seguente
$ binari g ponteggio UploadCsv generato_csv:string csv_file:string
Ciò creerà tutto il modello, il controller e le migrazioni richiesti per csv_file
Quindi inizieremo caricando prima il file nel DB
sostituire il codice seguente nei file app/views/upload_csvs/_form.html.erb
abbiamo aggiunto il codice seguente per caricare il file visualizzato
<%= form_with(model: upload_csv, local: true) esegui |form| %>
<% se upload_csv.errors.any? %>
<div id="”error_explanation”">
<h2><%= pluralize(upload_csv.errors.count, “error”) %> ha impedito il salvataggio di questo upload_csv:</h2>
- <%= messaggio %>
<% upload_csv.errors.full_messages.each fai |messaggio| %>
<% fine %>
</div>
<% fine %>
<div class="”field”">
<%= form.etichetta :csv_file %>
<%= form.file_field :csv_file %>
</div>
<div class="”actions”">
<%= form.invia %>
</div>
<% fine %>
Quindi aggiungeremo la gemma per caricare un file csv_
aggiungi la riga seguente nel file gem
gemma 'carrierwave', '~> 2.0'
Installazione del pacchetto $
Quindi creeremo l'uploader in carrierwave
I binari $ generano l'avatar dell'uploader
allegheremo l'uploader nel modello
app/models/upload_csv.rb
class UploadCsv < ApplicationRecord
mount_uploader:csv_file, AvatarUploader
FINE
prima di procedere oltre controlla che l'applicazione funzioni
esegui i comandi seguenti
$ rake db:crea db:migra
aggiornare i percorsi
Rails.application.routes.draw lo fa
risorse: upload_csvs
radice 'upload_csvs#index'
FINE
Guide $ s
Quindi creeremo un lavoro per leggere il file CSV e ricavare il collegamento da esso
e il file generato verrà salvato nella colonna generate_csv di tali record
per generare il lavoro faremo come di seguito
Le rotaie $ generano lavoro generare_csv
aggiungi la gemma seguente ed esegui l'installazione del bundle
gemma 'httparty'
gemma 'nokogiri'
quindi sostituiremo il codice con quello riportato di seguito
classe GenrateCsvJob < ApplicationJob
coda_as:predefinito
def esegui(upload_csv)
elaborato_csv(carica_csv)
file = Tempfile.open([“#{Rails.root}/public/generated_csv”, '.csv']) do |csv|
csv << %w[conteggio link home_link_referal]
@new_array.ognuno fa |new_array|
csv <<nuovo_array
FINE
file = "#{Rails.root}/public/product_data.csv"
intestazioni = ['link_referal', 'link_home', 'conta']
file = CSV.open(file, 'w', write_headers: true, headers: headers) do |writer|
@new_array.ognuno fa |new_array|
scrittore <<nuovo_array
FINE
upload_csv.update(generato_csv: file)
FINE
FINE
NotificationMailer.send_csv(upload_csv).deliver_now! se @new_array.present?
# È necessario generare il mailer e seguire i passaggi del mailer
FINE
# Metodo per ottenere il conteggio dei collegamenti e memorizzarli nell'array
def elaborato_csv(upload_csv)
@nuovo_array = []
CSV.foreach(upload_csv.csv_file.path, headers: true, header_converters: :symbol) do |row|
riga_mappa = riga.to_h
pagina = HTTParty.get(row_map[:refferal_link])
page_parse = Nokogiri::HTML(pagina)
link_array = page_parse.css('a').map { |link| collegamento['href'] }
link_array_group = link_array.group_by(&:itself).map { |k, v| [k, v.lunghezza] }.to_h
@new_array.push([row_map[:refferal_link], row_map[:home_link], (link_array_group[row_map[:home_link]]).to_s])
FINE
FINE
FINE
Quindi allegheremo il job after_create di upload_csvs e aggiungeremo la validazione per csv_file require
si prega di aggiornare il codice di app/models/upload_csv.rb
class UploadCsv < ApplicationRecord
mount_uploader:csv_file, AvatarUploader
after_create:processed_csv
def elaborato_csv
GenrateCsvJob.perform_later(self)
FINE
FINE
quindi controlla dopo aver caricato il file, il file generato dallo scraping verrà aggiornato, puoi controllare il CSV generato
dentro /scrape_data/public/product_data.csv
possiamo inviare tramite e-mail utilizzando le istruzioni seguenti
Per prima cosa genereremo il mailer
I binari $ generano il mailer NotificationMailer
aggiornare il codice di app/mailers/notification_mailer.rb
def invia_csv(carica_csv)
@saluto = 'Ciao'
allegati['parsed.csv'] = File.read(upload_csv.generated_csv)
mail(a: “[email protected]”, oggetto: 'CSV analizzato con successo.')
FINE
FINE
per favore configura anche la configurazione della posta config/environments/development.rb o production.rb
aggiungi le righe sottostanti nel file
config.action_mailer.default_url_options = { host: 'https://sample-scrape.herokuapp.com/' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
nome_utente: '[email protected]',
password: '*******123456',
dominio: "gmail.com",
indirizzo: "smtp.gmail.com",
porto: '587',
autenticazione: :plain
}
config.action_mailer.raise_delivery_errors = falso
e aggiorna anche la vista app/views/notification_mailer/send_csv.html.erb
<h1>Il CSV è stato elaborato, grazie!</h1>
<p>
<%= @greeting %>, controlla l'allegato per ricevere l'e-mail
</p>
Grazie !