Scraping dei dati nelle rotaie mediante elaborazione CSV

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>

     

            <% upload_csv.errors.full_messages.each fai |messaggio| %>

             

  • <%= 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 !

Iscriviti per gli ultimi aggiornamenti

Articoli correlati

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

it_ITItalian