Webスクレイピングってよく耳にするけど、何のこと?
PythonでWebスクレイピングをする方法が知りたい!
今割と界隈ではお熱であるWebスクレイピングですが、あなたは知っていますか?
Webスクレイピングとはウェブサイトから任意の情報を取得する技術です。スクレイピングができると、プログラマとしてもスキルの幅が広がりとても便利です。
ぼくも様々な方法でスクレイピングを行なっていますが、その技術のみで仕事も取れるくらい需要のあるスキルですので、是非マスターしてきましょう!
今日は、
- クローリング、スクレイピングとは
- Requestsを使ってWebページを取得
- Beautiful Soupを使ってHTMLを抽出
という基本的なところから
- RequestsとBeautiful Soupを合わせた実用的なスクレイピング
という実際の現場でもよく使われる方法まで丁寧に説明してくので、参考になれば幸いです!
本記事を読む前に、そもそもPythonとはどんなプログラミング言語なのか、その特徴をおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
前提知識
まずは、用語について軽く触れておきましょう。
クローリングとは
クローリングとは、複数のウェブサイトのリンクをなぞってウェブページを巡回することを言います。また、クローリングをするプログラムをクローラーと呼びます。
クローリングはスクレイピングとセットでよく出てくる言葉です。
今回はスクレイピングの基礎になるので深くは掘り下げませんが、知っておく必要がある言葉なのでぜひ覚えておいてください。
Webスクレイピングとは
Webスクレイピングとは、ウェブサイトのHTMLから必要なデータを取得する事を言い、それを行うプログラムをスクレイパとも呼びます。
ウェブ上の情報を収集するうえで欠かせない技術となっており、冒頭でも述べましたがこのスキルだけで仕事を取れてしまうぐらい需要のある技術です。
先ほどのクローリングとの関連性はと言うと、
- クローラによって必要な情報のあるWebページにアクセスし
- スクレイパによって実際に情報を取得する
という風にしてスクレイピングが行われる事が多いので、セットで出てくる事が多くあります。
注意点
ウェブサイトによっては、無許可のクローリング・スクレイピングを拒否している場合があります。例を挙げるとTwitterなどはスクレイピングが禁止されているサービスです。
そのようなサイトでスクレイピングを行うと、違反行為にあたりそのサービスで罰則を受けたり、アクセスの度合いによっては違法な攻撃として法的に処罰されてしまうなんて可能性も考えられます。
そういうサイトは基本的にクローラが入れないようになっているのですが、クローラを入れないようには設定されてないけどルール上禁止と記述しているサイトもあります。
そのため、スクレイピングをする際には各サイトのルールをよく確認し、アクセス頻度などを考えて迷惑をかけないように気をつけましょう!
Pythonでスクレイピングする方法
今回はPythonを用いてスクレイピングをするということですが、スクレイピングをする方法はいくつかあります。
大きく分けると、
- 標準ライブラリを用いて生書きでスクレイピング
- 強力なライブラリを用いてスクレイピング
- フレームワークを用いてスクレイピング
標準ライブラリを用いる方法は、Webスクレイピングの基礎となる考え方や方法を学べますが、文字コード問題の対応がめんどくさかったり、大規模なスクレイピングをするときには大変です。
強力なライブラリを用いる方法は、ライブラリによってはかなり楽に実行可能で、サクッとスクレイピングできます。
フレームワークを使う方法は、PythonではScrapyというフレームワークが有名です。しかし、そのものの学習コストもありますし、大型のフレームワークですので、小規模なスクレイピングには向いていません。
それぞれの特徴を踏まえた上で今回は一番実用的な、強力なライブラリを用いたスクレイピングのやり方に絞って説明していこうと思います。
使用するライブラリ
PythonのWebスクレイピングの代表的なライブラリにはRequestsやSelenium、Beautifl Soupがあります。
それぞれ簡単に説明すると、
- RequestsはHTTPライブラリでWebページを取得するためのもの
- Seleniumはブラウザ操作をするためのもの
- Beautiful Soupは取得したHTMLから情報を抽出するためのもの
です。今回はWebスクレイピング初心者の方向けなので、RequestとBeautiful Soupだけを使った基礎的なスクレイピングの方法を解説します!
Requestsを使って、Webページを取得しよう!
Requestsは「人間のためのHTTP」と呼ばれるほど、使いやすいライブラリです。
標準ライブラリでスクレイピングをするときは「urllib」というものを使うのですが、その上位互換と言っても良いでしょう。
Requestsをインストールしよう
まずは、インストールしましょう。
pip3 install requests
pipを使ってinstallしてください。Python3系であれば、pip3、2系であればpipで大丈夫ですね。
Requestsの基本的な使い方をみてみよう
それでは、実際につかってみましょう。
今回は、Yahoo!ニュースのページを取得してみようと思います。
import requests r = requests.get('https://news.yahoo.co.jp')
基本的な使用方法はこんな感じで、requestsをインポートしてから、get()関数でurlを指定してやるとそのページの情報を格納することが出来ます。
import requests r = requests.get('https://news.yahoo.co.jp') print(r.headers) print("--------") print(r.encoding) print(r.content)
オプションは色々有りますが、headersでheader情報が、encodingでWebページの指定encoding、contentでBody以下のコンテンツが分かるのでこれくらいは覚えておくとよいでしょう。
{'Date': 'Sat, 05 May 2018 13:44:30 GMT', 'P3P': 'policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'X-Frame-Options': 'SAMEORIGIN', 'Vary': 'Accept-Encoding', 'Content-Encoding': 'gzip', 'Content-Length': '9869', 'Content-Type': 'text/html; charset=UTF-8', 'Age': '0', 'Connection': 'keep-alive', 'Via': 'http/1.1 edge2201.img.umd.yahoo.co.jp (ApacheTrafficServer [c sSf ])', 'Server': 'ATS', 'Set-Cookie': 'TLS=v=1.2&r=1; path=/; domain=.yahoo.co.jp; Secure'} -------- UTF-8
*長いのでcontentの実行結果は割愛
Beautiful Soupでスクレイピングをしよう!
さて、Requestsは基本的にWebページを取得して、そのWebページを解析するためのライブラリです。
実際にスクレイピングがしたいという現場ではHTMLを指定してその情報を抽出したいという場合が多いのではないのでしょうか?そのようなスクレイピングにはこのBeautiful Soupがとても便利です。
基本的には、Google Chromeの検証ツールで、取得したいHTMLを確認して、取得したい要素を指定するという方法でスクレイピングします。
Chromeのデベロッパーツールの使い方がわからない方は以下のサイトが参考になります。
⇒ サルワカ:初心者向け!Chromeの検証機能(デベロッパーツール)の使い方
Beautiful Soupをインストールしよう
わざわざ章を立てるほどでもないのですが、例に習ってpipにてインストールしましょう。
pip3 install beautifulsoup4
Beautiful Soupは2012年に変更されたver4で大きく変更されているので、ver4をインストールするようにしましょう。
Beautiful Soupを使ってみよう
それでは実際に使い方をみてみましょう。
from bs4 import BeautifulSoup html = "<h1>sayhello</h1>,<h1>saysay</h1>,<h2>say</h2>" soup = BeautifulSoup(html, "html.parser") print(soup.select("h1"))
[<h1>sayhello</h1>, <h1>saysay</h1>]
基本的な使い方は、こんな感じです。BeautifulSoupは、第一引数に、実際に解析したいものをおき、第二引数にパーサを指定します。
パーサーとは「何を元に解析するか」ということで、この場合はHTMLなのでhtml.parseとします。
後は、取得したいものをselect()で指定すれば取得することができます。
Requestsと合わせて使おう
上の例ではHTMLの中身を直接入力しましたが、実際にWebスクレイピングする場合はURLからHTMLを取得する必要があります。しかし、Beautiful SoupはURLを指定することはできません。
とはいえ、いちいち取得したい元となるデータを全て変数に与えたり、別ファイルで用意したり……というのは現実的ではありませんね。
そこで、大体の現場ではurllibやRequestsを使って、Webページを取得してそのデータを元にBeautiful Soupを使って要素を抽出する、という方法を取ります。
前章でRequestsを学んだので、RequestsとBeautifulSoupと合わせてより実用的なスクレイピングなやり方をみてみましょう。
と入っても、今までの内容を使えば何も難しいことはなく、
import requests from bs4 import BeautifulSoup r = requests.get("https://news.yahoo.co.jp/") soup = BeautifulSoup(r.content, "html.parser") # ニュース一覧を抽出 print(soup.find("ul", "newsFeed_list"))
こんな感じで、yahooのニュースのページから、ニュースタイトルを含む部分を出力することができます。
このコードの結果はHTMLのコードがくっついていて見づらいので、テキストだけ取ってきたいのなら以下のようにしましょう。
import requests from bs4 import BeautifulSoup r = requests.get("https://news.yahoo.co.jp/") soup = BeautifulSoup(r.content, "html.parser") #ニュース一覧のテキストのみ抽出 print(soup.find("ul", "newsFeed_list").text)
まとめ
いかがでしたでしょうか?この記事をみていただいたらなんとなく一人でスクレイピングできるようになったのではないかと思います。
簡単に実践的なスクレイピングまでの手順をおさらいすると、
- RequestsでWebページを取得して
- Beautiful SoupでそのHTMLを抽出する
でしたね。
指定方法などをマスターすれば、自由自在にほしい情報が取得できるようになります。是非Webスクレイピングをマスターして、快適な情報収集ライフを送りましょう!
なお、スクレイピング以外でPythonの基礎知識(できること・作れるものや、学習法など)を学習中の方は、以下の記事も合わせてどうぞ。
Pythonをはじめて学習する方向けにまとめていますので、ぜひ参考になさってください!