Smart VotingWebサむトずCECWebサむトの新しいAPIの解析

画像



2020幎9月13日、ロシアで1回の投祚日が開催されたした。䞀郚の地域では、野党は「スマヌト投祚」戊略を䜿甚しおおり、野党志向の有暩者は、圓局の代衚を打ち負かす可胜性が最も高い単䞀の候補者に投祚したす。



2幎連続で「スマヌト投祚」の候補者を遞ぶ過皋で、その透明性をテヌマに議論が亀わされたした。さらに、私は、独立したアナリストが盎面する可胜性のある戊略を芁玄するこずの難しさに個人的に混乱しおいたす。UMGの䞻催者は、戊略の詳现な結果を公衚しおいたせんが、地方議䌚に参加した野党候補者の数を瀺す図のみを公衚しおいたす。



䞊の「スマヌト投祚」のサむトたずえば、垂や地区を指定しおも、サポヌトされおいる候補のリストを取埗するこずはできたせん。誰かがその地域のデヌタを収集したい堎合、圌は各地区の䜏所を遞択するずいう単調な䜜業をしなければなりたせん。



UMG Webサむトの開発者を非難するこずはありたせん。投祚戊略を実装するために、必芁なすべおの機胜が備わっおいたす。しかし、2019幎には、UMGの結果に関する詳现なデヌタの収集ず公開に誰も関䞎しおいなかったためモスクワの遞挙以倖、これらの遞挙では、私が䞻導暩を握るこずにしたした。



結果は、次のような芁玄テヌブルです。この蚘事では、特定のデヌタセットがどのように取埗されたか、スマヌト投祚サむトおよび新しいCECWebサヌビスから情報がどのように収集されたかに぀いお説明したす。



画像



スマヌト投祚サむト



たず、SmartVotingサむトから抜出できるデヌタを芋おみたしょう。サむトのメむンペヌゞには、ナヌザヌの登録アドレスを入力するためのフィヌルドがありたす。文字列を入力するず、提案されたアドレスのリストが次の圢匏で衚瀺されたす。



画像




提案されたアドレスの1぀を遞択するず、遞択したアドレスが添付されおいるポヌリングステヌションのペヌゞに移動したす。



画像


このペヌゞには、この地域で行われる遞挙キャンペヌンが䞀芧衚瀺されたす。キャンペヌンごずに、投祚を提案された候補者/反察者のリストがありたす。



画像


この堎合、UMGが野党候補を瀺さなかった知事の遞挙が芋られたす。これは、知事の遞挙が2回のラりンドで行われ、投祚者が最初のラりンドでどちらの野党候補に投祚するかは問題ではないずいう事実によるものです。

たた、䞀床に3人の候補者が出お、垂議䌚の遞挙で投祚するように提案されおいたす。これは、゜チでの遞挙には耇数のメンバヌからなる構成員がいるずいう事実によるものです。

今幎UMGに関䞎した他のすべおの遞挙キャンペヌンでは、単䞀メンバヌの構成員しかいたせんでした。



ペヌゞコヌドを芋お、説明されおいるすべおのデヌタが䟿利なJSON圢匏で収集されおいるこずを確認したしょう。id = "__NEXT_DATA__"の芁玠内、ペヌゞの描画に䜿甚されたす。ポヌリングステヌション、察応する遞挙キャンペヌン、および候補者に関する情報がありたす。



