Местные активисты добились установки двух стационарных постов системы контроля атмосферного воздуха (СКАТ). Эти самые СКАТы периодически фиксируют превышения предельно допустимой концентрации (ПДК) сероводорода и диоксида серы в воздухе. Информация о текущем состоянии воздуха со СКАТов выводится в единую систему экологического мониторинга области (ЕСЭМ) http://ecomap.orb.ru/map/. Но, к сожалению, министерство экологии и экологическая служба доступа к архиву с информацией о превышениях экоактивистам не дают и статистику по превышениям ПДК сильно занижают, тем самым замалчивая существующую проблему.
Для того, чтобы иметь информацию о превышениях и оперировать ей на встречах с министерством и нефтяниками, явно указывая им на недостоверность их отчетов, я накидал код на питоне с использованием selenium (код ниже).
На данный момент принцип таков: открывается сайт системы мониторинга, кликается нужный СКАТ, делается скрин данных. И так по списку указанных ID СКАТов (меня интересуют только 2 из 44). Информация на сайте обновляется каждые 20 минут, так же каждые 20 минут запускается скрипт, который делает скрин, периодически я просматриваю скрины на факт превышения.
Что хочется реализовать:
1. Сохранять скрины только по факту превышения (это легко, руки пока не дошли).
2. Писать все параметры со СКАТа в базу сайта (antineft.ru), для дальнейшего анализа и построения отчетов/графиков.
3. Реализовать рассылку писем/смс местным жителям в случае наступления факта превышения ПДК.
К чему, собственно, пост: как бы вы решили такую задачу? Какие инструменты использовали?
import enum
from selenium import webdriver
from selenium.webdriver.common import action_chains
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
from PIL import Image
import pyautogui as pag
import re
import datetime
import os
#ID всех постов системы контроля атмосферного воздуха (СКАТ)
#skat_list_ID = [20,21,36,40,30,16,4,38,1,43,32,2,22]
#ID интересующих СКАТов
skat_list_ID = [22,20]
#Структура для хранения данных со СКАТов
data_fileds = {'Место':'','Дата':'','Время':'','Температура':'','Атмосферное давление':'','Влажность':'','Направление ветра':'','Скорость ветра':'','Осадки, мм':'','Оксид углерода, мг':'','Оксид углерода ПДК':'','Оксид азота, мг':'','Оксид азота ПДК':'','Диоксид азота, мг':'','Диоксид азота ПДК':'','Диоксид серы, мг':'','Диоксид серы ПДК':'','Сероводород, мг':'','Сероводород ПДК':'','Метан, мг':'','Метан ПДК':'','Сумма углеводородов, мг':''}
def get_place_date_time (string):
string_split = string.split(sep=' ')
data_fileds['Место'] = string_split[0]
#data_fileds['Дата'] = string_split[1]
#data_fileds['Время'] = string_split[2]
def save_screenshot(string):
# определяем начальные координаты найденного окна
location = data.location
# получаем размеры найденного окна
size = data.size
# сохраняем скриншот всей страницы
FullPageScreenshot = now.strftime("%Y-%m-%d-%H-%M-%S")+string+'.png'
path = 'C:/Python/'
browser.save_screenshot(path+FullPageScreenshot)
# вычисляем аргументы для передачи в функцию по обрезке скриншота
x = location['x']
y = location['y']
w = x + size['width']
h = y + size['height']
# открывает скриншот страницы
fullImg = Image.open(path+FullPageScreenshot)
# вырезаем нужную часть изображения
cropImg = fullImg.crop((x, y, w, h))
cropImg.save(path+'_'+FullPageScreenshot)
os.remove('C:/Python/'+FullPageScreenshot)
#------------------------------------------------------------------------------------
browser = webdriver.Chrome('chromedriver.exe')
browser.set_window_size(1200, 1000)
browser.get('http://ecomap.orb.ru/map/')
#текущее время
now = datetime.datetime.now()
for q in skat_list_ID:
try:
#обработка Красный Коммунар-2, клик по координатам из-за близкого расположения рядом 2 СКАТов на карте
if q == 20:
sleep(3)
ActionChains(browser).move_by_offset(645, 330).click().perform()
sleep(3)
# ищем открывшееся после клика окно с данными о ПДК
data = browser.find_element_by_xpath('//*[@id="map-107868-overlays"]/div[2]/div')
save_screenshot('kk2')
btn_close = browser.find_element_by_class_name("v-window-closebox")
btn_close.click()
sleep(1)
browser.refresh()
else:
#поиск следующей точки и ее центрирование на экране
sleep(2)
element = browser.find_elements_by_xpath ("//*[@id='map-107868']/div/div[2]/div/div[2]/div/div/div[1]/div/div/div/div/div/div/div[1]/div/div/div[1]/div[4]/div")
pag.moveTo(600,500)
pag.scroll(-500)
sleep(2)
#установка видимого курсора над выбранным элементом
canvas_x_offset = browser.execute_script("return window.screenX + (window.outerWidth - window.innerWidth) / 2 - window.scrollX;")
canvas_y_offset = browser.execute_script("return window.screenY + (window.outerHeight - window.innerHeight) - window.scrollY;")
pag.moveTo (element[q].rect["x"] + canvas_x_offset + element[q].rect["width"] / 2,
element[q].rect["y"] + canvas_y_offset + element[q].rect["height"] / 2)
sleep(1)
pag.scroll(700)
sleep(2)
element[q].click()
sleep(2)
#обработка информации со СКАТа
#ищем открывшееся после клика окно с данными о ПДК
data = browser.find_element_by_xpath('//*[@id="map-107868-overlays"]/div[2]/div')
#перевожу полученные данные в текст
sensor_data = str(data.text)
sensor_data_string = sensor_data.splitlines()
#получаю название населенного пункта, дату и время
get_place_date_time (sensor_data_string[0])
save_screenshot(data_fileds['Место'])
btn_close = browser.find_element_by_class_name("v-window-closebox")
btn_close.click()
sleep(1)
browser.refresh()
except Exception as ex:
print ('Исключение: '+ str(ex))
browser.refresh()
browser.quit()