まえがき
とあるアニメの人気投票(総選挙)的な企画が始まり
ランキングをいい感じに自動取得できないかな~、という思いから
pythonでのwebスクレイピングを試してみよう!という感じで始めました。
あくまで個人的にランキング情報を見るために使用しています。
環境
OS: CentOS 7
Python: 3.6.7
python の BeautifulSoup というライブラリを使用して作業していきます。
準備
python のインストール
# yum install -y https://centos7.iuscommunity.org/ius-release.rpm
# yum install -y python36u python36u-libs python36u-devel python36u-pip
# python3.6 --version
Python 3.6.7
BeautifulSoup のインストール
# pip3.6 install beautifulsoup4
html要素の取得
URL = "取得したいURL"
headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) > > AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
}
request = urllib.request.Request(url=URL, headers=headers)
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
今回はスマホ用のページの取得がしたかったので
header部分に iPhone と iOS11 のユーザーエージェントを設定しました。
requestにURLとheaderを設定し、urllib.request.urlopenでURLを開きます。
BeautifulSoupオブジェクト生成
先ほど取得したhtmlから生成します。
bs = BeautifulSoup(html, "html.parser")
tableタグ情報取得
ランキングをいい感じに取得します。
table = bs.findAll("table",{"class":"ranking_tile"})[0]
rows = table.findAll("tr")
findAllでtableタグとclass名を設定してそれに一致するtableの情報をまるっと取得します。
さらにそこからtrタグで列ごとの情報を取得します。
ランキングの順位取得
for row in rows:
for cell in row.findAll(['td', 'th']):
rank = cell.get_text().splitlines()
print(rank[3] + ' : ' + rank[8])
列ごとにループし、カラムごとの情報を取得します。
そのままカラムを表示しようとしたら改行のせいでうまいこと表示できなかったので
改行で分割して配列に格納してから、順位とキャラクター名が入ってる要素をprintで表示しました。
結果
# python3.6 bs_test.py
1位 : ? 神○美月
2位 : ? 藤○ユリカ
3位 : ? 星○いちご
4位 : ? 大○あかり
4位 : ? 冴○きい
6位 : ? 紫○ 蘭
7位 : ? 霧○あおい
8位 : ? 有○川おとめ
9位 : ? 氷○スミレ
おけおけおっけ~!
おわりに
情報解析目的ならスクレイピングでこういったランキングを取得すること自体は問題なさそうですが
最近は著作権うんぬんな話が多いので使用する場合は注意が必要かもしれません。
この辺に関して無知なので今後勉強したいと思います。
ほんとうはこのスクリプトを1日1回実行→ twitter or LINE で通知する、的なことを
やりたかったのですが、サーバーを用意する必要がありそうで手間がかかるため諦めました。
この記事書いてて思ったけど、定期的にランキング情報取得して最終的にどういう推移をしたか
調べるのも面白いかもしれません。(多分やらない)
もっといいやり方あるよ!とかここちょっと駄目なんじゃない的なご指摘等ありましたら
コメントに書いていただけると助かります。