__NEXT_DATA__芁玠の内容
{
   "props":{
      "pageProps":{
         "id":"440384",
         "settings":{
            "id":1,
            "share_photo":"/ganimed-media/share_photo/smartvote_sharepic_1200x628.jpg",
            "video_on_main_page":"https://youtu.be/w8gapDGwWMY",
            "fake_mode":false,
            "title_share":",    ",
            "text_share":" ,      —    « ».   — .",
            "telegram_bot_link":"https://tlinks.run/smartvotebot",
            "viber_bot_link":"viber://public?id=smartvote",
            "facebook_bot_link":"https://facebook.com/umnoegolosovanie/",
            "alice_link":null,
            "vk_bot_link":null
         },
         "serverData":{
            "commission":{
               "id":440384,
               "number":"4317",
               "address":"354340,  ,  ,  ,   , 24",
               "descr":"   № 49 . .. ",
               "lat":"43.425923",
               "lon":"39.920152",
               "region_id":26,
               "region_intid":"135637827259064320000372513"
            },
            "campaigns":[
               {
                  "id":26,
                  "code":"krasnodar-gub-2020",
                  "title":"   ",
                  "is_regional":true,
                  "ready_date":null,
                  "district":{
                     "id":458,
                     "code":"oik-0",
                     "name":"0",
                     "leaflet":""
                  },
                  "candidates":[
                     {
                        "id":998,
                        "name":"  ",
                        "share_image":"/elections-api-media/share/26/998.png",
                        "anticandidate":true,
                        "self_nominated":false,
                        "has_won":false,
                        "has_second_round":false,
                        "party":{
                           "title":" ",
                           "antiparty":true
                        }
                     }
                  ]
               },
               {
                  "id":28,
                  "code":"krasnodar-sochi-gorduma-2020",
                  "title":"    ",
                  "is_regional":false,
                  "ready_date":null,
                  "district":{
                     "id":526,
                     "code":"oik-2",
                     "name":"2",
                     "leaflet":"/elections-api-media/28/526-1334-1335-5385.pdf"
                  },
                  "candidates":[
                     {
                        "id":1334,
                        "name":"  ",
                        "share_image":"/elections-api-media/share/28/1334.png",
                        "anticandidate":false,
                        "self_nominated":true,
                        "has_won":false,
                        "has_second_round":false,
                        "party":null
                     },
                     {
                        "id":1335,
                        "name":"  ",
                        "share_image":"/elections-api-media/share/28/1335.png",
                        "anticandidate":false,
                        "self_nominated":true,
                        "has_won":false,
                        "has_second_round":false,
                        "party":null
                     },
                     {
                        "id":5385,
                        "name":"  ",
                        "share_image":"/elections-api-media/share/28/5385.png",
                        "anticandidate":false,
                        "self_nominated":false,
                        "has_won":false,
                        "has_second_round":false,
                        "party":{
                           "title":"",
                           "antiparty":false
                        }
                     }
                  ]
               }
            ]
         },
         "error":null,
         "currentUrl":"https://votesmart.appspot.com/candidates/440384"
      }
   },
   "page":"/candidates/[id]",
   "query":{
      "id":"440384"
   },
   "buildId":"U8hjaoxZw8TINu-DU_Ixw",
   "runtimeConfig":{
      "HOST":"https://votesmart.appspot.com"
   },
   "isFallback":false,
   "customServer":true,
   "gip":true
}




ポヌリングステヌションの堎合、察応するPECの番号番号ずその識別子がUMGWebサむトのデヌタベヌスに衚瀺されたす。Id = 440834は、ペヌゞのURLにある番号/候補/ 440834ず䞀臎したす。 PEC番​​号ず地域を知っおいるので、UMG WebサむトでコミッションIDを蚈算できたすか識別子が非垞に無秩序に分垃しおいるため、明らかな䟝存関係を芋぀けるこずができたせんでした Sochi、PEC4512-> id = 440834 Sochi、PEC4513-> id = 441403 Sochi、PEC4514-> id = 1781216 数字の反射のリストを収集する方法IDペヌゞのPEC 1から2,000,000たでのすべおの皮類の識別子を繰り返しおチェックするのは非垞に非効率に聞こえたすが、これらの識別子のほずんどは機胜しおいたせん。

















ただし、䜏所のリストがあれば、関連するポヌリングステヌションのリストを比范的簡単にたずめるこずができたす。初期画面で文字列を入力するず、適切なアドレスのリストが、察応するコミッション識別子ずずもにサヌバヌから返さ



れたす。アドレスでサむトを怜玢する



https://votesmart.appspot.com/api/v1/cik/addresses?query=ADDRESS


  • ADDRESS-アドレス。できれば「件名、郜垂、通り、家」の圢匏で。サヌバヌ䞊のパヌサヌはそれらをうたく凊理しないため、「street」、「d。」ずいう省略圢がないこずも望たしいです。


リク゚ストの䟋https



//votesmart.appspot.com/api/v1/cik/addressesquery = Lenin's Smolensk



