見出し画像

本当に暇だったので、今話題の議員様の情報をまとめてみた。

はい、こんにちは、今日も暇だったのでPYTHON技術を磨いた話です。
(副業をやる気にならないので、PYTHONで遊んでました。)
↓これの続きみたいなものです。

狙い・・・

自民党の上級議員様であられる総勢、376人の登録情報を全部、PYTHONで、スクレイピングして、裏金疑惑の在られる方々のお名前の横に、
疑惑の金額と、使用用途と、その方々に応援(?)できるように、
SNSやら、YOUTUBEなどのリンク先が公開されてるので、全部並べてあげようと思います。(優しいよね。私笑)

コードは以下です。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome import service as fs
from selenium.webdriver.chrome.options import Options
from urllib.parse import urljoin
import time
import requests
from bs4 import BeautifulSoup
import pandas as pd
import csv
import re

url = 'https://www.jimin.jp/member/search/'
options = webdriver.ChromeOptions()
#options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.maximize_window()
driver.get(url)
driver.execute_script("""delete Object.getPrototypeOf(navigator).webdriver;""")

for i in range(21):
    element = driver.find_element(By.XPATH, '//*[@id="search"]/div[1]/div/div[2]/div[1]/div[2]/a')
    element.click()
    time.sleep(2)

for i in range(9):
    element = driver.find_element(By.XPATH, '//*[@id="search"]/div[1]/div/div[2]/div[2]/div[2]/a')
    element.click()
    time.sleep(2)

soup = BeautifulSoup(driver.page_source, 'html.parser')

driver.close()

鬼のクリック地獄HP

じゃあ、さっそく、スクレイピングしたいので、ホームページを確認。
自民党所属の上級議員様は総勢376名ですが、衆議院、参議院合わせて、
24人しか表示されてない・・・

まぁ、めんどくさいね。いちいちクリックしないと表示されないんです。
デジタルでもアナログですね。自民党さん。

ホームページの作り
♯Xpathで場所指定して、ひたすらクリック連打。
(世の中で、私の好きな上級議員様を探すのにクリックしまくる必要があります。検索するか笑)
#衆議院一覧をひたすらクリックする。コード。259人いるが、1クリックで12人追加なので、21回クリックです。
 
for i in range(21):
    element = driver.find_element(By.XPATH, '//*[@id="search"]/div[1]/div/div[2]/div[1]/div[2]/a')
    element.click()
    time.sleep(2)
♯参議院一覧もひたすらクリックする。こっちは、117人。多すぎじゃない?
for i in range(9):
    element = driver.find_element(By.XPATH, '//*[@id="search"]/div[1]/div/div[2]/div[2]/div[2]/a')
    element.click()
    time.sleep(2)
♯毎度のごとく、BS4でsourceをパース。
soup = BeautifulSoup(driver.page_source, 'html.parser')
♯取ったら、このホームページを閉じる。二度とみるかよ笑
driver.close()

この作業で、自民党HPの各議員様のページのリンク先を取得です。

各議員のHPから、SNSのリンク先を取得

下記のコードで、各上級国民で在られる、議員様の
おホームページのアドレスを取得。

soup1 = soup.find_all(class_='btn-member')
#print(len(soup1))

giinurl = [['上級国民様HP']]
for url in soup1:
    #print(url)
    src = url.get('href')
    giinurl.append(src)

#print(df1)
site_all = []
for i in giinurl[1:]:
    i = 'https://www.jimin.jp' + i
    options = webdriver.ChromeOptions()
    #options.add_argument('--headless')
    driver = webdriver.Chrome(options=options)
    driver.maximize_window()
    driver.get(i)
    driver.execute_script("""delete Object.getPrototypeOf(navigator).webdriver;""")
    time.sleep(2)
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    soup2 = soup.find_all(class_= "l-grid-col l-grid-col-6 ta-l mb")
    #soup2 = soup2.find_all(class_ = 'l-grid-col l-grid-col-6 ta-l mb')
    #print(len(soup2))
    #ここに各議員のfor文入れる。
    giin_site = []
    for i in soup2:
        i = i.find(class_ = 'btn is-g is-ico d-f h-1 va-m')
        #print(i)
        souce = i.get('href')
        giin_site.append(souce)
        #print(souce)
    site_all.append(giin_site)    

