
スクレイピング超入門 #1
スクレイピング超入門シリーズでは、Pythonで実際にスクレイピングを使用したWEBアプリを作成しながらスクレイピングの仕方を学習していきます。
今回の投稿では、
- スクレイピングとは
- 使用するライブラリ
- BeautifulSoupの簡単な使い方
を説明していきます。
対象はPythonとHTML/CSSの知識がある程度ある方で
事前にPythonを動かせる環境があることを前提にしています。
はじめに
こんにちはTakagiです。
機械学習やWebマーケティングに取り組むにあたってデータの収集技術は林家ペーに対してのパーくらい必要な技術です。データを収集する技術のことをスクレイピングといい、ProgateでPythonを学び終えた人でも簡単に理解することができます。
スクレイピング技術の応用例として、「メルカリの価格情報を取得して、適正価格を調べてみた」や「東京23区の物件情報を取得して、機械学習でお得な物件を探してみた」といったものがあります。
今回から投稿するシリーズ「スクレイピング 超入門」ではWebスクレイピングができるようになるように解説していきます。
スクレイピング自体はRubyやJavaScriptでも実装することは出来ますが、このシリーズではPythonを使っていきます!
スクレイピングとクローラ
スクレイピングとセットでクローリングという言葉を耳にすると思います。よく混乱するポイントなので簡単に説明します。
クローリング:Webサイトの情報を巡回する。
スクレイピング:巡回中、欲しい情報だけを取得してくる。
といった感じです。Scrapeとは”削る”とか”こすり落とす”とかいう意味があるので、集めてくる作業だとイメージするとわかりやすいと思います。
まぁ、作業自体は区別するなくまとめて出来ちゃうので分からなければそれでも大丈夫です!
前提知識
- Python,HTML,CSSの基礎的な知識
- Pythonの構築
今回使用する環境
Python 3.6.5
BeautifulSoup 4.2.0
このシリーズで完成するもの
流行りって乗るの難しくないですか…?
ちょっと前まで米津玄師さんの曲を聞いとけば流行りに乗れていたのに、私の知らないうちに日本はあいみょんを知らないと生きていけない国になっていたようです。
ということで簡単に流行りを把握できるツールが作りたくなってきました。
今回のシリーズでは
レコチョクやオリコンランキングの月間、週間ランキングをそれぞれ自動で抽出してきて表示するWebサイト
を作りたいと思います。
有名な音楽ランキングを網羅的にスクレイピングしてきてランキングを把握すれば流行りに乗り遅れることは無くなるでしょう…!!!
作業工程
さらっと言いましたが、作業工程を簡単に紹介します。
- PythonでWebサイトをスクレイピング
- CSVファイルにスクレピングした情報を出力
- Flask(フラスク)を使ってWebフレームワークとして表示
このような流れで作業していきます。
CSVファイルってなに?Flaskってなに?ってなっているかとは思いますが、
ここでは一旦そういうものがあると思ってください。
今回の記事ではスクレイピングに使う道具(ライブラリ)を簡単に紹介します。
それではシリーズ「スクレイピング超入門」スタートです!
スクレイピングに使う道具
スクレイピングには大きく分けて3つの道具(ライブラリ) を使います。
Requests | Webサイトのデータをダウンロードしてくるライブラリ |
---|---|
Beautiful Soup | 取得したWebサイトのHTMLを操作できるライブラリ |
Pandas | 操作したデータを成形しCSVファイルに変換できるライブラリ |
今回はBeautifulSoupの使い方をマスターしましょう!
Beautiful Soup(ビューティフルスープ)
※読み方をよく間違えるので注意です!
先ほども説明したように、これは非常に簡単にHTMLから情報を抽出することができます。
百聞は一見に如かず。Beautiful Soupの基本的な使い方を見てみましょう。
次のようなHTMLを解析しましょう。
html = """ <html> <body> <h1>プログラミング言語</h1> <p>Python</p> <p>Java</p> <p>Ruby</p> </body> </html> """
まずはライブラリを取り込みます。
from bs4 import BeautifulSoup
次にHTMLを解析します。
soup = BeautifulSoup(html, 'html.parser')
BeautifulSoup(解析したいHTML, 'パーサー’)
とすれば解析してくれます。
パーサー(Parser)とは解析する(Parse)ための機能のことで、html.paserやhtml5lib,lxmlがあります。
html5libやlxmlはインストールしなければ使えないため、基本的にはPythonに標準で付属しているhtml.parserを使います。
解析する前はHTMLと呼んでいましたが、解析した後はBeautifulSoupオブジェクトといいます!
名前に大した意味はありませんが、後で出てくるので覚えてください!
パーサーを使って解析したら、次は必要な情報を抽出してきましょう!!!
h1 = soup.h1 # BeautifulSoupオブジェクトからh1を取得 print('h1 = ' + h1.string) # 取得したh1を str として表示 #=> h1 = プログラミング言語
抽出するために文法は
BeautifulSoupオブジェクト.抽出したいタグ名
です!簡単ですね!
p = soup.p print('p = ' + p.string)
pタグにはPython,Java,Rubyが含まれています。実行結果は…
Pythonだけかい!!!
そうなんです。普通にpタグを抽出してくると1つしか取り出すことができません。
そこで
find_all()
メソッドを使います!
all_p = soup.find_all("p") # BeautifulSoupオブジェクトの全てのpを取得 # ループで取得したpを一つずつ表示 for p in all_p: print("p = ", p.string)
気になる実行結果は…
pタグを全部抽出できました!!!!
最終的なコード
# 解析のためのHTMLを用意 html = """ <html> <body> <h1>プログラミング言語</h1> <p>Python</p> <p>Java</p> <p>Ruby</p> </body> </html> """ # BeautifulSoupを読み込む from bs4 import BeautifulSoup # BeautifulSoupを使用してサンプルHTMLを解析 soup = BeautifulSoup(html, 'html.parser') # h1 を取得した後に表示 h1 = soup.h1 print('h1 = ' + h1.string) #=> h1 = プログラミング言語 # pを取得した後に表示 (※はじめにマッチしたものしか表示されない) p = soup.p print('p = ' + p.string) #=> p = Python # 全てのpを取得して表示 all_p = soup.find_all("p") # BeautifulSoupオブジェクトの全てのpを取得 # ループで取得したpを一つずつ表示 for p in all_p: print("p = ", p.string) # => # p = Python # p = Java # p = Ruby
BeautifulSoupを使うと簡単にスクレイピング出来ることがお分かりいただけたと思います!
今回は
- スクレイピングの紹介
- ライブラリの簡単な紹介
- BeautifulSoupの紹介と簡単な使い方
- find_allメソッドの紹介
をやってきました!
次回は少し難しめのHTMLとBeautifulSoupを使ってスクレイピングしてみましょう!