Météorologie x Ruby ~ Grattage de rubis avec Mechanize ~

Cette tentative

・ Obtenez la valeur des données météorologiques AMeDAS toutes les 10 minutes à la fois

・ Essayez de gratter à la fois avec Python et Ruby

Cliquez ici pour récupérer les données (https://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=44&block_no=47662&year=2019&month=01&day=01&view=p1) image.png

1. Gratter avec Python

# -*- coding: utf-8 -*-
import pandas as pd
import urllib.request
from bs4 import BeautifulSoup

url = 'https://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=44&block_no=47662&year=2019&month=01&day=01&view=p1'
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
element = soup.find_all('tr', attrs={'class':'mtx', 'style':'text-align:right;'})

out = []
for ele in element:
  data_list = []
  for e in ele:
    data_list.append(e.text)
  out.append(data_list)

df = pd.DataFrame(data=out, columns=['Heure et minute','Pression locale','Pression au niveau de la mer','Précipitation','Température','Humidité relative','Vitesse moyenne du vent','Direction moyenne du vent','Vitesse du vent instantanée maximale','Direction instantanée maximale du vent','Heure du soleil'])
df.to_csv('tokyo_2019-01-01.csv', index=None,encoding='SJIS')

Commentaire

#① Génération d'objets pour analyser le HTML spécifié
soup = BeautifulSoup(html, 'html.parser')
#② Obtenez toutes les balises tr en spécifiant les conditions
element = soup.find_all('tr', attrs={'class':'mtx', 'style':'text-align:right;'})

Après cela, extrayez-en le texte et ajoutez-le à la liste un par un

** ↓ Résultat de sortie ↓ ** image.png

2. Grattage avec Ruby

require 'csv'
require 'mechanize'

agent = Mechanize.new
url = 'https://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=44&block_no=47662&year=2019&month=01&day=01&view=p1'
page = agent.get(url)
html = page.search('tr')

out = []
html.each do |element|
    if element.get_attribute('style') == 'text-align:right;' then
        data_list=[]
        ele = element.search('td')
        ele.each do |e|
            data_list << e.inner_text
        end
        out << data_list
    end
end

header = ['Heure et minute','Pression locale','Pression au niveau de la mer','Précipitation','Température','Humidité relative','Vitesse moyenne du vent','Direction moyenne du vent','Vitesse du vent instantanée maximale','Direction instantanée maximale du vent','Heure du soleil']
CSV.open('tokyo_2019-01-01.csv','w') do |csv|
    csv << header
    out.each do |val|
        csv << val
    end        
end

Commentaire

#① Créez une instance de la classe Mechanize et récupérez le HTML de l'url spécifiée
agent = Mechanize.new

page = agent.get(url)
#② Après avoir recherché la balise tr avec la méthode de recherche, la balise de style est du texte-align:intérieur quand il a raison_Obtenir du texte avec la méthode text
html = page.search('tr')

out = []
html.each do |element|
    if element.get_attribute('style') == 'text-align:right;' then
        data_list=[]
        ele = element.search('td')
        ele.each do |e|
            data_list << e.inner_text
#~ abrégé ~

** ↓ Résultat de sortie ↓ ** image.png

Étonnamment, il n'y avait pas beaucoup de différence dans la quantité de code. Est-il possible de rechercher des balises en spécifiant des attributs dans Ruby? .. ..

c'est tout! !! !!

Recommended Posts

Météorologie x Ruby ~ Grattage de rubis avec Mechanize ~
Scraping à l'aide de Python
Utilisation de X11 avec ubuntu18.04 (langage C)
Scraping à l'aide de Python 3.5 async / await
Scraping à l'aide de la syntaxe Python 3.5 Async
Web scraping avec Selenium (Python)
Web scraping à l'aide d'AWS lambda