Pythonを使ったWebスクレイピングの入門編ということで、そもそもWebスクレイピングとは何か、どうやってプログラムを書けばいいのか、プログラムの骨格となる部分についてまとめていこうと思います。
環境:Windows10
2020年現在での情報をもとにしています。
Webスクレイピングとは何か
WebスクレイピングとはWebからデータを抽出することをいいます。
例えば
- メルカリに出品されている特定の商品の価格を知りたいとき
- Web上のファイルを大量にダウンロードしたいとき
他にも使い方の具体例はいろいろありますが、基本的にはWeb上から必要なデータをとってくることに変わりありません。
また、WebサイトはHTMLという言語で書かれているので、その知識も必要になります。とくにタグ・要素・属性・属性値の違いは理解しておきましょう。
ブログやWEBデザインを始めるにあたってHTMLは欠かせない言語ですね そこで今回は初学者向けにHTMLの基本的な内容を解説していきます。 そもそもHTMLとは?タグと要素、属性、属性値の違いは?HTMLを勉強する方法は? […]
Webスクレイピングを禁止しているサイトもあります。利用規約などを確認してから行うようにしてください。特にファイナンス系やSNS系は禁止になっているところがあります。ご注意ください
Webスクレイピングで使われるモジュール
- wbbrowser
- 指定したWebページを開くモジュール
- Requests
- インターネットからダウンロードするモジュール
- Beautiful Soup
- WebページのHTMLを読み込むモジュール
- Selenium
- マウス操作やフォームの入力などをするモジュール
今回紹介するのはBeautiful SoupとRequestsです。指定したページのHTMLを解析してHTMLタグの情報を分析できます。
Webスクレイピングの方法
モジュールのインストール
もし、インストールしていない場合はpipを使ってインストールしましょう。Beautiful Soupをインストールするときはbeautifulsoup4とします。4はバージョンのことです。
1 2 3 4 5 |
#Beautiful Soupをインストール pip install beautifulsoup4 #Requestsをインストール pip install requests |
正常に読み込めていたら、下のソースコードのようにインポートしてもエラーは出ません。
Webサイトを読み込む
1 2 3 4 5 6 7 8 9 |
#モジュールをインポート import requests, bs4 #Webページのダウンロード res = requests.get('URL') res.raise_for_status() #サイトのHTMLを読み込む site_soup = bs4.BeautifulSoup(res.content, 'html.parser') |
Webスクレイピングにおいて最初に記述するコードです。ほとんどの場合このコードがないとWebサイトを読み込むことができないのでテンプレのように扱っています。
- 2行目:Beautiful Soupをインポートするときは「bs4」とします。
- 5行目:’URL’に読み込みたいWebサイトのURLを書きます。
- 6行目:raise_for_status()を書くと、Webサイトを読み込めなかった時にエラーを出してくれる。
- 9行目:読み込んだHTMLをsite_soupに格納。
- 「.content」と「’html.parser’」を忘れずに
Webスクレイピングのメソッド
要素を見つけるselect()メソッド
上のソースコードでは、9行目の部分からBeautiful Soupオブジェクトが作られています。そして、そのオブジェクトがsite_soup変数に格納されています。
このBeautiful Soupオブジェクトにたいして「select()メソッド」を使うことができます。
このメソッドは、読み込んだBeautiful Soupオブジェクトのなかでタグや属性・属性値を基準に指定した要素を取得する働きをします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#指定したタグの要素を取得 site_soup.select('タグ') #タグ1要素の中にあるすべてのタグ2要素を取得 site_soup.select('タグ1 タグ2') #タグ1要素の直下のすべてのタグ2要素を取得 site_soup.select('タグ1 > タグ2') #id属性がtempの要素を取得 site_soup.select('#temp') #class属性がboxの要素を取得 site_soup.select('.box') #指定したタグと属性を持つすべての要素 site_soup.select('タグ[属性]') #指定したタグ・属性・属性値を持つすべての要素を取得 site_soup.select('タグ[属性=属性値]') |
CSSのスタイルシートに似た書き方をしているものもありますね。これらを組み合わせることでより複雑な要素を取得することができます。
select()メソッドで取得した要素はリストに格納されています。より正確にいうとTagオブジェクトのリストになっています。オブジェクトがよくわからなくてもリストになっていることは覚えておきましょう。
テキストを取得するgetText()メソッド
getText()メソッドを使うと要素の内部テキストだけを取得できます。
要素の内部テキストとは開始タグと終了タグに挟まれた部分のことです。例えば以下のようなa要素があった場合、その内部テキストとは「とことん独学ブログ」の部分になります。
1 |
<a href="https://www.self-study-blog.com">とことん独学ブログ</a> |
getText()メソッドは以下のように書きます。
1 2 3 4 5 6 7 8 9 10 11 |
#aタグ要素すべてのリストを取得 a_list = site_soup.select('a') #リストの1つ目をspamに格納 spam = a_list[0] #spamのテキストを取得 spam.getText() #spamに格納しなくてもOK a_list[0].getText() |
- 2行目:site_soupからa要素すべてをselect()メソッドで取得
- 5行目:リストの1つ目をspam変数に格納
- この行は無くてもOK → 11行目へ
- 8行目:spamからgetText()メソッドでテキストを取得
select()メソッドで取得した値がリストになっているので、インデックスを指定する必要があります。どんなデータ型になっているかがわからないとエラーになってしまうので、必ず確認しておきましょう。
属性値を取得するget()メソッド
get()メソッドは開始タグ内に書かれている属性を指定して、その属性値を取得することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#aタグ要素すべてのリストを取得 a_list = site_soup.select('a') #リストの1つ目をspamに格納 spam = a_list[0] #もし、spamに以下のa要素が格納されている場合 <a href="https://www.self-study-blog.com">とことん独学ブログ</a> print(spam.get('href')) #出力結果 https://www.self-study-blog.com |
10行目でget()メソッドに’href’を指定してます。すると、8行目のa要素からhrefの属性値であるURLを取得してくれます。
今回は確認のためにprint関数で出力結果を表示させています。
まとめ
今回はWebスクレイピング入門編ということで、HTMLを解析する方法から、メソッドを使って必要なデータを取得する方法を紹介しました。
最初は複雑に感じるかもしれませんが、オブジェクトとデータ型を理解しながら進めることが一番の近道ですね。
もし、オブジェクトやデータ型がいまいちわからない場合は、これを機会に勉強してみましょう! より理解が深まりますよ。
プログラミング言語のなかでも人気の高いPythonを学習する教材を紹介します。 最近ではプログラミングスククールがたくさんあるので迷うと思います。 ですが、まずは無料教材から始めてみましょう。苦労した分だけ力がつきます。 […]