スクレイピング1 Pythonによるスクレイピング


Aidemy 2020/9/30

 はじめに

 こんにちは、んがょぺです!文系大学生ですが、AI分野に興味が湧いたのでAI特化型スクール「Aidemy」に通い、勉強しています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
 今回は、スクレイピングの一つめの投稿になります。どうぞよろしくお願いします。

*本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・スクレイピングとは
・Webページを取得する(クローリング)

スクレイピングとは

スクレイピングについて

・スクレイピングとは、Webページから必要な情報を自動で抜き出す作業のことである。
・スクレイピングを使うことで、機械学習で必要な大量のデータを集めることができる。
・ただし、Web上にあるデータは自由に利用が認められているデータ(オープンデータ)出ない場合もあるので、注意が必要。

スクレイピングの流れ

・スクレイピングして良いか確認する。また、データを取得できるAPIが提供されていればそちらを利用する。
・データを得られるWebページを取得する。これをクローリングと言う。
・Webページの中から必要な情報を入手する。(スクレイピング)

スクレイピングの主な手法3つ

wgetコマンド:wgetコマンドを使ってWebページをダウンロードし、unixコマンドや正規表現を使ってスクレイピングを行う。単純で手軽だが機能不足。
Webスクレイピングツール:Chromeの拡張機能やスプレッドシートその他スクレイピングが可能なツールを使う。機能に制限がある、有料の場合があるなどの点もあるので注意。
プログラミング:自分でスクレイピングの機能をプログラミングする。複雑なデータも扱える。今回はこの方法でスクレイピングする。

エンコードとデコード

・エンコードとは、データを符号化して別の形式にすることである。
・デコードとは、エンコードされたデータを元の形式に戻すことである。
・スクレイピングでは、一度エンコードして仮のデータを取得し、その仮データをデコードすることでデータを取得することができる。

Webページを取得する(クローリング)

Webページの取得

・Webページの取得にはurllib.requestモジュールをインポートして使えるようになるurlopen("URL")で行う。
・取得したWebページはread()メソッドで参照できるが、デコードされていないので、文字列(str型)ではないことに注意。(デコードの仕方は次項以降で確認)

from urllib.request import urlopen
#GoogleのURLを取得
url=urlopen("https://www.google.co.jp")

取得したWebページをデコードする

・デコードには、そのWebページに使われている「文字コード」の情報が必要なので、まずはこれを取得する。文字コードはinfo().get_content_charset(failobj="utf-8")メソッドを使うことで取得できる。
・上記メソッドの(failobj="utf-8")とは、文字コード(charset)がWebページ側で指定されていないときに、自動で文字コードを"utf-8"にしてくれると言う意味である。日本語のページは基本的に"utf-8"なのでこのように指定されている。

url = urlopen("https://www.google.co.jp")
#文字コードの取得and表示
encode = url.info().get_content_charset(failobj="utf-8")
print(encode) #shift_jis

・文字コードが取得できたら、その文字コードに対応したデコードを行い、

部分をstr型のHTMLコードとして取得。
・デコードはurl.decode(文字コード)で行う。内容はread()で確認できる。
#すでにエンコードしたurlを、取得した文字コード(encode)でデコード
url_decoded = url.decode(encode)
print(url_decoded.read()) #略(HTMLのコードが出力される)

もっと簡単にWebページを取得

requestモジュールをインポートして使えば、urllibよりも簡単にWebページを取得できる。ただし、複雑な操作をする場合には、前処理が大変になってしまう。
requests.get("URL")でURLの取得、取得したURLに対し、encodingを使えば文字コードが取得でき、textを使えばデコードされた状態のHTMLコードが取得できる。

import requests
url=requests.get("https://www.google.co.jp")
print(url.encoding) #shift_jis
print(url.text) #略

まとめ

・スクレイピングとは、Webページを取得し、そこから必要なデータを抜き出すことである。機械学習では、学習に必要なデータを収集するときに使う。
・Webページを取得(クローリング)するときにはurllib.requestモジュールのurlopen()関数を使うが、デコードしなければデータとしては扱えない。
・デコードするには、まずWebページの文字コードを取得し、その文字コードに合わせてdecode()メソッドを使わなければならない。
・requestsモジュールを使えば、requests.get()でURLが取得でき、それに対しencodingを使えば文字コードが取得でき、textを使えばデコードされた状態のHTMLコードが取得できるため非常に簡単である。

今回は以上です。ここまで読んでくださりありがとうございました。