Dataskrapning i skenor genom att bearbeta CSV

The ruby on rails Ansökan om att skrapa länken uppladdad från CSV-fil och

hitta förekomsten av länk på en viss sida.

I applikationen måste användaren skicka en csv och en lista över användarnas e-post till vilka den analyserade CSV:en kommer att skickas.

I csv kommer det att finnas tre 2 kolumner:

  • refferal_link
  • home_link
  • och det finns värden som nedan

Först och främst kommer vi att skapa rails-applikationen

$ rails nya scrape_data

$ cd scrape_data

Sedan genererar vi UploadCsv-modulen, kör kommandot nedan

$ skenor g ställning UploadCsv generated_csv:string csv_file:string

Det kommer att skapa alla nödvändiga modeller, kontroller och migrationer för csv_file

Då börjar vi med att först ladda upp filen i DB

ersätt nedanstående kod i filer  app/views/upload_csvs/_form.html.erb

vi har lagt till koden nedan för att ladda upp filen

<%= form_with(modell: upload_csv, lokal: true) gör |form| %>

  <% om upload_csv.errors.any? %>

    <div id="”error_explanation”">

      <h2><%= pluralize(upload_csv.errors.count, “error”) %> förbjöd denna upload_csv från att sparas:</h2>

     

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

             

  • <%= meddelande %>
  •         <% slut %>

         

    </div>

  <% slut %>

  <div class="”field”">

    <%= form.label :csv_file %>

    <%= form.filfält :csv_fil %>

  </div>

  <div class="”actions”">

    <%= form.submit %>

  </div>

<% slut %>

Sedan lägger vi till pärlan för att ladda upp en csv_file

lägg till raden nedan i gem-filen

gem 'carrierwave', '~> 2.0'

$-paketinstallation

Sedan skapar vi uppladdningsprogrammet i carrierwave

$-skenor genererar uppladdningsavatar

vi kommer att bifoga uppladdaren i modellen

app/models/upload_csv.rb

klass UploadCsv < ApplicationRecord

  mount_uploader :csv_file, AvatarUploader

slutet

innan du går vidare, kontrollera bara att din applikation fungerar

kör under kommandon

$ rake db:create db:migrate

uppdatera rutterna

Rails.application.routes.draw gör

  resurser :upload_csvs

  root 'upload_csvs#index'

slutet

$ skenor s

Sedan skapar vi ett jobb för att läsa CSV-filen och skrapa länken från den

och den genererade filen kommer att sparas i kolumnen genered_csv i den posten

för att skapa jobbet kommer vi att göra som nedan

$-skenor genererar jobb generera_csv

lägg till pärlan nedan och kör paketinstallationen

pärla 'httparty'

pärla 'nokogiri'

då ersätter vi koden med nedan

klass GenrateCsvJob < ApplicationJob

  queue_as :default

  def perform(upload_csv)

    processed_csv(upload_csv)

    fil = Tempfile.open([“#{Rails.root}/public/generated_csv”, '.csv']) till |csv|

      csv << %w[referal_link home_link count]

      @new_array.each gör |new_array|

        csv << new_array

      slutet

      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 gör |new_array|

          författare << new_array

        slutet

        upload_csv.update(generated_csv: fil)

      slutet

    slutet

    NotificationMailer.send_csv(upload_csv).deliver_now! om @new_array.present?

    1TP5Måste generera försändelsen och följa stegen för försändelsen

  slutet

  # Metod för att få länkräkningen och lagrar i arrayen

  def processed_csv(upload_csv)

    @new_array = []

    CSV.foreach(upload_csv.csv_file.path, headers: true, header_converters: :symbol) gör |rad|

      rad_karta = rad.till_h

      page = HTTParty.get(row_map[:refferal_link])

      page_parse = Nokogiri::HTML(page)

      link_array = page_parse.css('a').map { |länk| länk['href'] }

      link_array_group = link_array.group_by(&:itself).map { |k, v| [k, v.längd] }.till_h

      @new_array.push([radkarta[:refferal_länk], radkarta[:hemlänk], (länkarraygrupp[radkarta[:hemlänk]]).to_s])

    slutet

  slutet

slutet

Sedan bifogar vi jobbet after_create av upload_csvs och vi lägger till valideringen för csv_file require

 vänligen uppdatera koden för  app/models/upload_csv.rb

klass UploadCsv < ApplicationRecord

  mount_uploader :csv_file, AvatarUploader

  after_create :processed_csv

  def processed_csv

    GenrateCsvJob.perform_later(self)

  slutet

slutet

kontrollera sedan efter uppladdning av filen din scrape-genererade fil kommer att uppdateras du kan kontrollera genererad csv

inuti  /scrape_data/public/product_data.csv

vi kan skicka via e-post genom att använda instruktionerna nedan

Först kommer vi att generera försändelsen

$-skenor genererar mailer NotificationMailer

uppdatera koden för app/mailers/notification_mailer.rb

  def send_csv(upload_csv)

    @greeting = 'Hej'

    attachments['parsed.csv'] = File.read(upload_csv.generated_csv)

    mail(till: "[email protected]", ämne: 'CSV har analyserats framgångsrikt.')

  slutet

slutet

vänligen konfigurera e-postkonfigurationen också config/environments/development.rb eller production.rb

lägg till nedanstående rader i filen

config.action_mailer.default_url_options = { värd: 'https://sample-scrape.herokuapp.com/' }

config.action_mailer.delivery_method = :smtp

config.action_mailer.smtp_settings = {

  användarnamn: '[email protected]',

  lösenord: '*******123456',

  domän: 'gmail.com',

  adress: 'smtp.gmail.com',

  port: '587',

  autentisering: :plain

}

config.action_mailer.raise_delivery_errors = falskt

och uppdatera vyn också app/views/notification_mailer/send_csv.html.erb

<h1>CSV har bearbetats, tack!</h1>

<p>

  <%= @hälsning %>, kontrollera bilagan för att få e-postmeddelandet

</p>

Tack !

Prenumerera för de senaste uppdateringarna

relaterade inlägg

Lämna en kommentar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

sv_SESwedish