ク゚リ結果
{
   "suggestions":[
      {
         "value":" ,  ,  ,  ",
         "data":{
            "fullname":" ,  ,  ,  ",
            "level":"7",
            "region_id":69,
            "commission_id":null,
            "intid":"138474570115456000000347353",
            "path":"135637827259064320000359815,135637827259064320000359819,135637827259064320000359820,138474570115456000000347353",
            "snippet":" ,  <em></em>,  , <em></em> ",
            "score":118.84238
         }
      },
      {
         "value":" ,  ,  ,  , 12",
         "data":{
            "fullname":" ,  ,  ,  , 12",
            "level":"8",
            "region_id":69,
            "commission_id":1124357,
            "intid":"135659820348349440000359937",
            "path":"135637827259064320000359815,135637827259064320000359819,135637827259064320000359822,135659820348349440000359708,135659820348349440000359937",
            "snippet":" ,  <em></em>,  , <em></em> , 12",
            "score":115.14931
         }
      },
...
   ]
}




サむトからデヌタを抜出するためのアドレスのリストはどこで入手できたすか囜内のすべおの䜏所のデヌタベヌスを列挙するこずは、効果のない解決策のようです。問題を解決するには、構成員ごずに1぀の䜏所しか必芁ないためです。



各構成員には、平均しお2〜8の地区がありたす。ポヌリングステヌションのアドレスが所属する構成員ず䞀臎しない堎合がありたすが、UMG WebサむトのPECアドレスを調べるこずで、各構成員に関する情報を収集できるずいう仮説を立おたす。



その埌、この仮説を䜿甚しお、ほがすべおの構成員に関する情報を収集するこずができたした。遞挙委員䌚のデヌタベヌスの䜏所圢匏は異質であるため、1100の構成員のうち10の䜏所のみを手動で遞択する必芁がありたした。



むンタヌネットでは、定期的に曎新されるロシア連邊の遞挙委員䌚のデヌタベヌスを芋぀けるこずができたす。このデヌタベヌスには、䜏所やPECの構成に関する情報が含たれおいたす。しかし、デヌタの関連性ず信頌性を高めるためにたた、特定のフィヌルドの圢匏に満足できなかったため、アドレスのリストを自分で収集するこずにしたした。これは、CECWebサむトに必芁なすべおの機胜があるためです。



新しいCECWebサヌビス。APIメ゜ッド



GAS「Vybory」は1995幎に開発された自動システムで、ロシア連邊での遞挙ずレファレンダムの準備ず実斜を目的ずしおいたす。



遞挙キャンペヌンの過皋に興味を持ったこずがある堎合は、おそらくこのサむトに出くわしたこずでしょう。このサむトでは、遞挙結果が承認される前であっおも、投祚数など、GAS「Vybory」システムからの基本情報が公開され



画像



おいたす。以前の堎合は、遞挙結果を取埗するために、デヌタマむナヌこのサむトを利甚しお、憲法改正投祚の最䞭に、突然、サむトにキャプチャが珟れたした。 Captchaは非垞に氞続的であり、サむトの各ペヌゞに移動するず衚瀺されたす。



画像


あなた自身が芖芚的に評䟡できるように、captchaはもちろん非垞に単玔であり、確かに誰かがそれを回避する方法をすでに芋぀けおいたす。機械孊習を行う代わりに、CEC Webサむトの新しいセクションに目を向けたした。これは、ただほずんど知られおいないものです。デゞタルサヌビス



画像



このセクションは、修正の投祚䞭に衚瀺され、HTTP経由でいく぀かのWebサヌビスが含たれおいたす。リク゚ストは内郚APIず通信しお、GAS「Vybory」システムからデヌタを受信したす。 Habrナヌザヌはすでにこの機胜に泚意を払っおいたす。もっず詳しく考えおみたしょう。



以䞋は、このプロゞェクトで䜿甚された新しいAPIの䞻な芁求の説明です。



システム内の各デヌタ構造には、VRNキヌが含たれおいたす。-サむト、キャンペヌン、地区、候補者など、オブゞェクトの䞀意の識別子。




PEC情報



http://cikrf.ru/iservices/voter-services/committee/subjcode/SUBJECT_CODE/num/COMMITTEE_NUM




リク゚ストの䟋http



//cikrf.ru/iservices/voter-services/committee/subjcode/ 01 / num / 2



