3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonでスマホ用のページのwebスクレイピングを試してみる

Last updated at Posted at 2019-03-03

まえがき

とあるアニメの人気投票(総選挙)的な企画が始まり
ランキングをいい感じに自動取得できないかな~、という思いから
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 で通知する、的なことを
やりたかったのですが、サーバーを用意する必要がありそうで手間がかかるため諦めました。
この記事書いてて思ったけど、定期的にランキング情報取得して最終的にどういう推移をしたか
調べるのも面白いかもしれません。(多分やらない)

もっといいやり方あるよ!とかここちょっと駄目なんじゃない的なご指摘等ありましたら
コメントに書いていただけると助かります。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?