soup1 = soup.find_all(class_='btn-member')
member = []
for i in soup1:
    #print(i)
    i = i.text.strip()
    #print(i)
    member.append(i)
これを集める


狙いはこのリンク先全部×全上級議員様分(上記は、セクシー大臣のKIZM議員)

取得結果。真面目にやってる上級国民の議員様共々全部スクレイピング完了
しかし、nameがすっごい使いにくい。
自分の地区だったり、いろいろ入ってぐっちゃぐちゃ。整理しましょ。

都道府県だったり、ブロックだったり、表現がぐっちゃくちゃ。

スクレイピングした資料のname部分がぐっちゃぐちゃ、スクレイピングのやり方がよくなかったかな・・・
この部分、全部、データ整形して、層別します。

上級国民で在られる議員様の担当場所。こんな個別で出せるんだったら、
今度マッピングしてやろうか。

頭の中で整理して以下方法で、処理すると決定。
 1.すべての担当場所をすべて、〇〇県の2文字+県に変更する。
 2.県部分で分割して、後で料理しやすいように記号をぶっこむ。
 3.〇〇県の県の前2文字前でぶっちぎれば、
  上級国民で在られる、議員様のお名前が現れるので、
  そこでぶっちぎって、同じく料理しやすいように、記号を入れる。
 4.バカの一つおぼえみたいに、書いてる衆議院議員とか参議院議員の
  記載は、議員→議員+記号に変更しておけばあとで、料理ができる。
  (まじでこいつら、どんだけ肩書が好きなんだろうな。)
 5. 1~4で記載した、記号で、すべて分割、リスト化、データ書込。
いざ、実行。
とりあえず即興で作ったのが、
・北海道ブロック  →北ブ県
・東京ブロック(新:東京都第12区)→東ブ県
・北陸信越ブロック →北信県
・北関東ブロック  →北関県
・近畿ブロック   →近畿県
・中国ブロック   →中国県
・東北ブロック   →東北県
・東海ブロック   →東海県
・九州ブロック   →九州県
・四国ブロック   →四国県
・比例代表     →比代県
・京都府      →京都県
・大阪府      →大阪県
replaceで、文字を置き換え。

i = i.replace('議員','議員〇').replace('北海道ブロック','北ブ県')
    i = i.replace('京都府','京都県').replace('大阪府','大阪県').replace('神奈川県','かな県').replace('和歌山県','わか県').replace('比例代表','比代県')
    i = i.replace('中国ブロック','中国県').replace('九州ブロック','九州県').replace('近畿ブロック','近畿県').replace('北関東ブロック','北関県').replace('北陸信越ブロック','北信県').replace('東京ブロック(新:東京都第12区)','東ブ県')
    i = i.replace('東北ブロック','東北県').replace('東海ブロック','東海県').replace('四国ブロック','四国県').replace('東京都','東京県').replace('北海道','北海県').replace('県','県〇')


splitで今回忍ばせた、〇という記号でデータ分割。

    i = i.split('県')

len(i)>=2→iというリストの要素数が2以上なら
i = i[0][:-2] 
 解説→ iの1番目(基数は0からスタート)の後2文字はカット
(ちょうどここが、上級議員様のお名前部分。)
+'様〇'
 解説→様付けしてやらんと、うるさそうだからつけとく。
+ i[0][-2:]+'県' 
 解説→1番目(基数は0からスタート)の後2文字のみ追加
 県でカットしてあるので、追加。
+ i[1]
 解説→2番目(基数は0からスタート2番目は1)の要素を連結


 if len(i) >= 2:
        #print(i[0][:-2])
        #print(i[1][0:])
        i = i[0][:-2]+ '様〇'+ i[0][-2:]+'県'+ i[1]

        i = i.replace('北ブ県','北海道ブロック').replace('東京県','東京都').replace('北海県','北海道')
        i = i.replace('京都県','京都府').replace('大阪県','大阪府').replace('かな県','神奈川県').replace('わか県','和歌山県').replace('比代県','比例代表')
        i = i.replace('中国県','中国ブロック').replace('九州県','九州ブロック').replace('近畿県','近畿ブロック').replace('北関県','北関東ブロック').replace('北信県','北陸信越ブロック').replace('東ブ県','東京ブロック(新:東京都第12区)')
        i = i.replace('東北県','東北ブロック').replace('東海県','東海ブロック').replace('四国県','四国ブロック').replace('ク〇','ク').replace(' ','')
        i = i.split('〇')
        split_giin.append(i)
        #print(i)