ク゚リ結果
{
   "vrn":"4014001117979",
   "name":"   №2",
   "subjCode":"01",
   "numKsa":"01T001",
   "vid":"5",
   "address":{
      "address":"385200,  ,   ,  ,   .., 16",
      "descr":"  №1",
      "phone":"8-87772-9-23-72",
      "lat":"44.882893",
      "lon":"39.187187"
   },
   "votingAddress":{
      "address":"385200,  ,   ,  ,   .., 16",
      "descr":"  №1",
      "phone":"8-87772-9-23-72",
      "lat":"44.882893",
      "lon":"39.187187"
   }
}







サむトでの遞挙キャンペヌンに関する情報



http://cikrf.ru/iservices/voter-services/vibory/committee/COMMITTEE_VRN


  • COMMITTEE_VRN -PEC識別子


リク゚ストの䟋



http//cikrf.ru/iservices/voter-services/vibory/committee/ 4544028162533



ク゚リ結果
[
   {
      "vrn":"100100163596966",
      "date":"2020-07-01",
      "name":"         ",
      "subjCode":"0",
      "pronetvd":null,
      "vidvibref":"0"
   },
   {
      "vrn":"25420001876696",
      "date":"2020-09-13",
      "name":"       ",
      "subjCode":"54",
      "pronetvd":"0",
      "vidvibref":"2"
   },
   {
      "vrn":"4544220183446",
      "date":"2020-09-13",
      "name":"        ",
      "subjCode":"54",
      "pronetvd":null,
      "vidvibref":"2"
   }
]





遞挙区のリスト



http://cikrf.ru/iservices/sgo-visual-rest/vibory/CAMPAIGN_VRN/tvd


  • CAMPAIGN_VRN-キャンペヌンID


リク゚ストの䟋



http//cikrf.ru/iservices/sgo-visual-rest/vibory/ 457422069597 / tvd



ク゚リ結果
{
   "_embedded":{
      "tvdDtoList":[
         {
            "vrn":457422069601,
            "namtvd":"    ",
            "namik":"    ",
            "numtvd":"0",
            "vidtvd":"ROOT",
            "_links":{
               "results":{
                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/results/457422069601/proportion"
               }
            }
         },
         {
            "vrn":457422069602,
            "namik":"   № 1",
            "numtvd":"1",
            "vidtvd":"OIK",
            "_links":{
               "results":{
                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/results/457422069602/major"
               }
            }
         },
         ...
      ]
   },
   "_links":{
      "self":{
         "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/457422069597/tvd"
      }
   }
}




NUMTVDは郡番号です。ナンバヌれロは通垞、単䞀の地区の結果に責任がありたす。たずえば、遞挙が混合システムの䞋で行われる堎合、「れロ構成員」は比䟋システムの䞋で投祚する責任がありたす。残りの構成員は、シングルメンバヌたたはマルチメンバヌです。



ご芧のずおり、デヌタ構造には、遞挙結果を確認するために䜿甚できるリンクも含たれおいたす。リンクは、投祚結果が公開される前でも生成されたす。






遞挙運動に参加する候補者のリスト



http://cikrf.ru/iservices/sgo-visual-rest/vibory/CAMPAIGN_VRN/candidates/?page=PAGE_NUM&numokr=NUMTVD


  • CAMPAIGN_VRN-キャンペヌンID
  • PAGE_NUM-リストペヌゞ番号
  • NUMTVD-郡番号オプション


リク゚ストの䟋



http//cikrf.ru/iservices/sgo-visual-rest/vibory/ 4674220125616 /候補者/ペヌゞ= 1numokr = 11



ク゚リ結果
{
   "_embedded":{
      "candidateDtoList":[
         ...
         {
            "index":50,
            "vrn":4674020270868,
            "fio":"  ",
            "datroj":"23.04.1964 00:00:00",
            "vidvig":"",
            "registr":"",
            "vrnio":4674220132098,
            "namio":"    \"     \"   ",
            "numokr":11,
            "tekstat2":"1",
            "_links":{
               "self":{
                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates/4674020270868"
               }
            }
         },
         {
            "index":56,
            "vrn":4674020269642,
            "fio":"  ",
            "datroj":"15.02.1986 00:00:00",
            "vidvig":"",
            "registr":"  ",
            "namio":"",
            "numokr":11,
            "tekstat2":"1",
            "_links":{
               "self":{
                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates/4674020269642"
               }
            }
         },
         {
            "index":105,
            "vrn":4674020271181,
            "fio":"  ",
            "datroj":"15.07.1994 00:00:00",
            "vidvig":"",
            "registr":"",
            "vrnio":4674220134054,
            "namio":"     \"   \"",
            "numokr":11,
            "tekstat2":"1",
            "_links":{
               "self":{
                  "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates/4674020271181"
               }
            }
         },
         ...
         
      ]
   },
   "_links":{
      "self":{
         "href":"http://cikrf.ru/iservices/sgo-visual-rest/vibory/4674220125616/candidates?page=1&numokr=11"
      }
   },
   "page":{
      "size":20,
      "totalElements":9,
      "totalPages":1,
      "number":1
   }
}




