Skip to content

Commit

Permalink
240123.2026
Browse files Browse the repository at this point in the history
  • Loading branch information
refiaa committed Jan 23, 2024
1 parent 09a7f95 commit ee2f5b1
Show file tree
Hide file tree
Showing 3 changed files with 272 additions and 1 deletion.
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,11 @@ WIS_Scraper
・アップデートの有無の確認・自動ダウンロード・アップデート機能を追加しました。
```

### 240123.2026
```
・水位流量に対する全ての項目に対する臨時アップデートを行いました。
```

## 問い合わせ

不具合・お問い合わせに関したは Issues の New issue からお願いします。
Expand Down
173 changes: 173 additions & 0 deletions src/SrchWaterData.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,3 +264,176 @@ def save_to_file(self, content, period):
with open(file_path, "wb") as file:
file.write(content)

class SrchWaterData_5(BaseSrchWaterData):
def __init__(self, js_detail, kind_value, start_year=None, start_month=None, end_year=None, end_month=None):
super().__init__(js_detail, kind_value, "SrchWaterData")
self.start_year = start_year
self.start_month = start_month
self.end_year = end_year
self.end_month = end_month
self.station_data = self.fetch_station_data()

def scrape_data_for_months(self):
for year in range(self.start_year, self.end_year + 1):
for month in range(1, 13):
if year == self.start_year and month < self.start_month:
continue
if year == self.end_year and month > self.end_month:
break
self.scrape_data_for_month(year, month)

def scrape_data_for_month(self, year, month):
month_str = f"{month:02d}"
last_day = calendar.monthrange(year, month)[1]
url = f"{self.BASE_URL}DspWaterData.exe?KIND={self.kind_value}&ID={self.js_detail}&BGNDATE={year}{month_str}01&ENDDATE={year}{month_str}{last_day}&KAWABOU=NO"
response = requests.get(url)
response.encoding = 'EUC-JP'

if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
link_tag = soup.find('a', href=True, target="_blank")
if link_tag:
temp_number = link_tag['href'].split('/')[-1].split('.')[0]
self.download_data_file(temp_number, year, month)

def download_data_file(self, temp_number, year, month):
download_url = f"http://www1.river.go.jp/dat/dload/download/{temp_number}.dat"
response = requests.get(download_url)

if response.status_code == 200:
self.save_to_file(response.content, year, month)

def save_to_file(self, content, year, month):
directory = f"./Download/SrchWaterData_{self.kind_value}_{self.station_data.get('水系名', 'Unknown')}_{self.station_data.get('河川名', 'Unknown')}_{self.station_data.get('観測所名', 'Unknown')}"
if not os.path.exists(directory):
os.makedirs(directory, exist_ok=True)

file_path = os.path.join(directory, f"{year}_{month:02d}.dat")
with open(file_path, "wb") as file:
file.write(content)

class SrchWaterData_6(BaseSrchWaterData):
def __init__(self, js_detail, kind_value, start_year=None, start_month=None, end_year=None, end_month=None):
super().__init__(js_detail, kind_value, "SrchWaterData")
self.start_year = start_year
self.start_month = start_month
self.end_year = end_year
self.end_month = end_month
self.station_data = self.fetch_station_data()

def scrape_data_for_months(self):
for year in range(self.start_year, self.end_year + 1):
for month in range(1, 13):
if year == self.start_year and month < self.start_month:
continue
if year == self.end_year and month > self.end_month:
break
self.scrape_data_for_month(year, month)

def scrape_data_for_month(self, year, month):
month_str = f"{month:02d}"
url = f"{self.BASE_URL}DspWaterData.exe?KIND={self.kind_value}&ID={self.js_detail}&BGNDATE={year}{month_str}01&ENDDATE={year}{month_str}31&KAWABOU=NO"
response = requests.get(url)
response.encoding = 'EUC-JP'

if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
link_tag = soup.find('a', href=True, target="_blank")
if link_tag:
temp_number = link_tag['href'].split('/')[-1].split('.')[0]
self.download_data_file(temp_number, year, month)

def download_data_file(self, temp_number, year, month):
download_url = f"http://www1.river.go.jp/dat/dload/download/{temp_number}.dat"
response = requests.get(download_url)

if response.status_code == 200:
self.save_to_file(response.content, year, month)

def save_to_file(self, content, year, month):
directory = f"./Download/SrchWaterData_{self.kind_value}_{self.station_data.get('水系名', 'Unknown')}_{self.station_data.get('河川名', 'Unknown')}_{self.station_data.get('観測所名', 'Unknown')}"
if not os.path.exists(directory):
os.makedirs(directory, exist_ok=True)

file_path = os.path.join(directory, f"{year}_{month:02d}.dat")
with open(file_path, "wb") as file:
file.write(content)

class SrchWaterData_7(BaseSrchWaterData):
def __init__(self, js_detail, kind_value, start_year=None, end_year=None):
super().__init__(js_detail, kind_value, "SrchWaterData")
self.start_year = start_year
self.end_year = end_year

self.station_data = self.fetch_station_data()

def scrape_data_for_years(self):
for year in range(self.start_year, self.end_year + 1):
self.scrape_data_for_year(year)

def scrape_data_for_year(self, year):
url = f"{self.BASE_URL}DspWaterData.exe?KIND={self.kind_value}&ID={self.js_detail}&BGNDATE={year}0131&ENDDATE={year}1231&KAWABOU=NO"
response = requests.get(url)
response.encoding = 'EUC-JP'

if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
link_tag = soup.find('a', href=True, target="_blank")
if link_tag:
temp_number = link_tag['href'].split('/')[-1].split('.')[0]
self.download_data_file(temp_number, year)

def download_data_file(self, temp_number, year):
download_url = f"http://www1.river.go.jp/dat/dload/download/{temp_number}.dat"
response = requests.get(download_url)

if response.status_code == 200:
self.save_to_file(response.content, year)

def save_to_file(self, content, year):
if self.station_data:
directory = f"./Download/SrchWaterData_{self.kind_value}_{self.station_data.get('水系名', 'Unknown')}_{self.station_data.get('河川名', 'Unknown')}_{self.station_data.get('観測所名', 'Unknown')}"
else:
directory = f"./Download/SrchWaterData_{self.kind_value}_{self.js_detail}"

if not os.path.exists(directory):
os.makedirs(directory, exist_ok=True)

file_path = os.path.join(directory, f"{year}.dat")
with open(file_path, "wb") as file:
file.write(content)

class SrchWaterData_8(BaseSrchWaterData):
def __init__(self, js_detail, kind_value, start_year=None, end_year=None):
super().__init__(js_detail, kind_value, "SrchWaterData")
self.start_year = start_year
self.end_year = end_year
self.station_data = self.fetch_station_data()

def scrape_data_for_period(self):
url = f"{self.BASE_URL}DspWaterData.exe?KIND={self.kind_value}&ID={self.js_detail}&BGNDATE={self.start_year}0131&ENDDATE={self.end_year}1231&KAWABOU=NO"
response = requests.get(url)
response.encoding = 'EUC-JP'

if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
link_tag = soup.find('a', href=True, target="_blank")
if link_tag:
temp_number = link_tag['href'].split('/')[-1].split('.')[0]
self.download_data_file(temp_number)

def download_data_file(self, temp_number):
download_url = f"http://www1.river.go.jp/dat/dload/download/{temp_number}.dat"
response = requests.get(download_url)

if response.status_code == 200:
self.save_to_file(response.content, f"{self.start_year}-{self.end_year}")

def save_to_file(self, content, period):
directory = f"./Download/SrchWaterData_{self.kind_value}_{self.station_data.get('水系名', 'Unknown')}_{self.station_data.get('河川名', 'Unknown')}_{self.station_data.get('観測所名', 'Unknown')}"
if not os.path.exists(directory):
os.makedirs(directory, exist_ok=True)

file_path = os.path.join(directory, f"{period}.dat")
with open(file_path, "wb") as file:
file.write(content)
95 changes: 94 additions & 1 deletion src/WIS_DetailInfoWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from PyQt5.QtGui import QFont, QColor

from SrchRainData import SrchRainData_1, SrchRainData_2, SrchRainData_3, SrchRainData_4
from SrchWaterData import SrchWaterData_1, SrchWaterData_2, SrchWaterData_3, SrchWaterData_4
from SrchWaterData import SrchWaterData_1, SrchWaterData_2, SrchWaterData_3, SrchWaterData_4, SrchWaterData_5, SrchWaterData_6, SrchWaterData_7, SrchWaterData_8

from getObservationInfo import ObservationDataMatcher

Expand Down Expand Up @@ -251,6 +251,7 @@ def process_data(self):
# ========================= SrchWaterData Part ========================== #

# this is not best way, which mean this code 'WIS_DetailInfoWindow.py hav to changed for DRY and SOLID Principle for program optimization
# REFACTORING IS REQUIRED

@data_type_decorator(data_type="water")
def handle_data_water(self, kind_value_int, data_class_prefix):
Expand All @@ -271,6 +272,22 @@ def handle_data_water(self, kind_value_int, data_class_prefix):
elif kind_value_int == 4:
self.handle_specific_data_water(data_class(4), kind_value_int, self.valid_start_year, self.valid_end_year)
self.add_date_input_fields_water_4()

elif kind_value_int == 5:
self.handle_specific_data_water(data_class(5), kind_value_int, self.valid_start_year, self.start_month, self.valid_end_year, self.end_month)
self.add_date_input_fields_water_5()

elif kind_value_int == 6:
self.handle_specific_data_water(data_class(6), kind_value_int, self.valid_start_year, self.start_month, self.valid_end_year, self.end_month)
self.add_date_input_fields_water_6()

elif kind_value_int == 7:
self.handle_specific_data_water(data_class(7), kind_value_int, self.valid_start_year, self.valid_end_year)
self.add_date_input_fields_water_7()

elif kind_value_int == 8:
self.handle_specific_data_water(data_class(8), kind_value_int, self.valid_start_year, self.valid_end_year)
self.add_date_input_fields_water_8()

else:
self.display_message("Not Supported Data Type")
Expand All @@ -288,6 +305,18 @@ def handle_specific_data_water(self, DataClass, kind_value_int, start_year=None,

elif DataClass == globals()[f'{data_class_prefix}_4']:
data_handler = DataClass(self.js_detail, kind_value_int, start_year, end_year)

elif DataClass == globals()[f'{data_class_prefix}_5']:
data_handler = DataClass(self.js_detail, kind_value_int, start_year, start_month, end_year, end_month)

elif DataClass == globals()[f'{data_class_prefix}_6']:
data_handler = DataClass(self.js_detail, kind_value_int, start_year, start_month, end_year, end_month)

elif DataClass == globals()[f'{data_class_prefix}_7']:
data_handler = DataClass(self.js_detail, kind_value_int, start_year, end_year)

elif DataClass == globals()[f'{data_class_prefix}_8']:
data_handler = DataClass(self.js_detail, kind_value_int, start_year, end_year)

else:
self.display_message("Not Supported Data Type")
Expand Down Expand Up @@ -366,6 +395,70 @@ def on_data_confirm_water_4(self, start_year, end_year, start_month=None, end_mo

QMessageBox.information(self, "Download Complete", "Data download completed successfully.")

# SrchwaterData_5
@date_input(input_type='date')
def add_date_input_fields_water_5(self):
self.confirm_button.clicked.disconnect()
self.confirm_button.clicked.connect(self.on_data_confirm_water_5)

@data_confirm(data_type='date')
def on_data_confirm_water_5(self, start_year, end_year, start_month, end_month):
if not self.validate_years_range(SrchWaterData_5, 5, start_year, end_year):
return

data_handler = SrchWaterData_5(self.js_detail, 5, start_year, start_month, end_year, end_month)
data_handler.scrape_data_for_months()

QMessageBox.information(self, "Download Complete", "Data download completed successfully.")

# SrchwaterData_6
@date_input(input_type='date')
def add_date_input_fields_water_6(self):
self.confirm_button.clicked.disconnect()
self.confirm_button.clicked.connect(self.on_data_confirm_water_6)

@data_confirm(data_type='date')
def on_data_confirm_water_6(self, start_year, end_year, start_month, end_month):
if not self.validate_years_range(SrchWaterData_6, 6, start_year, end_year):
return

data_handler = SrchWaterData_6(self.js_detail, 6, start_year, start_month, end_year, end_month)
data_handler.scrape_data_for_months()

QMessageBox.information(self, "Download Complete", "Data download completed successfully.")

# SrchwaterData_7
@date_input(input_type='year')
def add_date_input_fields_water_7(self):
self.confirm_button.clicked.disconnect()
self.confirm_button.clicked.connect(self.on_data_confirm_water_7)

@data_confirm(data_type='year')
def on_data_confirm_water_7(self, start_year, end_year, start_month=None, end_month=None):
if not self.validate_years_range(SrchWaterData_7, 7, start_year, end_year):
return

data_handler = SrchWaterData_7(self.js_detail, 7, start_year, end_year)
data_handler.scrape_data_for_years()

QMessageBox.information(self, "Download Complete", "Data download completed successfully.")

# SrchwaterData_8
@date_input(input_type='year')
def add_date_input_fields_water_8(self):
self.confirm_button.clicked.disconnect()
self.confirm_button.clicked.connect(self.on_data_confirm_water_8)

@data_confirm(data_type='year')
def on_data_confirm_water_8(self, start_year, end_year, start_month=None, end_month=None):
if not self.validate_years_range(SrchWaterData_8, 8, start_year, end_year):
return

data_handler = SrchWaterData_8(self.js_detail, 8, start_year, end_year)
data_handler.scrape_data_for_period()

QMessageBox.information(self, "Download Complete", "Data download completed successfully.")

# ========================== SrchRainData Part ========================== #

# SrchRainDataのデータ処理、
Expand Down

0 comments on commit ee2f5b1

Please sign in to comment.