28

Нужны рекомендации по парсингу сайта экологического мониторинга

На территории соседнего поселка действуют два нефтеналивных терминала, которые изрядно портят жизнь местным жителям регулярными выбросами сероводорода в атмосферу.

Нужны рекомендации по парсингу сайта экологического мониторинга

Местные активисты добились установки двух стационарных постов системы контроля атмосферного воздуха (СКАТ). Эти самые СКАТы периодически фиксируют превышения предельно допустимой концентрации (ПДК) сероводорода и диоксида серы в воздухе. Информация о текущем состоянии воздуха со СКАТов выводится в единую систему экологического мониторинга области (ЕСЭМ) 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()

Лига программистов

2.1K поста11.9K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества