[Ruby] 5 häufige Fehler, die beim Schaben mit Selen auftreten und wie man damit umgeht

Hier sind 5 häufige Fehler bei der Verwendung des Tools "Selen" </ b>, das für das Web-Scraping nützlich ist.

Einführung

Selen ist ein Juwel, das sich für das Scraping von Bahnen bei komplexen Vorgängen eignet.

Edelstein, der beim Web-Scraping mit Ruby </ b> verwendet werden kann

--Nokogiri (einfach) --Mechanisieren (einfach) --Selenium (Sie können verschiedene Dinge tun, indem Sie den Browser bedienen)

In Nokogiri und Mechanize werden HTML-Tags und CSS angegeben, um den Inhalt der Seite abzurufen. Mit Selenium können Sie einen Browser programmgesteuert öffnen und simulierte Vorgänge ausführen, um eine komplizierte Verarbeitung durchzuführen.

  • Wenn Sie sich anmelden müssen
  • Wenn Sie eine Seite mit JavaScript zeichnen
  • Wenn Sie Daten eingeben möchten

Dies ist nützlich, wenn Sie die erforderlichen Informationen nicht nur mit HTML-Tags oder CSS-Selektoren abrufen können.

Wie man Selen benutzt

Verschiedene Personen haben die Verwendung von Selen zusammengefasst. Schauen Sie also bitte dort nach.

[Ruby] Web-Scraping mit Chrome auf Selen

Selen-Spickzettel [Ruby]

#Installieren Sie die für die Verwendung von Selen erforderlichen Tools
require 'selenium-webdriver'

#Starten Sie Selen
driver = Selenium::WebDriver.for :chrome

5 häufige Fehler bei der Verwendung von Selen

1. Verschiedene Versionen der Tools, mit denen der Browser und Selenium ausgeführt werden

Selenium::WebDriver::Error::SessionNotCreatedError (session not created: This version of ChromeDriver only supports Chrome version 75)

In Selenium geben Sie den Browsertyp an und bewegen die Maus programmgesteuert.

#Starten Sie Selen
driver = Selenium::WebDriver.for :chrome

Wenn Sie Chrome verwenden möchten, installieren Sie dieselbe Version des Chrome-Treibers wie Chrome. Sie müssen den Browser, den Sie verwenden möchten, wie z. B. Firefox oder Chrome, in Ihrer Entwicklungsumgebung installiert haben.

So überprüfen Sie die Version von Google Chrome </ b> Überprüfen Sie die Version unter Google Chrome-Einstellungen> Hilfe> Über Google Chrome 20190515051326.png

So installieren Sie Chromedriver </ b> [Ruby] Web-Scraping mit Chrome auf Selen

Wenn Sie es auf Heroku bereitstellen und verwenden möchten, müssen Sie Google Chrome und den Chrome-Treiber auch auf Heroku installieren. Sie müssen auch eine Option hinzufügen, um Chrome Headless auszuführen. Chrome und Chrome-Treiber in Heroku einfügen

[Kostenlos] Chrome Headless + Selen laufen regelmäßig auf Heroku

Machen Sie einen Screenshot einer Webseite mit kopflosem Chrom in Herokus Rails-App

2. Webseite konnte nicht geöffnet werden

Selenium::WebDriver::Error::InvalidArgumentError (invalid argument: 'url' must be a string)

Schlechtes Beispiel: Als Variable übergeben

#Öffne URL
@url = 'https://www...'
driver.get(@url)
driver.get("#{@url)")

Ist es nutzlos, wenn das Innere von () eine Ruby-Variable ist? Ich war wütend, daraus eine Zeichenkette zu machen.

OK Beispiel: Schreiben Sie die Zeichenfolge so wie sie ist

#Öffne URL
driver.get('https://www...')

3. Das Element auf der Seite konnte nicht gut abgerufen werden

Selenium::WebDriver::Error::NoSuchElementError: no such element: Unable to locate element: {"method":"id","selector":"#entryBtn"}

Fehler, der auftritt, wenn kein Element vorhanden ist, das HTML / CSS entspricht. Überprüfen Sie, ob Sie den Klassennamen usw. richtig angeben können.

Für nokogiri: Geben Sie das Element mit dem CSS-Selektor an

Geben Sie das Element an, das Sie mit der CSS-Auswahl erhalten möchten.

