メモ

主にプログラミング系の備忘録

選挙ドットコムの過去選挙結果をスクレイピング

選挙ドットコム
go2senkyo.com

の地方選挙の選挙結果をスクレイピング
ie.navigate のURL部分を引数にすればガッツリとれるような気がする

※世田谷区議選でのみ動作確認

'参照設定 Microsoft HTML Object Library
'         Microsoft Internet Controls
' ieCheck: https://www.vba-ie.net/code/iecheck.php


Public Sub getSenkyoData()
  Dim ie As InternetExplorer: Set ie = New InternetExplorer ': ie.Visible = True
  ie.navigate "https://go2senkyo.com/local/senkyo/9926"
  Call ieCheck(ie)
  
  Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets.Add
  
  Dim dom As HTMLDocument: Set dom = ie.document
  Dim el As IHTMLElement
  Dim nRow As Long: nRow = 2
  Dim buf As Variant
  
  '選挙情報を取得する
  ws.Range("J1") = "都道府県"
  ws.Range("K1") = dom.getElementsByClassName("p_local_senkyo_ttl_wrapp")(0).getElementsByTagName("p")(0).innerText
  
  ws.Range("J2") = "選挙名"
  buf = Split(dom.getElementsByTagName("h1")(1).innerText, vbCrLf)
  ws.Range("K2") = buf(0)
  
  ws.Range("J3") = "投票日"
  ws.Range("K3") = dom.getElementsByClassName("m_senkyo_data")(0).getElementsByTagName("tr")(0).getElementsByTagName("td")(0).innerText
  
  ws.Range("J4") = "投票率"
  buf = Split(dom.getElementsByClassName("m_senkyo_data")(0).getElementsByTagName("tr")(0).getElementsByTagName("td")(1).innerText, "(")
  ws.Range("K4") = buf(0)
  
  ws.Range("J5") = "定数"
  buf = Split(dom.getElementsByClassName("m_senkyo_data")(0).getElementsByTagName("tr")(0).getElementsByTagName("td")(2).innerText, "/")
  ws.Range("K5") = buf(0)
  
  ws.Range("J6") = "告示日"
  ws.Range("K6") = dom.getElementsByClassName("m_senkyo_data")(0).getElementsByTagName("tr")(1).getElementsByTagName("td")(0).innerText
  
  ws.Range("J7") = "前回投票率"
  ws.Range("K7") = dom.getElementsByClassName("m_senkyo_data")(0).getElementsByTagName("tr")(1).getElementsByTagName("td")(1).innerText

  '見出し
  ws.Range("A1") = "当落"
  ws.Range("B1") = "氏名"
  ws.Range("C1") = "氏名カナ"
  ws.Range("D1") = "所属"
  ws.Range("E1") = "年齢"
  ws.Range("F1") = "性別"
  ws.Range("G1") = "現元新"
  ws.Range("H1") = "得票数"
  
  For Each el In dom.getElementsByClassName("m_senkyo_result_table")(0).getElementsByTagName("tr")
    If el.getElementsByTagName("td")(0).innerHTML <> "" Then ws.Range("A" & nRow) = "当選"
    ws.Range("B" & nRow) = Replace(Replace(el.getElementsByClassName("m_senkyo_result_data_ttl")(0).innerText, el.getElementsByClassName("m_senkyo_result_data_kana")(0).innerText, ""), vbCrLf, "") '氏名
    ws.Range("C" & nRow) = el.getElementsByClassName("m_senkyo_result_data_kana")(0).innerText 'カナ氏名
    ws.Range("D" & nRow) = el.getElementsByClassName("m_senkyo_result_data_circle")(0).innerText '所属
    buf = Split(el.getElementsByClassName("m_senkyo_result_data_para")(0).getElementsByTagName("span")(0).innerText, "(") '年齢と性別を分離
    ws.Range("E" & nRow) = Replace(buf(0), "歳", "") '年齢
    ws.Range("F" & nRow) = Replace(buf(1), ")", "") '性別
    ws.Range("G" & nRow) = el.getElementsByClassName("m_senkyo_result_data_para")(0).getElementsByTagName("span")(1).innerText '現元新
    ws.Range("H" & nRow) = Trim(Replace(el.getElementsByClassName("right")(0).innerText, "票", "")) '得票数
    nRow = nRow + 1
  Next el

End Sub