#はじめに
今回はwebスクレイピングについて紹介していきます. ちなみにwebスクレイピングはwebサイトから情報を獲得することです.
#環境
python3.6.3
macOS version10.14.2
#準備
まずはライブラリをインストールしましょう.
beautifulsoup4は, htmlからデータを取り出すライブラリです.
requestsは, httpでデータの通信を行うためのライブラリです.
$ pip install beautifulsoup4
$ pip install requests
#簡単な使い方
###ページ情報の取得
まずはwebページの情報を取得しましょう.
今回は, Sportsnaviから情報を取得します.
下記コードのURL部分を変更すれば, 異なるwebページでも利用できます.
# URL指定
url = "https://baseball.yahoo.co.jp/npb/stats/batter?series=1&type=1"
# Responseオブジェクト生成
response = requests.get(url)
# 文字化け防止
response.encoding = response.apparent_encoding
# BeautifulSoupオブジェクト生成
soup = BeautifulSoup(response.text, "html.parser")
###タグの取得
次はwebページからタグを取得しましょう.
タグの取得方法は様々あるので,いくつかを紹介します.
soup.find_all('a') # HTMLから全てのaタグを取り出す. リストのように扱える.
soup.find('a') # 先頭の一つだけ取り出す.
soup.a # soup.find('a')と同様
###条件を絞ったタグの取得
クラスや属性で条件を絞ってタグを取得することも可能です.
soup.find('div', id='main') # divタグでidがmainのものを取得
soup.find_all("a", class_="link", href="/link") # aタグでclassがlink, hrefが/linkのものを取得
タグを指定しなくてもオッケー.
soup.find(id='main') # divタグでidがmainのものを取得
soup.find_all(class_="link", href="/link") # aタグでclassがlink, hrefが/linkのものを取得
###タグの情報
取得したタグの情報は以下のように取得します.
soup.a.get('href') # href属性を取得する
soup.a.text # aタグの中身を取得する
###webページのHTMLを確認
任意の情報を取得するためには, webページのHTMLの情報が必要だと思います.
Chromeを使用している場合は, webページで右クリックを押すと「検証」とあるのでクリックしてください.
以下のように, そのwebページのHTMLが表示されます.
#実践
今回は, Sportsnaviからプロ野球セリーグの打率上位10人についての情報を取得します.
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
# URL指定
url = "https://baseball.yahoo.co.jp/npb/stats/batter?series=1&type=1"
# Responseオブジェクト生成
response = requests.get(url)
# 文字化け防止
response.encoding = response.apparent_encoding
# BeautifulSoupオブジェクト生成
soup = BeautifulSoup(response.text, "html.parser")
# 取得した情報を書き込む用のファイル
f = open('grade.txt', 'w')
# タグを取得
elems = soup.find_all("div", id='main')
# 順にファイルへ書き込み
for i in elems:
f.write(i.text)
f.close()
### 以下, 取得した情報を整理しているのみ
grade = [[] for i in range(10)]
f = open('grade.txt', 'r')
lines = f.readlines()
flag =False
f.close()
num = 0
grade[0].append('1')
for line in lines:
line = line.strip()
if line == '':
continue
elif num > 9:
break
elif flag == True:
grade[num].append(line)
if len(grade[num]) == 27:
num = num+1
elif line == str(1):
flag = True
print('セリーグ打率順位')
for i in range(10):
print(str(grade[i][0])+" "+str(grade[i][1])+str(grade[i][2])+" "+grade[i][3])
実行結果は, 以下のようになります.
無事, webページから情報を取得できました.
セリーグ打率順位
1 青木 宣親(ヤ) .3441
2 鈴木 誠也(広) .3435
3 坂本 勇人(巨) .325
4 丸 佳浩(巨) .322
5 高橋 周平(中) .315
6 梅野 隆太郎(神) .313
7 糸井 嘉男(神) .312
8 筒香 嘉智(デ) .307
9 平田 良介(中) .299
10 野間 峻祥(広) .2967