ペヌゞ 構造にはペヌゞの総数が含たれおおり、最埌のペヌゞに到達したずきたたはサヌバヌから返された空のリストによっおを刀別するために䜿甚できたす。






APIには、䞻に遞挙/候補者に関する詳现情報を芋぀けるための他のメ゜ッドが含たれおいたす。必芁に応じお、必芁なリク゚ストを簡単に远跡できたす。これで、デヌタのアップロヌドを開始できたす。



CECWebサむトからデヌタをダりンロヌドする



必芁なデヌタのダりンロヌドを開始する前に、プロゞェクトで䜿甚する遞挙キャンペヌンのリストを䜜成する必芁がありたした。事実、「スマヌト投祚」はどこでも行われたのではなく、遞挙で行われたした。

— ,

— ,

— ( 200 )

( 4 ).

//


これらのデヌタの重芁性がないため、私は州の公爵ぞの副遞挙を無芖するこずにしたした。遞挙日のりィキペディアの蚘事は、倧郜垂での遞挙をリストしただけなので、地方議䌚ぞの遞挙のリストをたずめるのに圹立ちたした。



友人必芁な手䜜業を行うこずでこのプロゞェクトの実装を手䌝っおくれたに目を向けるず、叀兞的なCEC Webサむトのメむンペヌゞから、それぞれの遞挙キャンペヌンのURLのリストを䜜成するように䟝頌したした。実際のずころ、URLには、さらに解析するために必芁な地域ずキャンペヌンの識別子が含たれおいたす。



vybory.izbirkom.ru/region/izbirkom?action=show&vrn=21120001136916&
region=11&prver=1&pronetvd=1


その結果、リストは43の遞挙キャンペヌンで構成されたした。合蚈で、9000以䞊の個別の遞挙キャンペヌンが、さたざたなレベルの団䜓に察しお単䞀遞挙日に開催されたした。



これで、遞択肢のリストず前述のAPIメ゜ッドが手元にあるので、デヌタを簡単にダりンロヌドできたした。pythonスクリプトを䜜成し、requestsモゞュヌルを䜿甚しお定期的にリク゚ストを行った埌、候補者ずポヌリングステヌションに関するデヌタを元のJSON圢匏で保存したした。



ポヌリングステヌションに関する情報をダりンロヌドする際に考慮すべき䞻なこずサヌバヌが空の倀を返すたで、1から始たるすべおの可胜な数倀を調べるだけでは十分ではありたせん。実際には、リヌゞョン内のPECの番号付けは䞭断される可胜性があり、たずえば、次の圢匏になりたす

。...1001-1016、1101-1136、1138 .. ..

たたは

0-700、900-1002、1004 ...

リヌゞョン内の最倧PEC番号を決定し、䞍芁な芁求を行わないようにするために、次のようにデヌタを収集したした。最初の1000番号のデヌタをアップロヌドしおから、iかどうかを確認したした。+ 1、i + 5、i + 100、i + 500、i + 1000の番号は、任意のPECに察応したすこの堎合、ダりンロヌドを続行したす。



たた、境内のデヌタをダりンロヌドしたPEC番号を保持するこずをお勧めしたす。事実、返されるデヌタにはPEC番号は含たれおいたせんが、「遞挙区遞挙委員䌚第100号」ずいう圢匏の名前のみが含たれおいたす。埌で察凊しなければならなかった元のPEC番号を取埗するプロセスは、短期的なバグずフラストレヌションに぀ながりたした。結局のずころ、䞀郚の地域のPECの名前の番号付けは、異なる圢匏になっおいたす。



たずえば、Udmurtiaでは、PECの名前には次の番号が付けられおいたした「№1/ 01、№1/ 02、№1/ 03」、リペツク地域では「№01-01、№01-02、№01-03」。オレンブルク地域で、私は本圓に゚キゟチックなものに出くわしたした。それは、倚くの遞挙委員䌚が誰かにちなんで名付けられた唯䞀の地域でした。たずえば、「プストビトフ兄匟」にちなんで名付けられた遞挙区遞挙委員䌚第1696号



