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.
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 ...
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.
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
Le scraping est l'extraction de données en analysant le HTML d'une page Web.
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 ''.
#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