#Installieren Sie die für die Verwendung von Nokiaogiri erforderlichen Tools
require 'nokogiri'
require 'open-uri'

#Holen Sie sich Seitenelemente mit Nokogiri
html = Nokogiri::HTML(open('https://www.google.co.jp/'))
logo = html.css('#hplogo')

Für Selen: Geben Sie das Element nach Elementtyp + Elementname (HTML-Tag, CSS-Klassenname usw.) an.

Geben Sie das Element, das Sie erhalten möchten, nach Elementtyp + Elementname an.

#Installieren Sie die Werkzeuge, die für die Verwendung von Selen benötigt werden
require 'selenium-webdriver'

#Starten Sie Selenium und rufen Sie die Elemente der Seite ab
driver = Selenium::WebDriver.for :chrome
driver.find_element(:id, 'hplogo') 

Mit Selen brauchen Sie kein "#".

4. Sie arbeiten an einem Selenium-Element, das sich nicht auf der Seite befindet

Selenium::WebDriver::Error::StaleElementReferenceError (stale element reference: element is not attached to the page document)

Ein Fehler, der aufgetreten ist, als ich zum Browser zurückgekehrt bin und versucht habe, ein Element auf der vorherigen Seite zu bearbeiten.

Schlechtes Beispiel: Variablen sind nach der zweiten Schleife leer

#Installieren Sie die Werkzeuge, die für die Verwendung von Selen benötigt werden
require 'selenium-webdriver'

#Starten Sie Selen
driver = Selenium::WebDriver.for :chrome

#Rufen Sie die URL der Ereignisdetailseite von der Ereignislistenseite ab
events = driver.find_elements(:class, 'eventItem')

#Gehen Sie zur Seite mit den Ereignisdetails
for i in 0..events.size()-1
  #Klicken Sie auf die Schaltfläche zur Ereignisdetailseite
  events.find_element(:class, 'entryBtn').click()
 #→ Bei der zweiten und nachfolgenden Schleifenverarbeitung tritt ein Fehler auf

  #Gehen Sie zurück zur vorherigen Seite
 driver.navigate.back
end

OK Beispiel: Elemente in der Schleifenverarbeitung erneut erfassen

#Installieren Sie die Werkzeuge, die für die Verwendung von Selen benötigt werden
require 'selenium-webdriver'

#Starten Sie Selen
driver = Selenium::WebDriver.for :chrome

#Rufen Sie die URL der Ereignisdetailseite von der Ereignislistenseite ab
events = driver.find_elements(:class, 'eventItem')

#Gehen Sie zur Seite mit den Ereignisdetails
for i in 0..events.size()-1
  #Da der Treiber während der zweiten und nachfolgenden Schleifenverarbeitung verschwunden ist, geben Sie den Treiber erneut an.
  events_in_loop = driver.find_elements(:class, 'prfItem')

  #Klicken Sie auf die Schaltfläche zur Ereignisdetailseite
  events_in_loop[i].find_element(:class, 'entryBtn').click()

  #Gehen Sie zurück zur vorherigen Seite
 driver.navigate.back
end

Wenn Sie sich in einer Schleife befinden, ist der Treiber nicht gültig, sodass Sie den Treiber erneut in die Schleife aufnehmen müssen.

Referenz get StaleElementReferenceException error while using driver.navigate().back() in a loop in selenium

5. Ich kann keine Ruby-Befehle eingeben

Es ist ein Umgebungsfehler, der sich wie "fertig" anfühlt.

 `require': incompatible library version - /Users/cathy/Desktop/work/vagrant/Test/vendor/bundle/ruby/2.5.0/gems/pg-0.19.0/lib/pg_ext.bundle (LoadError)

Als ich gem deinstallierte, bekam ich einen weiteren Fehler und konnte nicht raus ...

/Users/cathy/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- rubygems/core_ext/kernel_warn (LoadError)

Es scheint, dass die Ursache darin besteht, dass es eine Beschreibung des erforderlichen Selenium-Treibers gibt, obwohl das Juwel von Selen verschwunden ist.

Gem-Datei kann solche Datei nicht laden

Ich konnte es nicht lösen, selbst wenn ich verschiedene Dinge ausprobiert hätte, also gelang es mir schließlich, es zum Laufen zu bringen, indem ich die Version von Ruby erhöhte.

Ich bin beim Upgrade von Ruby gestolpert

Recommended Posts