RedandWhiteDays

赤、白、ときどき黒猫

DAY2 : 初めてのWebスクレイピング②

昨日の記事のコードを詳しく見てみよう。


まずはPythonの標準ライブラリurllib.requestを利用してwebページのソースコードを取得したシーン。

response=urllib.request.urlopen('http://www.fourfourtwo.com/statszone/8-2015/matches/803352/team-stats/56/0_SHOT_01')
html=response.read()
print(type(html))


ここで引っかかったのがhtmlの型はbyteオブジェクトであるということ。

<class 'bytes'>


21.6. urllib.request — URL を開くための拡張可能なライブラリ — Python 3.5.1 ドキュメント

urlopen は bytes オブジェクトを返すことに注意してください。これは urlopen が、HTTP サーバーから受信したバイトストリームのエンコーディングを自動的に決定できないためです。一般に、返された bytes オブジェクトを文字列にデコードするためのエンコーディングの決定あるいは推測はプログラム側が行います。


大人になってからまた考えよう。




何はともあれソースコードが得られたのでここから正規表現を使って情報を抜き出していく。
それぞれのshotオブジェクトはコードにおいて以下のように定義されていた。

<line class="pitch-object timer-1-12" marker-start="url(#bigblueend)" marker-end="url(#bigblue)" x1="421.6" y1="485.99" x2="387.28" y2="195.54" style="stroke:blue;stroke-width:3" />


timer-1-12...前半(1)の12分
x1,y1...shotの起点座標
x2,y2...shotの終点座標
stroke:blue...線の色

という風に規定されているようだ。



したがって以下のような正規表現を定義した。
.は本来任意の一文字を表現するメタ文字だが、[ ]の中ではメタ文字は普通の文字として認識されるので[\d.]+で428.88などを指定できる。
htmlを通常の文字列に変換してからfindallメソッドに渡していることに注意。

r=re.compile('<line class=[^\d]*\d-(\d+)[^\d]*x1="([\d.]+)" y1="([\d.]+)" x2="([\d.]+)" y2="([\d.]+)" style="stroke:([a-z]+);')
shots=r.findall(str(html))
print(shots)


正規表現で()で囲んだ部分の5つのデータがそれぞれタプルとなり、長さ13のタプルのリストが得られた。前半(1)か後半(2)かという情報は情報量が少ないので取得していない。

[('2', '428.88', '457.73', '473.6', '37.996', 'red'), ('12', '421.6', '485.99', '387.28', '195.54', 'blue'), ('16', '390.4', '319.57', '385.2', '60.375', 'red'), ('29', '156.4', '573.91', '317.6', '350.97', 'red'), ('45', '554.72', '511.11', '470.48', '136.367', 'red'), ('53', '260.4', '338.41', '280.16', '316.43', 'darkgrey'), ('56', '334.24', '385.51', '394.56', '206.53', 'blue'), ('61', '225.04', '489.13', '306.16', '120.75', 'red'), ('66', '496.48', '336.84', '481.92', '314.86', 'darkgrey'), ('71', '170.96', '291.31', '335.28', '145.705', 'yellow'), ('84', '594.24', '451.45', '559.92', '401.21', 'darkgrey'), ('84', '349.84', '338.41', '349.84', '184.55', 'blue'), ('91', '395.6', '318', '420.56', '127.351', 'yellow')]


webスクレイピングは初めてだったので、標準ライブラリのみを使用してコードを書いている。
とはいえPythonにはwebアプリケーションに関する有名なライブラリが沢山あり、有用性が分かるようになったらまたチャレンジしていきたい。
orangain.hatenablog.com



次回はmatplotlibを用いたshotデータの可視化について述べる。