plusmorozov

plusmorozov

t.me/dvoryanskaya_zhizn наш канал о пчелах и деревне Ты видишь? Тоска нелечимая Стоит у меня за спиной. Уедем в деревню, любимая, Уедем дышать тишиной.
На Пикабу
Дата рождения: 4 ноября
в топе авторов на 360 месте
73К рейтинг 863 подписчика 9 подписок 175 постов 142 в горячем
290

Сорнякам тут не место

В этом году всё-таки нашел время для засеивания газона на ещё одном участке сада. Сорняки перед посадкой не травлю, перепахиваю мотоблоком участок, выравниваю, засеиваю, прохожусь граблями для заглубления семян, притаптываю, ежедневно поливаю.

Сорнякам тут не место Газон, Трава, Сад, Деревня, Сельская жизнь, Длиннопост
Сорнякам тут не место Газон, Трава, Сад, Деревня, Сельская жизнь, Длиннопост
Сорнякам тут не место Газон, Трава, Сад, Деревня, Сельская жизнь, Длиннопост
Сорнякам тут не место Газон, Трава, Сад, Деревня, Сельская жизнь, Длиннопост
Сорнякам тут не место Газон, Трава, Сад, Деревня, Сельская жизнь, Длиннопост
Сорнякам тут не место Газон, Трава, Сад, Деревня, Сельская жизнь, Длиннопост
Сорнякам тут не место Газон, Трава, Сад, Деревня, Сельская жизнь, Длиннопост

А этот газон посеял 2 года назад

Сорнякам тут не место Газон, Трава, Сад, Деревня, Сельская жизнь, Длиннопост
Сорнякам тут не место Газон, Трава, Сад, Деревня, Сельская жизнь, Длиннопост

Семена были такие

Сорнякам тут не место Газон, Трава, Сад, Деревня, Сельская жизнь, Длиннопост
Показать полностью 10
21

Электронаващиватель рамок из трансформатора от Smart UPS 1000

Электронаващиватель рамок из трансформатора от Smart UPS 1000 Пасека, Пчеловодство, Лазерная резка, Пчелы, Деревня, Сельская жизнь, Сельское хозяйство, Видео

Макет корпуса лежит здесь: https://cloud.mail.ru/public/AQ7H/mYfkcU1bP

Показать полностью 1
28

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

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

Нужны рекомендации по парсингу сайта экологического мониторинга Программирование, Python, Selenium, Экология, Гражданская позиция, Длиннопост

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

Показать полностью
156

Приспособа для метки маток

Почему маркер белый, а не в цвет года? Потому что у меня небольшая пасека и на каждую матку ведётся личное дело, в котором записан год рождения🙂 Так что метка маток на моей пасеке - удобство при осмотре, а не информация о возрасте.

Макет для лазерной резки лежит здесь: https://cloud.mail.ru/public/k1ja/3aMS2fiy9

Резал из фанеры толщиной 3 мм, первый вариант сделал из 6 мм - неудачно, слишком высоко, матка не фиксировалась.

Показать полностью
Отличная работа, все прочитано!