見出し画像

AKB総選挙を統計したかった加藤

お久しぶりです。加藤です。

第53回AKB総選挙結果を分類して数えるのとシベリアで木を数えるのどっちがいい?って母なる教授に言われたのでAKB総選挙をスクレイピングしました。

ソビエトロシアでは結果が選挙を決める!
日本国ではオタクが選挙結果を決める!

0.完成コード

完成したコードがこれです。色々いじってて1時間弱くらいかかった。

import requests
import ast #str -> dict
import csv
# Webページを取得して解析する

load_url = "https://www.akb48.co.jp/sousenkyo53rd/result/"
html = requests.get(load_url)


dic = ast.literal_eval(html.text)

with open('dominion.csv', 'w', newline='') as f:
   w = csv.DictWriter(f, fieldnames=["rank", "vote_number", "group_name","name"])
   w.writeheader()
   for dicName in dic:
       for info in dic[dicName]:
           csvDict = {}
           csvDict['rank'] = info['rank']
           csvDict['vote_number'] = info['vote_number']
           csvDict['group_name'] = info['group_name']
           csvDict['name'] = info['name1']
           w.writerow(csvDict)
print("done!")

やってることは以下の通り
・webから情報を持ってくる
・情報を整理する
・CSV形式で出力

んじゃ以下実際にどうやって作ったかを順序立てて書いていきます。

1.AKB公式サイトをのぞく

百聞は一見にしかず

スクリーンショット 2021-02-08 23.20.27

で、どこから何を引っ張ってくればいいんだ?

スクリーンショット 2021-02-08 23.20.00

うーん....
<p 前田敦子>みたいにタグづけされてると思ったんだけど違うんか...
ソースを詳しく見てみる

スクリーンショット 2021-02-08 23.23.27

過去の総選挙一覧タグ
45th総選挙結果はresult.phpに飛ばされるっぽいぞ。
ってことはhttps://www.akb48.co.jp/sousenkyo53rd/result.phpで53th総選挙のデータに飛ぶのでは????

スクリーンショット 2021-02-08 23.26.52

よくわからんけど当たりっぽいぞ?

2. web情報を取得するrequests

何はともあれコードから情報引っ張らねぇと。
そこで奥さんrequestsの出番です。

【参考】Python,Requestsの使い方
https://note.nkmk.me/python-requests-usage/

requests.get('url')でResponse型オブジェクトを取得したら後は関数いじってちょちょいって感じ

load_url = "https://www.akb48.co.jp/sousenkyo53rd/result/"
html = requests.get(load_url)
print(html.text)

コードを取得するためのコード(The Great Code)

んで落とした情報から総選挙順位っぽいところを見てみる。
結論から言うとresultは辞書型っぽい管理してた。

{"selection_member":
[{'rank': '1', 'vote_number': '194453', 'name1': '松井 珠理奈'}
{'rank': '2', 'vote_number': '154011', 'name1': '須田 亜香里'}
{'rank': '3', 'vote_number': '141106', 'name1': '宮脇 咲良'}
{'rank': '4', 'vote_number': '81629', 'name1': '荻野 由佳'}
{'rank': '5', 'vote_number': '75067', 'name1': '岡田 奈々'}
{'rank': '6', 'vote_number': '67465', 'name1': '横山 由依'}
{'rank': '7', 'vote_number': '62611', 'name1': '武藤 十夢'}
{'rank': '8', 'vote_number': '53998', 'name1': '大場 美奈'}
{'rank': '9', 'vote_number': '51620', 'name1': '矢吹 奈子'}
{'rank': '10', 'vote_number': '50175', 'name1': '田中 美久'}
{'rank': '11', 'vote_number': '48671', 'name1': '惣田 紗莉渚'}
{'rank': '12', 'vote_number': '48100', 'name1': '高橋 朱里'}
{'rank': '13', 'vote_number': '47485', 'name1': '向井地 美音'}
{'rank': '14', 'vote_number': '46837', 'name1': '吉田 朱里'}
{'rank': '15', 'vote_number': '45688', 'name1': '古畑 奈和'}
{'rank': '16', 'vote_number': '39241', 'name1': '本間 日陽'}]}

超簡略化されたスクレイピング情報の図

3.文字列を辞書型に変換するast

よく見たらこれ辞書型っぽくね?

んじゃ、そのまんまPythonの辞書型に変換できんかね?

できました。

【参考】python文字列を辞書に変換
https://qiita.com/lamplus/items/b5d8872c76757b2c0dd9


astをimportしてliteral_eval()でヨシ!

dict = ast.literal_eval(文字列) 

辞書型の形をした文字列を辞書型にする関数

これで欲しい情報だけ抜き取ってあれやこれやできるぜ。へっへっへ

dic = ast.literal_eval(html.text) #文字列を辞書化
csvList = []
for dicName in dic:
   for info in dic[dicName]:
       csvDict = {}
       csvDict['rank'] = info['rank']
       csvDict['vote_number'] = info['vote_number']
       csvDict['group_name'] = info['group_name']
       csvDict['name'] = info['name1']
       csvList.append()

あれやこれやした例

いや別にリストに格納する必要はない。
csvで出力します。

4.取得情報をCSVへ

せっかく情報取れただから保存したいよねってことでCSVに保存。
どうせだし辞書型でそのまま保存したいよねってことでCSVで保存。

【参考】csvの読み込み・書き込み方法
https://hibiki-press.tech/python/csv/1631

実際に使用したコードがこちら。
ほぼ上記サイトのコピペ。

with open('dominion.csv', 'w', newline='') as f:
   w = csv.DictWriter(f, fieldnames=["rank", "vote_number", "group_name","name"])
   w.writeheader()
   for dicName in dic:
       for info in dic[dicName]:
           csvDict = {}
           csvDict['rank'] = info['rank']
           csvDict['vote_number'] = info['vote_number']
           csvDict['group_name'] = info['group_name']
           csvDict['name'] = info['name1']
           w.writerow(csvDict)

実際に使用したコード

基本的にDictWriterで処理した模様

w = csv.DictWriter( f, [格納される辞書の中身] )
w.writeheader( 格納される辞書の中身を設定)
w.writerow( 書き込む辞書型 )

DictWriterでうまいことしているコード

5.できた

なんだかんだでコードが完成したのでコードをぶん回した。
120人分の欲しい情報(投票数・グループ名・名前)取ってきた。

スクリーンショット 2021-02-08 23.11.20

120人分のCSVファイル

我々は勝利したのだ。

6.総括とPHPの謎

とりあえず当初の目的である総選挙情報のスクレイピングはできたからよしとする。
よくわからんのは/resultだ。

スクリーンショット 2021-02-08 23.26.52

53th総選挙:https://www.akb48.co.jp/sousenkyo53rd/result

スクリーンショット 2021-02-08 23.34.42

48th総選挙:http://www.akb48.co.jp/sousenkyo_45th/result.php

48th総選挙は私が当初考えていた通り<p>タグ管理で選抜発表してたが、53thは文字だけだった。
HTML,CSS,PHPはむっっっかしにちょろっと触った程度なのでわかりません。

なんやったんや。結果楽やったからいいけど。
htmlで管理されてるんならbeautifulsoupとか使えばよかったんかな?

ま、ええわ


7.参考文献(最終閲覧日2021/2/8)


Python,Requestsの使い方
https://note.nkmk.me/python-requests-usage/
python文字列を辞書に変換
https://qiita.com/lamplus/items/b5d8872c76757b2c0dd9
csvの読み込み・書き込み方法
https://hibiki-press.tech/python/csv/1631

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