「スマヌト投祚」のサむトからデヌタをダりンロヌドする



次に、収集されたPECアドレスごずに、UMGWebサむトから投祚デヌタをダりンロヌドしたす。その前に、いく぀かの機胜を怜蚎する䟡倀がありたすプロセスで孊習したした。



たず、CECデヌタベヌスのアドレスの圢匏が異なるこずを考慮する必芁がありたす。これは、地域の特定の地域でさえも可胜です。 「SmartVoting」のサむトでは、このようなク゚リのアドレス怜玢にたったく察応できなかったため、「d。」、「G。」、「st。」ずいう略語を削陀する必芁がありたした。たた、䜏所から郵䟿番号を削陀するこずをお勧めしたす。たた、時々遭遇する接頭蟞「ロシア連邊」も削陀するこずをお勧めしたす。



次に、UMG WebサむトはDDoS攻撃に察しお匷力な保護を備えおおり、0.3秒間隔で100件のリク゚ストを行った堎合でも、IPは犁止されたす。有料のプロキシのセットを䜿甚するこずは可胜ですが、個人的には、無料のプロキシず、自分のIPおよびサヌドパヌティのIPからの代替リク゚ストを䜿甚したした。犁止されないように、リク゚ストの間隔は玄0.7秒でした。その結果、すべおのデヌタのダりンロヌドに玄1日かかりたした。



最初の章のク゚リを䜿甚するず、アルゎリズムは次のようになりたす。



  1. PECアドレスのフォヌマット
  2. 適切な䜏所のリストをリク゚ストしたす
  3. サむトペヌゞIDを含むリストを取埗したす
  4. この識別子でサむトに関するデヌタをすでにダりンロヌドしおいるかどうかを確認したす
  5. この識別子のサむトのHTMLペヌゞをロヌドしたす
  6. 芁玠「__NEXT_DATA__」を抜出し、デヌタをJSON圢匏で保存したす


このペヌゞは、beautifulsoup4ラむブラリを䜿甚しお解析されたした。



このプロセスは完璧ではありたせん。通垞、スクリプトはWebサむト䞊の地域で、たたは1぀のPECのアドレスで、たったく異なるPECに関する情報を芋぀ける12のポヌリングステヌションを芋぀けたせん。



これは問題ではありたせん。地区ごずに、サむトで察応するペヌゞを少なくずも1぀芋぀ける必芁があるからです。



デヌタの完党性を怜蚌するために、UMGサむトからダりンロヌドしたデヌタセットに各構成員に関する情報が含たれおいるかどうかを確認する簡単なスクリプトを䜜成したす。䞍足しおいるものがある堎合は、デヌタセットを手動で補充したす。繰り返しになりたすが、1,100の地区のうち、そのような䟋倖的な状況は10未満でした。



UMGずCECのWebサむトからのデヌタを組み合わせる



この段階で、地区ごずの各候補者に関する情報候補者ID、氏名、パヌティヌ、UMGによっおサポヌトされおいるかどうかに関する情報を含むタグを含む䟿利なデヌタ構造を収集したす。



収集された候補デヌタセットの䟋
{
    "33": [
        {
            "name": "  ",
            "vrn": 4444032121758,
            "birthdate": "05.05.1958 00:00:00",
            "party": "",
            "smart_vote": 0
        },
        {
            "name": "  ",
            "vrn": 4444032122449,
            "birthdate": "16.11.1977 00:00:00",
            "party": "",
            "smart_vote": 0
        },
        {
            "name": "  ",
            "vrn": 4444032122782,
            "birthdate": "27.02.1996 00:00:00",
            "party": "",
            "smart_vote": 0
        },
        {
            "name": "  ",
            "vrn": 4444032123815,
            "birthdate": "20.11.1991 00:00:00",
            "party": "",
            "smart_vote": 1
        },
        {
            "name": "  ",
            "vrn": 4444032124060,
            "birthdate": "21.07.1996 00:00:00",
            "party": "",
            "smart_vote": 0
        },
        {
            "name": "  ",
            "vrn": 4444032123597,
            "birthdate": "21.05.1974 00:00:00",
            "party": "",
            "smart_vote": 0
        }
    ],
    ...
}




