[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.

Lors du développement du système, j'avais besoin d'obtenir des informations à partir d'autres pages WEB, j'ai donc créé un robot d'exploration.

Première pensée

Ce que j'essayais de faire, c'était d'obtenir les informations d'autres pages WEB et de les enregistrer dans la base de données de l'application que je crée actuellement. Alors, est-ce du raclage pour "obtenir des informations" en quelque sorte? J'étais enthousiaste à ce sujet ...

J'ai commencé l'enquête et j'ai découvert

Ce que j'essayais de faire était certainement de gratter. Cependant, pour obtenir ces informations, il s'est avéré que nous devions d'abord créer quelque chose appelé un robot d'exploration.

Qu'est-ce qu'un robot d'exploration?

D'autre part, le robot d'exploration est une méthode pour parcourir tous les liens de la page Web et obtenir les informations souhaitées tout en creusant profondément. Cet acte lui-même est appelé ramper. Bien entendu, lors de la recherche d'un lien avec un robot d'exploration, un scraping est effectué et la balise HTML est analysée pour obtenir la destination du lien.

http://tech.feedforce.jp/anemone_crawler.html

Qu'est-ce que le grattage?

Le scraping est l'extraction de données en analysant le HTML d'une page Web.

webdesign-3411373_640.jpg

en bref, ● Le grattage peut être utilisé lorsque les informations sont rassemblées sur une seule page. ● Le robot d'exploration patrouille sur le site Web.

Ainsi, je peux voir le flux de `` créer un robot → écrire le code lié au scraping → écrire la description à enregistrer dans la base de données ''.

Code source terminé

#Utiliser la gemme rubis Activé pour utiliser l'anémone nokogiri
require 'nokogiri'
require 'anemone'
require 'pry'
#URL pour être le point de départ de la patrouille
URL = 'https://********/********'.freeze

area_urls = []
prefecture_urls = []
city_urls = []
#Description qui fait le tour du site
Anemone.crawl(URL, depth_limit: 0, delay: 1) do |anemone|
  anemone.focus_crawl do |page|
    page.links.keep_if do |link|
      link.to_s.match(%r{*********/[0-9]{1,2}})
    end
    page.links.each do |link|
      area_urls << link
    end
  end
end

area_urls.each do |area|
  Anemone.crawl(area, depth_limit: 0, delay: 1) do |anemone|
    anemone.focus_crawl do |page|
      page.links.keep_if do |link|
        link.to_s.match(%r{**********/[0-9]{1,2}/[0-9]{5}})
      end
      page.links.each do |link|
        prefecture_urls << link
      end
    end
  end
end

prefecture_urls.each do |prefecture|
  Anemone.crawl(prefecture, depth_limit: 1, delay: 1, skip_query_strings: true) do |anemone|
    anemone.focus_crawl do |page|
      page.links.keep_if do |link|
        link.to_s.match(%r{**********/[0-9]{1,2}/[0-9]{5}/[0-9]})
      end
      page.links.each do |link|
        city_urls << link
      end
    end

    PATTERN = %r[**********/[0-9]{1,2}/[0-9]{5}/[0-9]].freeze

    anemone.on_pages_like(PATTERN) do |page|
      url = page.url.to_s

      str = url.to_s

      html = URI.parse(url).open
      #Description du grattage à partir d'ici
      doc = Nokogiri::HTML.parse(html, nil, 'UTF-8')
#Spécifiez HTML avec Xpath
      name = doc.xpath('/html/body/div[4]/div/div[2]/div[1]/h1').text
      pos = doc.xpath('/html/body/div[4]/div/div[2]/table[1]/tbody/tr[3]/td/text()[1]').text
      post = pos.strip
      postcode = post.match(/[0-9]{7}/)
      add = doc.xpath('/html/body/div[4]/div/div[2]/table[1]/tbody/tr[3]/td/text()[2]').text
      address = add.strip
      tel = doc.xpath('/html/body/div[4]/div/div[2]/table[1]/tbody/tr[4]/td').text
      fax = doc.xpath('/html/body/div[4]/div/div[2]/table[1]/tbody/tr[5]/td').text
      staff_number = doc.xpath('/html/body/div[4]/div/div[2]/table[4]/tbody/tr[1]/td/p').text
      company = doc.xpath('/html/body/div[4]/div/div[2]/table[5]/tbody/tr[2]/td').text
      office_url = doc.xpath('/html/body/div[4]/div/div[2]/table[1]/tbody/tr[6]/td/a').text
      #Extraire des nombres à 5 chiffres de l'URL avec une expression régulière
      if str =~ %r{/(\d{5})(/|$)}
        city_number = Regexp.last_match(1)
        p Regexp.last_match(1)
      end
#Créez une instance, enregistrez les informations obtenues en grattant dans la base de données et ignorez la validation à ce moment-là.
      offices = Office.new(name: name,
                           postcode: postcode,
                           tel: tel,
                           fax: fax,
                           address: address,
                           staff_number: staff_number,
                           company: company,
                           url: office_url,
                           city_number: city_number)
      offices.save(validate: false)
    end
  end
end




Recommended Posts

[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.
J'ai fait une mort risquée avec Ruby
J'ai fait un portfolio avec Ruby On Rails
J'ai créé une interface graphique avec Swing
[Ruby] J'ai créé un simple client Ping
J'ai créé une application Janken avec kotlin
J'ai créé une application Janken avec Android
04. J'ai fait un frontal avec SpringBoot + Thymeleaf
J'ai fait de l'art de la mosaïque avec des images Pokemon
J'ai essayé d'implémenter Ruby avec Ruby (et C) (j'ai joué avec intégré)
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
J'ai créé une bibliothèque d'extension Ruby en C
J'ai créé un robot LINE avec Rails + heroku
J'ai créé un serveur et un client Restful au printemps.
J'ai essayé DI avec Ruby
J'ai créé une application de chat.
J'ai créé un environnement de développement avec rails6 + docker + postgreSQL + Materialise.
J'ai fait un interpréteur (compilateur?) Avec environ 80 lignes en Ruby.
J'ai créé un plug-in qui exécute jextract avec des tâches Gradle
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
J'ai mis à jour mon propre blackjack réalisé avec Ruby pour mon portfolio
J'ai recherché un framework web avec Gem en Ruby
J'ai essayé JAX-RS et pris note de la procédure
J'ai créé un MOD qui appelle instantanément un véhicule avec Minecraft
Installez Ruby 3.0.0 Preview 1 avec une combinaison de Homebrew et de rbenv
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 1/3 (paramètres Jasper Reports)
J'ai créé une interface de ligne de commande avec WinMerge Plugin en utilisant JD-Core
[Rails] J'ai créé une mini-application de calendrier simple avec des spécifications personnalisées.
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 3/3 (contrôle Spring MVC)
Je souhaite ajouter une fonction de navigation avec ruby on rails
J'ai créé une application shopify @java
J'ai créé un formulaire de recherche simple avec Spring Boot + GitHub Search API.
J'ai fait une simple fonction de recommandation.
J'ai créé une application correspondante (application Android)
J'ai créé un outil de génération package.xml.
[Android] J'ai créé une application de podomètre.
Faites un jeu de frappe avec ruby
Je souhaite télécharger un fichier sur Internet en utilisant Ruby et l'enregistrer localement (avec prudence)
J'ai construit un environnement de rails avec docker et mysql, mais j'étais malade
J'ai créé un bot de transaction d'arbitrage de monnaie virtuelle et essayé de gagner de l'argent
J'ai écrit une fonction Lambda en Java et l'ai déployée avec SAM
J'ai créé une classe qui peut utiliser JUMAN et KNP de Java
[LINE BOT] J'ai créé un Ramen BOT avec Java (Maven) + Heroku + Spring Boot (1)
J'ai créé un site qui résume les informations sur la restriction du sucre avec Vue.js
Avec ruby ● × Game et Othello (examen de base)
J'ai essayé un problème de calendrier avec Ruby
J'ai fait diverses fonctions de la séquence de Fibonacci (Ruby)
J'ai créé un serveur écologique avec scala
Dessinez des graphiques avec Sinatra et Chartkick
J'ai essayé de jouer un peu avec BottomNavigationView ①
Extraire une partie d'une chaîne en Ruby
J'ai créé un plug-in pour IntelliJ IDEA
J'ai créé une application de calculatrice sur Android
J'ai créé un nouvel outil de déploiement Java