[PYTHON] Meteorologie x Ruby ~ Ruby Scraping mit Mechanize ~

Dieser Versuch

・ Ermitteln Sie den Wert der Wetterdaten AMeDAS alle 10 Minuten gleichzeitig

・ Versuchen Sie, sowohl mit Python als auch mit Ruby zu kratzen

Klicken Sie hier, um Daten zu löschen (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. Scraping mit 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=['Stunde und Minute','Lokaler Druck','Meeresspiegeldruck','Niederschlag','Temperatur','Relative Luftfeuchtigkeit','Durchschnittliche Windgeschwindigkeit','Durchschnittliche Windrichtung','Maximale momentane Windgeschwindigkeit','Maximale momentane Windrichtung','Sonnenlichtzeit'])
df.to_csv('tokyo_2019-01-01.csv', index=None,encoding='SJIS')

Kommentar

#① Objektgenerierung zum Analysieren des angegebenen HTML-Codes
soup = BeautifulSoup(html, 'html.parser')
#② Holen Sie sich alle tr-Tags, indem Sie die Bedingungen angeben
element = soup.find_all('tr', attrs={'class':'mtx', 'style':'text-align:right;'})

Extrahieren Sie danach den Text daraus und fügen Sie ihn nacheinander zur Liste hinzu

** ↓ Ausgabeergebnis ↓ ** image.png

2. Schaben mit 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 = ['Stunde und Minute','Lokaler Druck','Meeresspiegeldruck','Niederschlag','Temperatur','Relative Luftfeuchtigkeit','Durchschnittliche Windgeschwindigkeit','Durchschnittliche Windrichtung','Maximale momentane Windgeschwindigkeit','Maximale momentane Windrichtung','Sonnenlichtzeit']
CSV.open('tokyo_2019-01-01.csv','w') do |csv|
    csv << header
    out.each do |val|
        csv << val
    end        
end

Kommentar

#① Erstellen Sie eine Instanz der Mechanize-Klasse und rufen Sie den HTML-Code der angegebenen URL ab
agent = Mechanize.new

page = agent.get(url)
#② Nach dem Durchsuchen des tr-Tags mit der Suchmethode ist das Style-Tag Text-align:inner wenn richtig_Holen Sie sich Text mit der Textmethode
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
#~ Abkürzung ~

** ↓ Ausgabeergebnis ↓ ** image.png

Überraschenderweise gab es keinen großen Unterschied in der Menge des Codes. Ist es möglich, nach Tags zu suchen, indem Attribute in Ruby angegeben werden? .. ..

das ist alles! !! !!

Recommended Posts

Meteorologie x Ruby ~ Ruby Scraping mit Mechanize ~
Scraping mit Python
Verwenden von X11 mit ubuntu18.04 (C-Sprache)
Scraping mit Python 3.5 async / await
Scraping mit Python 3.5 Async-Syntax
Web Scraping mit Selenium (Python)
Web Scraping mit AWS Lambda