アルゎリズムはかなり単玔です。



  1. UMG Webサむトのデヌタ配列に基づいお、各地区でサポヌトされおいる候補者のリストを䜜成したす
  2. CEC Webサむトのデヌタ配列を䜿甚しお、各構成員の承認された候補者のフィルタリングされたリストを䜜成したす
  3. 各地区では、フルネヌムで、察応候補-UMG-候補-CECを蚈算したす


もちろん、そのような単玔なアルゎリズムは、倚くの朜圚的な問題の状況を説明する必芁がありたす。



たず、1぀の構成員に、たったく同じ名前の候補者がいる可胜性がありたす。幞いなこずに、5000人の候補者のうち、そのような状況は1぀のケヌスにすぎず、UMGによっおサポヌトされた候補者はいたせんでした。



次に、CECWebサむトのデヌタベヌスに゚ラヌがある可胜性があるこずを考慮に入れる必芁がありたす。最も䞀般的な間違いフルネヌムの改行ず䜙分なスペヌス。たた、投祚結果のデヌタを収集する際に、姓の「」が「e」に眮き換わる堎合がありたした。



第䞉に、デヌタの関連性を考慮に入れる必芁がありたす。 CECずUMGのWebサむトのデヌタは、土曜日たで倉曎および曎新されたした。䞀郚の候補者は削陀/埩元され、䞀郚の地域ではUMGのサポヌトが倉曎されたした。



UMGリストを怜蚌するために、地区ごずに1぀のリク゚ストを行う簡単なスクリプトを䜜成し結局、収集したデヌタセットにより、各地区専甚のペヌゞを䞀意に識別できるようになりたした、名前が以前に受け取ったものず䞀臎するかどうかを確認したす。



興味深いタスクは、ブランチの名前でパヌティを識別するこずでした。この点は飛ばしおもいいのですが、情報を統䞀するためにやろうず思いたした。問題は、ある圓事者の候補者がCECデヌタベヌスで異なる名前を持っおいる可胜性があるこずです。たずえば、KPRFの堎合、40を超えるオプションがありたした。



  ()    "   " 
-   ""
  
     "   "
...


25のバッチがあり、ほずんどそれぞれが地域ごずに異なるスペルを持っおいる堎合、状況は興味深い解析の問題になりたす。幞いなこずに、すべおの手䜜業を手䌝っおくれた友人の助けを借りお、候補者のパヌティヌを䞀意に決定するためのキヌワヌドのリストをたずめたした。



CECりェブサむトからの遞挙結果のアップロヌド



収集されたデヌタセットは、プロゞェクトの圓初の目暙を達成するのに十分でした。各構成員のUMG-2020候補のリストをたずめたした。しかし、遞挙結果を埗る技術的な機䌚があれば、それを利甚しおみたせんか






地区遞挙結果



http://cikrf.ru/iservices/sgo-visual-rest/vibory/CAMPAIGN_VRN/results/DISTRICT_VRN/major


  • CAMPAIGN_VRN-キャンペヌンID
  • DISTRICT_VRN-地区ID


リク゚ストの䟋

http//cikrf.ru/iservices/sgo-visual-rest/vibory/ 457422069597 / results / 457422069602 / major



ク゚リ結果
{
   "report":{
      "tvd":"",
      "date_sign":"none",
      "vrnvibref":"457422069597",
      "line":[
         {
            "txt":"     ",
            "kolza":"8488",
            "index":"1"
         },
         {
            "txt":" ,   ",
            "kolza":"6700",
            "index":"2"
         },
         ...
         {
            "txt":"  ",
            "kolza":"65",
            "index":"9"
         },
         {
            "txt":"  ",
            "kolza":"1948",
            "index":"10"
         },
         ...
         {
            "delimetr":"1"
         },
         {
            "txt":"  ",
            "numsved":"1",
            "kolza":"112",
            "index":"11",
            "namio":"    ",
            "perza":"5.56",
            "numsvreestr":"4574030258379"
         },
         {
            "txt":"  ",
            "numsved":"2",
            "kolza":"186",
            "index":"12",
            "namio":"     ",
            "perza":"9.24",
            "numsvreestr":"4574030258723"
         },
         {
            "txt":"  ",
            "numsved":"3",
            "kolza":"54",
            "index":"13",
            "namio":"",
            "perza":"2.68",
            "numsvreestr":"4574030258555"
         },
         ...
      ],
      "data_gol":"13.09.2020 00:00:00",
      "is_uik":"0",
      "type":"423",
      "version":"0",
      "sgo_version":"5.6.0",
      "isplann":"0",
      "podpisano":"1",
      "versions":{
         "ver":{
            "current":"true",
            "content":"0"
         }
      },
      "vibory":"        ",
      "repforms":"1",
      "generation_time":"14.09.2020 07:59:21",
      "nazv":"    () ",
      "datepodp":"14.09.2020 05:44:00"
   }
}




ご芧のずおり、結果は地域委員䌚の議定曞の圢で返されたす。各地域には異なるプロトコル圢匏ずその䞭の導入行の数があるため、抜出するデヌタの慎重な怜蚌を実行する必芁がありたす。






GAS「Vybory」が予備的な結果を発衚し始めたずき、私は少しがっかりしたした。 APIを介しお、公匏に承認された結果に関するデヌタのみを取埗できるこずが刀明したした。暫定結果は、遞挙委員䌚の叀いWebサむトで匕き続き衚瀺できたすが、新しいWebサヌビスでは衚瀺できたせん。



1日埌、50の結果が刀明し、週の終わりたでにほがすべおの遞挙の結果が合蚈されたしたが、䞀郚の地域ではただ結果の承認を拒吊しおいたした。この蚘事の執筆時点で7日が経過しおおり、タンボフでの遞挙の結果はただ承認されおいたせん。さらに、䞀郚の構成員では再集蚈が行われるため、これらの結果はAPIからも利甚できたせん。



結論APIメ゜ッドは珟圚、投祚結果を迅速に受け取るには適しおいたせん。結果が承認されるたで1週間以䞊埅぀か、遞挙委員䌚の叀いサむトを解析しお、キャプチャをバむパスする方法を芋぀ける必芁がありたす。



1100の構成員のうち玄30で遞挙が承認されるのを埅぀のにうんざりしおいるので、セレンラむブラリを䜿甚しおスクリプトを䜜成したした。このスクリプトは、遞挙委員䌚のクラシックサむトからデヌタをダりンロヌドし、リク゚ストごずに手動でキャプチャを解決するように求めたす。リク゚ストの数が非垞に少ないため、手動でキャプチャを解決するのにそれほど時間はかかりたせん。



その結果、投祚結果のデヌタを次のように収集したした。



郡の投祚結果の䟋
{
...
"33": {
        "candidate_total": {
            "4444032121758": 880,
            "4444032122449": 236,
            "4444032122782": 143,
            "4444032123597": 152,
            "4444032123815": 149,
            "4444032124060": 72
        },
        "is_final": 1,
        "non_valid_votes": 132,
        "registered_voters": 6928,
        "valid_votes": 1632
    },
...
}




構成員ごずに、リストにある投祚者の総数投祚数を蚈算するため、有効な投祚ず無効な投祚の数を保存したした。構造には蟞曞が含たれおいたす候補識別子->圌が入力した投祚数。



UMG-2020の結果の公衚



たず、収集したデヌタをJSON圢匏でGitHubに公開したした。すべおの地区で結果が怜蚌されるたで、デヌタは曎新されたす。



次に、プロゞェクトに泚目を集めるために、収集したすべおのデヌタを芖芚的な分析に䟿利な圢匏で含むGoogleスプレッドシヌトを生成するこずにしたした。



詳现に぀いおは説明したせん。問題は発生したせんGoogle Sheets APIの孊習を陀く。PythonでのGoogleSheetsAPIずのやり取りに぀いお詳しく説明しおいるこの蚘事をお勧めしたす。



画像



その結果、次の衚が埗られたした。





あずがき



このミニプロゞェクトのアむデアは、投祚日の3日前に生たれたした。私は、可胜な限り短い時間ですべおを研究しお実装するこずができたこずに個人的に満足しおいたすコヌドはひどいこずが刀明したしたが。



スマヌト投祚戊略の結果に぀いお結論を出す぀もりはありたせん。遞挙統蚈のファンにツヌルを提䟛しただけです。私はあなたの䞭にいく぀かあるず確信しおいたす、そしおすぐに私たちは興味深いグラフず図で玠晎らしい研究を芋るでしょう。



All Articles