Skip to content

Instantly share code, notes, and snippets.

@ischurov
Created August 8, 2017 20:53
Show Gist options
  • Save ischurov/773a464801ba15a52aea02c9d227a135 to your computer and use it in GitHub Desktop.
Save ischurov/773a464801ba15a52aea02c9d227a135 to your computer and use it in GitHub Desktop.
district_to_district
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "Скрипт, считывающий информацию из системы ГАС-Выборы и формирующий табличку, связывающую УИКи и избирательные округа на муниципальных выборах.\n\nАвтор: Илья Щуров.\n\nЛицензия: MIT.\n"
},
{
"metadata": {
"trusted": true,
"collapsed": true
},
"cell_type": "code",
"source": "from selenium.webdriver import Chrome\nfrom selenium.webdriver.support.ui import Select\nfrom selenium.webdriver.common.action_chains import ActionChains\nfrom time import sleep\nimport re\nimport pandas as pd",
"execution_count": 64,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "browser = Chrome()\naction_chains = ActionChains(browser)",
"execution_count": 48,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "entrypoint = \"http://www.moscow_city.vybory.izbirkom.ru/region/moscow_city\"\nbrowser.get(entrypoint)\nelection_names = [link.text \n for link in (browser.\n find_elements_by_css_selector(\".vibLink\"))]\nelections = {}\nfor election_name in election_names:\n district_to_ps = {}\n elections[election_name] = district_to_ps\n\n browser.get(entrypoint)\n election_link = browser.find_element_by_link_text(election_name)\n \n # see https://stackoverflow.com/a/19763087/3025981\n (ActionChains(browser).\n move_to_element(election_link).\n click().\n perform())\n \n sleep(1)\n \n district_select = Select(browser.find_element_by_name(\"gs\"))\n districts = [opt.text \n for opt in district_select.options[1:]]\n \n for district in districts:\n district_select = Select(browser.find_element_by_name(\"gs\"))\n district_select.select_by_visible_text(district)\n browser.find_element_by_name(\"go\").click()\n sleep(1)\n polling_station_select = Select(browser.find_element_by_name(\"gs\"))\n polling_stations = [opt.text \n for opt in polling_station_select.options[1:]]\n district_to_ps[district] = polling_stations\n browser.back()\n",
"execution_count": 51,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "table = []\nspecial_cases = ['Строгино', 'Троицк']\nfor election, districts in elections.items():\n municipal_district = re.sub(\n \"Выборы депутатов Совета депутатов муниципального округа \", \"\",\n election)\n for special_case in special_cases:\n if special_case in municipal_district:\n municipal_district = special_case\n municipal_district = re.sub(\" +в городе Москве\", \"\", municipal_district)\n for district, pss in districts.items():\n m = re.match(r\"(\\d+) (Много|Пяти)мандат?ный №( ?)\\1\", district)\n district_num = m.group(1) \n \n for ps in pss:\n m = re.match(r\"(\\d+) УИК №\\1\", ps)\n ps_num = m.group(1)\n table.append([municipal_district, district_num, ps_num])",
"execution_count": 104,
"outputs": []
},
{
"metadata": {
"trusted": true,
"collapsed": true
},
"cell_type": "code",
"source": "df = pd.DataFrame(table, columns=['municipal_district', 'voting_district', \n 'polling_station'])",
"execution_count": 105,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "(df.\n sort_values([\"municipal_district\", \"polling_station\"]).\n set_index(\"polling_station\", drop=False).\n to_csv(\"district_to_district.csv\", index=False))",
"execution_count": 106,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# проверка, что названия муниципальных округов «хорошие»\nset(df['municipal_district'].values)",
"execution_count": 108,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 108,
"data": {
"text/plain": "{'Академический',\n 'Алексеевский',\n 'Алтуфьевский',\n 'Арбат',\n 'Аэропорт',\n 'Бабушкинский',\n 'Басманный',\n 'Беговой',\n 'Бескудниковский',\n 'Бибирево',\n 'Бирюлево Восточное',\n 'Бирюлево Западное',\n 'Богородское',\n 'Братеево',\n 'Бутырский',\n 'Вешняки',\n 'Внуково',\n 'Войковский',\n 'Восточное Дегунино',\n 'Восточное Измайлово',\n 'Восточный',\n 'Выхино-Жулебино',\n 'Гагаринский',\n 'Головинский',\n 'Гольяново',\n 'Даниловский',\n 'Дмитровский',\n 'Донской',\n 'Дорогомилово',\n 'Замоскворечье',\n 'Западное Дегунино',\n 'Зюзино',\n 'Зябликово',\n 'Ивановское',\n 'Измайлово',\n 'Капотня',\n 'Коньково',\n 'Коптево',\n 'Косино-Ухтомский',\n 'Котловка',\n 'Красносельский',\n 'Крылатское',\n 'Крюково',\n 'Кузьминки',\n 'Кунцево',\n 'Куркино',\n 'Левобережный',\n 'Лефортово',\n 'Лианозово',\n 'Ломоносовский',\n 'Лосиноостровский',\n 'Люблино',\n 'Марфино',\n 'Марьина роща',\n 'Марьино',\n 'Матушкино',\n 'Метрогородок',\n 'Мещанский',\n 'Митино',\n 'Можайский',\n 'Молжаниновский',\n 'Москворечье-Сабурово',\n 'Нагатино-Садовники',\n 'Нагатинский затон',\n 'Нагорный',\n 'Некрасовка',\n 'Нижегородский',\n 'Ново-Переделкино',\n 'Новогиреево',\n 'Новокосино',\n 'Обручевский',\n 'Орехово-Борисово Северное',\n 'Орехово-Борисово Южное',\n 'Останкинский',\n 'Отрадное',\n 'Очаково-Матвеевское',\n 'Перово',\n 'Печатники',\n 'Покровское-Стрешнево',\n 'Преображенское',\n 'Пресненский',\n 'Проспект Вернадского',\n 'Раменки',\n 'Ростокино',\n 'Рязанский',\n 'Савелки',\n 'Савеловский',\n 'Свиблово',\n 'Северное Бутово',\n 'Северное Измайлово',\n 'Северное Медведково',\n 'Северное Тушино',\n 'Северный',\n 'Силино',\n 'Сокол',\n 'Соколиная гора',\n 'Сокольники',\n 'Солнцево',\n 'Старое Крюково',\n 'Строгино',\n 'Таганский',\n 'Тверской',\n 'Текстильщики',\n 'Теплый Стан',\n 'Тимирязевский',\n 'Троицк',\n 'Тропарево-Никулино',\n 'Фили-Давыдково',\n 'Филёвский парк',\n 'Хамовники',\n 'Ховрино',\n 'Хорошево-Мневники',\n 'Хорошевский',\n 'Царицыно',\n 'Черемушки',\n 'Чертаново Северное',\n 'Чертаново Центральное',\n 'Чертаново Южное',\n 'Южное Бутово',\n 'Южное Медведково',\n 'Южное Тушино',\n 'Южнопортовый',\n 'Якиманка',\n 'Ярославский',\n 'Ясенево'}"
},
"metadata": {}
}
]
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.6.1",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"gist": {
"id": "",
"data": {
"description": "district_to_district",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment