Daten-Scraping in Rails durch Verarbeitung von CSV

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>

     

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

             

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

Abonnieren Sie die neuesten Updates

zusammenhängende Posts

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

de_DEGerman