[Ruby] 5 erreurs courantes qui ont tendance à se produire lors du scraping avec Selenium et comment les gérer

Voici 5 erreurs courantes lors de l'utilisation de l'outil "Selenium" </ b> utile pour le web scraping.

introduction

Le sélénium est un joyau utile pour le grattage Web avec des opérations complexes.

Gemme pouvant être utilisée lors du scraping Web avec Ruby </ b>

--Nokogiri (basique) --Mécaniser (facile) --Selenium (Vous pouvez faire diverses choses en utilisant le navigateur)

Dans Nokogiri et Mechanize, les balises HTML et CSS sont spécifiées pour obtenir le contenu de la page. Avec Selenium, vous pouvez ouvrir un navigateur par programmation et effectuer des opérations simulées, ce qui vous permet d'effectuer un traitement complexe.

--Si vous devez vous connecter --Si vous dessinez une page avec JavaScript --Si vous souhaitez saisir des données

Ceci est utile lorsque vous ne pouvez pas obtenir les informations nécessaires en utilisant uniquement des balises HTML ou des sélecteurs CSS.

Comment utiliser Selenium

Diverses personnes ont résumé comment utiliser Selenium, alors jetez un œil là-bas.

[Ruby] Web scraping avec Chrome sur sélénium

Aide-mémoire sur le sélénium [Ruby]

#Installez les outils nécessaires pour utiliser Selenium
require 'selenium-webdriver'

#Lancez Selenium
driver = Selenium::WebDriver.for :chrome

5 erreurs courantes lors de l'utilisation de sélénium

1. Différentes versions des outils qui exécutent le navigateur et Selenium

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

Dans Selenium, vous spécifiez le type de navigateur et déplacez la souris par programmation.

#Démarrer le sélénium
driver = Selenium::WebDriver.for :chrome

Si vous souhaitez utiliser Chrome, installez la même version du pilote Chrome que Chrome. Vous devez disposer du navigateur que vous souhaitez utiliser, tel que Firefox ou Chrome, installé dans votre environnement de développement.

Comment vérifier la version de Google Chrome </ b> Vérifiez la version dans Paramètres de Google Chrome> Aide> À propos de Google Chrome 20190515051326.png

Comment installer Chromedriver </ b> [Ruby] Web scraping avec Chrome sur sélénium

Si vous souhaitez le déployer et l'utiliser sur Heroku, vous devez également installer le pilote Google Chrome et Chrome sur Heroku. Vous devez également ajouter une option pour exécuter Chrome sans tête. Mettre le pilote Chrome et Chrome dans Heroku

[Gratuit] Chrome headless + sélénium fonctionne régulièrement sur heroku

Prendre une capture d'écran d'une page Web utilisant le chrome sans tête dans l'application Heroku's Rails

2. Impossible d'ouvrir la page Web

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

Mauvais exemple: passer comme variable

#Ouvrir le lien
@url = 'https://www...'
driver.get(@url)
driver.get("#{@url)")

Est-ce inutile si l'intérieur de () est une variable ruby? J'étais en colère d'en faire une chaîne de caractères.

OK exemple: écrivez la chaîne de caractères telle quelle

#Ouvrir le lien
driver.get('https://www...')

3. Impossible d'obtenir correctement l'élément dans la page

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

Erreur qui se produit lorsqu'il n'y a pas d'élément correspondant à HTML / CSS. Vérifiez si vous pouvez spécifier correctement le nom de la classe, etc.

Pour nokogiri: spécifiez l'élément avec le sélecteur CSS

Spécifiez l'élément que vous souhaitez obtenir avec le sélecteur CSS.

#Installez les outils nécessaires pour utiliser nokogiri
require 'nokogiri'
require 'open-uri'

#Obtenir des éléments de page à l'aide de Nokogiri
html = Nokogiri::HTML(open('https://www.google.co.jp/'))
logo = html.css('#hplogo')

Pour le sélénium: spécifiez l'élément par type d'élément + nom d'élément (balise HTML, nom de classe CSS, etc.)

Spécifiez l'élément que vous souhaitez obtenir par type d'élément + nom d'élément.

#Installez les outils nécessaires à l'utilisation du sélénium
require 'selenium-webdriver'

#Démarrez Selenium et récupérez les éléments de la page
driver = Selenium::WebDriver.for :chrome
driver.find_element(:id, 'hplogo') 

Avec le sélénium, vous n'avez pas besoin de "#".

4. Vous travaillez sur un élément Selenium qui ne figure pas sur la page

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

Une erreur qui s'est produite lorsque je suis retourné dans le navigateur et que j'ai essayé d'opérer sur un élément qui se trouvait sur la page précédente.

Mauvais exemple: les variables sont vides après la deuxième boucle

#Installez les outils nécessaires à l'utilisation du sélénium
require 'selenium-webdriver'

#Lancez Selenium
driver = Selenium::WebDriver.for :chrome

#Obtenez l'URL de la page des détails de l'événement à partir de la page de la liste des événements
events = driver.find_elements(:class, 'eventItem')

#Aller à la page des détails de l'événement
for i in 0..events.size()-1
  #Cliquez sur le bouton pour accéder à la page des détails de l'événement
  events.find_element(:class, 'entryBtn').click()
 #→ Une erreur se produit dans le deuxième traitement en boucle

  #Retournez à la page précédente
 driver.navigate.back
end

OK exemple: réacquérir l'élément dans le processus de boucle

#Installez les outils nécessaires à l'utilisation du sélénium
require 'selenium-webdriver'

#Lancez Selenium
driver = Selenium::WebDriver.for :chrome

#Obtenez l'URL de la page des détails de l'événement à partir de la page de la liste des événements
events = driver.find_elements(:class, 'eventItem')

#Aller à la page des détails de l'événement
for i in 0..events.size()-1
  #Le pilote ayant disparu lors du deuxième traitement de boucle et des suivants, spécifiez à nouveau le pilote.
  events_in_loop = driver.find_elements(:class, 'prfItem')

  #Cliquez sur le bouton pour accéder à la page des détails de l'événement
  events_in_loop[i].find_element(:class, 'entryBtn').click()

  #Retournez à la page précédente
 driver.navigate.back
end

Si vous êtes dans une boucle, le pilote ne sera pas valide, vous devrez donc le remettre dans la boucle.

référence get StaleElementReferenceException error while using driver.navigate().back() in a loop in selenium

5. Je ne peux pas entrer de commandes Ruby

C'est une erreur de construction d'environnement qui semble "terminée".

 `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)

Quand j'ai désinstallé gem, j'ai eu une autre erreur et je n'ai pas pu sortir ...

/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)

Il semble que la cause en soit qu'il existe une description de require'selenium-driver 'même si le joyau de Selenium a disparu.

le fichier gem ne peut pas charger ce fichier

Je ne pouvais pas le résoudre même si j'essayais diverses choses, alors j'ai réussi à le faire fonctionner lorsque j'ai monté la version de Ruby.

J'ai trébuché lors de la mise à niveau de Ruby

Recommended Posts