Политика и Python

Не пишу о политике из принципа, но тут просто обязан написать 🙂 Сегодня мы будем разбираться, как связаны политика и Python 🙂

Некоторые из читателей блога, уверен, знают, что совсем недавно новым президентом Украины стал Владимир Зеленский: актер, юморист, КВН-щик, и прочее-прочее-прочее.

Собственно, вопрос в следующем: спустя буквально три дня после начала деятельности нового президента на сайте электронных петиций появилась петиция за отставку Президента Украины Владимира Зеленского. А спустя несколько часов на этом же сайте появилась петиция об отмене петиции «За отставку Президента Украины Владимира Зеленского«. Стало интересно, какая же динамика прироста, и какие интересные моменты можно постараться высмотреть в процессе анализа данных голосований по обоим петициям. В силу этого был написан код:

  1. from datetime import datetime
  2. import time
  3. from pytz import timezone
  4. import requests
  5. from fake_useragent import UserAgent
  6. import re
  7. import ftplib
  8.  
  9. while True:
  10.     ukraine_time = timezone('Europe/Kiev')
  11.     ua_time = datetime.now(ukraine_time)
  12.     print('Ukraine time:', ua_time)
  13.     ua_time = str(ua_time)
  14.  
  15.     link = 'https://petition.president.gov.ua/petition/53360'
  16.     link2 = 'https://petition.president.gov.ua/petition/53988'
  17.     file = 'votes.txt'
  18.  
  19.     response = requests.get(link, headers={'User-Agent': UserAgent().chrome})
  20.     print(response)
  21.  
  22.     html = requests.get(link)
  23.     html = response.content
  24.  
  25.     html = str(html)
  26.  
  27.     regxp = '<span>\w+'
  28.     result_votes = re.findall(regxp, html)
  29.     result_votes = str(result_votes)
  30.     result_votes = result_votes.replace('\'', '').replace('<span>', '').replace('[', '').replace(']', '')
  31.  
  32.     response2 = requests.get(link2, headers={'User-Agent': UserAgent().chrome})
  33.     print(response2)
  34.  
  35.     html2 = requests.get(link2)
  36.     html2 = response2.content
  37.  
  38.     html2 = str(html2)
  39.  
  40.     regxp = '<span>\w+'
  41.     result_votes2 = re.findall(regxp, html2)
  42.     result_votes2 = str(result_votes2)
  43.     result_votes2 = result_votes2.replace('\'', '').replace('<span>', '').replace('[', '').replace(']', '')
  44.  
  45.     for_save = ua_time + '|' + result_votes + '|' + result_votes2
  46.     with open(file, 'a', encoding='utf-8') as f:
  47.         f.write(for_save + '\n')
  48.  
  49.     print(ua_time, ':', result_votes, ':', result_votes2)
  50.  
  51.     print('Загружаем файл на FTP\n')
  52.     host = '************'
  53.     ftp_user = '************'
  54.     ftp_password = '************'
  55.  
  56.     print('Попытка соединения с FTP-сервером', host)
  57.     print('Login:', ftp_user)
  58.     print('Password:', ftp_password)
  59.     ftp = ftplib.FTP(host, ftp_user, ftp_password)
  60.     ftp_path = '//public_html//wp-content//uploads//2019//05'
  61.     ftp.cwd(ftp_path)
  62.  
  63.     file = 'votes.txt'
  64.     print('Загружаем файл:', file)
  65.     file_to_upload = open(file, 'rb')
  66.     ftp.storbinary('STOR ' + file, file_to_upload)
  67.     print('Файл', file, 'успешно загружен на FTP-сервер\n \n *******************************')
  68.     ftp.close()
  69.  
  70.     time.sleep(60)

который собирает с промежутком в одну минуту данные о количестве проголосовавших по каждой из петиций, причем делается это с меткой времени — что бы в последствии было легче обработать всю информацию 🙂 а еще выбрасывает полученные данные сюда — кому интересно, смотрите, анализируйте.

К сожалению, я допустил ряд ошибок, потому получаемые данные до отметки в 2019-05-27 20:09:36.013890+03:00|59962|25722 дублируются, и валятся кучей (я, оказывается, параллельно два процесса запустил, которые дублировали друг друга) 🙁

На этом все… позднее будем разбираться, как можно проанализировать полученные данные.
И да — в случае возникновения вопросов пишите на почту, или в Telegram.

UPD от 29 мая:
Собственно, сбор данных прекращен, потому что одна петиция уже считается запущенной в работу, и голосовать за нее нельзя.

Но после поверхностного просмотра полученных данных с помощью Open Office 😉 (да, я только разбираюсь, как рисовать графики в Python) — стала видна вот эта ступенька:
2019-05-26 23:29:54.850707+03:00 56855 24485
2019-05-26 23:30:10.889093+03:00 56855 24486
2019-05-26 23:30:56.264171+03:00 58805 24486
2019-05-26 23:31:12.411597+03:00 58805 24487
Может у кого-то есть соображения, как за минуту под одной петицией могут добавиться почти 2000 голосов?