最後に、〇〇県をすべてあるべき表現に元に戻す。replace
追加した〇で分割。
split_giinというリストにappendする。

        i = i.replace('北ブ県','北海道ブロック').replace('東京県','東京都').replace('北海県','北海道')
        i = i.replace('京都県','京都府').replace('大阪県','大阪府').replace('かな県','神奈川県').replace('わか県','和歌山県').replace('比代県','比例代表')
        i = i.replace('中国県','中国ブロック').replace('九州県','九州ブロック').replace('近畿県','近畿ブロック').replace('北関県','北関東ブロック').replace('北信県','北陸信越ブロック').replace('東ブ県','東京ブロック(新:東京都第12区)')
        i = i.replace('東北県','東北ブロック').replace('東海県','東海ブロック').replace('四国県','四国ブロック').replace('ク〇','ク').replace(' ','')
        i = i.split('〇')
        split_giin.append(i)

最後に、pandasにつっこんで、データフレーム化。
df5が今回のデータフレーム。
df4は、修正前、CSVを読み込んで、名前がぐちゃぐちゃなデータフレーム。
df4の’name’列をドロップ。名前を整理した、df5をくっつけて、修正。

df5 = pd.DataFrame(split_giin)
df41 = df4.drop('name', axis=1)
df541 = pd.concat([df5, df41], axis=1)
df541 = df541.fillna('-')
df541.columns = ["assign","name","prefecture","area","url1", "url2", "url3", "url4", "url5", "url6", "url7", "url8", "url9"]
df541.to_csv(path, encoding='utf-8-sig', header=True, index=False)

スプレッドシートに記載済み、裏金議員情報と照合

スプレッドシート情報を取得。splistというリスト内にすべて格納。
裏金金額、弁明状況と、先ほどのデータを紐づけ。この時点で、
裏金疑惑のある議員以外、すべて棄却。

path = r'C:\Users\Owner\Desktop\work_current\sorce\polician.csv' 
test = []
df541 = pd.read_csv(path)
df542 = df541.drop('assign', axis=1)
#print(df542)
for row in df542.iterrows():
    test.append(row)
    #print(row[1])
    #print('ここ')
#print(list(test))
for a in test[:1]:
    #print(a[1])
scope = ['https://www.googleapis.com/auth/spreadsheets','https://www.googleapis.com/auth/drive']
#ダウンロードしたjsonファイル名をクレデンシャル変数に設定。
credentials = Credentials.from_service_account_file(______, scopes=scope)
#OAuth2の資格情報を使用してGoogle APIにログイン。
gc = gspread.authorize(credentials)
#スプレッドシートIDを変数に格納する。
SPREADSHEET_KEY = '▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲'
# スプレッドシート(ブック)を開く
wb = gc.open_by_key(SPREADSHEET_KEY)
ws = wb.worksheet('シート1')
splist = ws.get_all_values()
rebuild = []
for i in splist[1:]:
    #print(i[1])
    for j in test:
        if j[1][0] == i[1]:
            name = j[1][0]
            prefecture = j[1][1]
            area = j[1][2]
            value = i[2]
            reason = i[3]
            url1 = j[1][3]
            url2 = j[1][4]
            url3 = j[1][5]
            url4 = j[1][6]
            url5 = j[1][7]
            url6 = j[1][8]
            url7 = j[1][9]
            url8 = j[1][10]
            url9 = j[1][11]
            rebuild.append([name,prefecture,area,value,reason,url1,url2,url3,url4,url5,url6,url7,url8,url9])
            #rebuild.append(j[1][0],j[1][1],j[1][2],j[1][3],j[1][4])
            

df6 = pd.DataFrame(rebuild)
df6.columns = ["name","prefecture","area","value","reason", "url1", "url2", "url3", "url4", "url5", "url6", "url7", "url8", "url9"]
df7 = df["上級国民で在られる議員様のご尊顔"]
df76= pd.concat([df7, df6], axis=1)
path = r'C:\Users\Owner\Desktop\work_current\sorce\polician.csv' 
df76.to_csv(path, encoding='utf-8-sig', header=True, index=False)

最終的な出力結果。


この記事が気に入ったらサポートをしてみませんか?