Webスクレイピング入門 基礎はコレだけ抑えておけば大丈夫!本当に必要な事だけ学ぼう!

はじめに

この章では、Webブラウザ(Google Chrome)を使って解説していきます。
ブラウザが異なる場合正しく動作しない場合がありますので、事前にダウンロードを済ませてからこのテキストを進めてください。
Google Chromeダウンロード

Webスクレイピング

スクレイピング(Scraping)とは、Webサイトから任意の情報を抽出、整形、解析する技術のことです。
Pythonにはスクレイピングをするためのライブラリがいくつかありますが、
ここでは「BeautifulSoup」(ビューティフル・スープ)を使って、スクレイピングします。
Beautiful Soupを使うことで、手軽にHTMLやXMLから情報の抽出が可能です。
Beautiful SoupはHTMLなどの解析するためのライブラリですので、データのダウンロードを行う場合は、urllibを使います。

クローリング

クローリング(Crawling)とは、プログラムが「Webサイトを定期的に巡回し、情報を取得する技術です。
クローリングを行うプログラムをクローラー(crawler)やスパイダー(Spider)とも呼びます。
集めたデータを機械学習で利用しやすいようにデータフォーマットとして、CSV形式で保存したりします。
他にもPythonのライブラリなどを活用することで、JSON形式で保存したり、データベースなどに保存することも可能です。

クローラー(crawler)

クローラーとは、ネット上にあるWebサイトや画像・動画、テキストファイルなどのデータを収集するプログラムのことです。
クローラーはこれまで手動で行っていたWebからの情報収集を自動化することができるため、情報収集の大幅な時間削減が可能になります。データを自動的に蓄積できるのも魅力です。

Webスクレイピングの活用事例

Webスクレイピングの活用事例として大きく3つあげられます。

1. マーケティング
2. 業務効率化
3. サービス開発

まずマーケティングですが、Webスクレイピングを活用することで、毎日定期的に確認する株価の変動やニュースメディアからの最新記事などの情報を自動で収集することができます。
次に、業務効率化を実現可能です。
例えば、Twitterの特定の検索条件のツイートを数百件自動収集したりすることが出来ます。
もちろん、手動でツイートを集めることも出来ますがかなりの労力がかかってしまいます。
最後に、スクレイピングを利用したWebやアプリケーション開発が可能となります。
Googleのような検索エンジンや定期的に収集したデータをサービス開発に役立てることも可能です。

スクレイピング・クローリングを行うにあたって

スクレイピングを行う前に、確認するべき点や、作業中に気を付ける必要がある点がいくつかかありますので説明します。

1)APIが存在するかどうか

APIを提供しているサービスがあればそちらを使い、データを取得しましょう。
それでも、十分なデータが得られない等の問題があるのであればスクレイピングを検討します。

2)取得後のデータの用途に関して
取得後のデータを使う場合には、注意が必要です。
取得先のデータは自分以外の著作物にあたり、著作権法に抵触しないように考慮する必要があるためです。
私的利用のための複製(第30条)
情報解析のための複製等(第47条の7)
※2019年1月1日の改正著作権法により、この47条の7が廃止され、新しい条文である新30条の4や新47条の5が発効します。詳しくは下記記事をご確認ください。
進化する機械学習パラダイス ~改正著作権法が日本のAI開発をさらに加速する~

また、特に問題となる3つの権利として以下が挙げられます。

1) 複製権
製権は、著作権に含まれる権利のひとつで、著作権法第21条で規定されています。
(第21条「著作者は、その著作物を複製する権利を専有する。」)
複製とは、作品を複写したり、録画・録音したり、印刷や写真にしたり、模写(書き写し)したりすること、そしてスキャナーなどにより電子的に読み取ること、また保管することなどを言います。
引用先: https://www.jrrc.or.jp/guide/outline.html

2) 翻案権
翻訳権・翻案権は、著作権法第二十七条に規定されている著作財産権です。
第二十七条では「著作者は、その著作物を翻訳し、編曲し、若しくは変形し、又は脚色し、映画化し、その他翻案する権利を専有する」(『社団法人著作権情報センター』より)と明記されています。
反対に見ると、これらを著作者の許諾なしに行うと、著作権の侵害になるということです。
引用先: http://www.iprchitekizaisan.com/chosakuken/zaisan/honyaku_honan.html

3) 公衆送信権
公衆送信権は、著作権法第二十三条において規定される著作財産権です。
この第二十三条では「著作者は、その著作物について、公衆送信(自動公衆送信の場合にあっては、送信可能化を含む。)を行う権利を占有する。」
「著作者は、公衆送信されるその著作物を受信装置を用いて公に伝達する権利を占有する。」と明記されています。
引用先: http://www.iprchitekizaisan.com/chosakuken/zaisan/kousyusoushin.html

また上記を注意しながら、実際にスクレイピングを行う際に、書いたコードによってサーバに負荷がかからないようにしましょう。
過度なアクセスはサーバに負担をかけてしまい攻撃だとみなされてしまい、最悪の場合一定期間サービスを利用できなくなってしまう可能性があります。
さらには、システムにアクセス障害が発生し、利用者の一人が逮捕された事件もありますので、常識の範囲内での使用してください。
岡崎市立中央図書館事件
以上を踏まえた上で、次に進んでいきましょう。
今回ターゲットとするWebサイトは、こちら側が用意したサーバーのWebサイトからスクレイピングして行きます。

クローラーを作成するために必要なライブラリ

Pythonをベースに説明します。
・「urllib」もしくは「Requests」 HTTPライブラリ
・BeautifulSoup HTMLの構造を解析するライブラリ
・Scrapy Webスクレイピングフレームワーク
場合によっては、PhantomJSもしくはSeleniumを使う場合もあります。

スクレイピングの基本的な手順

大きく分けると3つ手順を行う必要があります。
1.Webページを取得する
2.スクレイピングする
3.抽出したデータを保存する
この3つの手順を行うことで、データを収集することが可能になります。

HTMLとCSS

スクレイピングをするにあたって、HTMLとCSSに関しての基本を知っておくと便利です。HTMLとはHyperText Markup Languageの略で、Webページを作成するためのマーク アップ言語の1つです。CSS(Cascading Style Sheets)とは、HTML文書の装飾やレイアウトをつくるための言語です。Webページは「文章の構造を定義するHTML」と「デザインを指定するCSS」のセット」で基本的に、作られています。また、これら2つはプログラミング言語ではなく、また別のものだと考えてください。以下は、HTMLとCSSのコードです。

ちなみに、sample.htmlとsample.cssは通常は上記のように分けられますが、
以下のように1つのファイルにHTMLとCSSを記述することもできます。

Webサイトからデータを取得しよう

まずは、Pythonを使いWebサイトからデータを取得する方法を紹介します。
ここでは、Pythonに標準で用意されている「urllib」というライブラリを使います。
urllib
URLを扱うモジュールを集めたライブラリです。
urllib.requestモジュールにある、urlretrieve()関数を使うことで、直接ファイルを取得できます。

# ※このコードはurlretrieve関数に渡す引数に関しての構文です。この1行だけでは動作しません。
urllib.urlretrieve(url[, filename[, reporthook[, data]]])

まずはじめに、AI AcademyのWebページから、画像データを取得してみましょう。

import urllib.request

imgname = "logo_courses_ai.png"
url = "https://aiacademy.jp/assets/images/" + imgname

urllib.request.urlretrieve(url, imgname)
print("done.")

次に、urlopen()を使い、特定のサイトの全HTMLコードを出力してみましょう。

# ※このコードはurlopen関数に渡す引数に関しての構文です。この1行だけでは動作しません。
urllib.urlopen(url[, data[, proxies[, context]]])

コードは下記のようになります。

from urllib.request import urlopen
html = urlopen("https://aiacademy.jp")
data = html.read()
decoded_data = data.decode('utf-8')
print(decoded_data)

Pythonのurllibモジュールを使うことで、画像の取得や、HTMLデータの取得ができます。

Requests

Pythonには他にも先ほど紹介したHTTPライブラリのurllib以外にもRequestsというライブラリもあります。
Requestsの扱いなどは公式ドキュメントか、AI Academyのテキストをご確認ください。

# GETリクエスト
import requests

res = requests.get("https://aiacademy.jp")
print(res) # <Response [200]>

print(res.text) # 帰って来たレスポンスボディをテキスト形式で取得

BeautifulSoupでスクレイピングする

Beautiful Soupはインストールは下記コマンドでインストール可能です。

pip install bs4

上記のインストールコマンドはMacの方はターミナル、Windowsの方はコマンドプロンプトで実行します。
さて、まずはfind()メソッドから見ていきましょう。
find()メソッドを利用することで、任意のid属性を指定し要素を見つけることが出来ます。
Beautiful Soup日本語ドキュメント

from bs4 import BeautifulSoup
from urllib.request import urlopen
html = urlopen("https://aiacademy.jp/assets/scraping/sample1.html")
data = html.read()
html = data.decode('utf-8')

# HTMLを解析
soup = BeautifulSoup(html, 'html.parser')

# 解析したHTMLから任意の部分のみを抽出(ここではtitleとbody)
title = soup.find("title")
body = soup.find("body")

print("title: " + title.text)
print("body: " + body.text)

find_all()メソッド

find_all()を使うと、複数の要素(タグ)を一気に取得することが出来ます。
また、find_all()にはキーワード引数を指定することが可能です。
キーワード引数にidに値を渡すとタグの’id’属性に対して取得可能です。
soup.find_all(id=’ID名’)
soup.find_all(‘タグ’, class_=”クラス名”)でクラスの特定のタグに対して取得できます。
find_all()ドキュメント

from bs4 import BeautifulSoup

from bs4 import BeautifulSoup
from urllib.request import urlopen
html = urlopen("https://aiacademy.jp/assets/scraping/sample2.html")
data = html.read()
html = data.decode('utf-8')

soup = BeautifulSoup(html, 'html.parser')

links = soup.find_all("a")

for a in links:
    href = a.attrs['href']
    text = a.text
    print(text, href)

CSSセレクタ

CSSセレクタの説明に入る前に少し、「CSS」と「セレクタ」に関して説明します。
まず、CSSの基本的な書き方は次の通りです。

セレクタ {
    プロパティ:値;
}

セレクタとは一言でいうと、スタイルを適用する対象のことです。
セレクタには、「HTMLの要素」、「class名(プログラミングのクラスではありません)」、「ID名」の3つがセレクタの基本セレクタです。
他にもセレクタの種類はいくつかあります。
CSSセレクタ

CSSセレクタ
スクレイピングをする際に、CSSのセレクタを指定して、任意の要素を抽出することが出来ます。

メソッド

# これは記述例ですので、このままだと動きません。
soup.select_one(セレタク) CSSセレクタで要素を1つ取り出す
soup.select(セレクタ) CSSセレクタで複数要素を取り出しリスト型で返す

次のプログラムはCSSセレクタを使ったサンプルプログラムです。

from bs4 import BeautifulSoup
from urllib.request import urlopen
html = urlopen("https://aiacademy.jp/assets/scraping/sample3.html")
data = html.read()
html = data.decode('utf-8')

soup = BeautifulSoup(html, 'html.parser')

h1 = soup.select_one("div#main > h1").string
print("h1: ",h1)

li_list = soup.select("div#main > ul.items > li")
for li in li_list:
    print("li: ", li.string)

スクレイピングのためのChrome開発者ツール入門

スクレイピングを行うには、HTMLの構造解析が必要になります。
そこで、今回は、Google Chromeの開発者ツールを使います。
まず対象のサイトへアクセスし、右クリックをすると、画像のようなポップアップが開きます。

そこで一番下にある『検証』を押します。
検証を押すと次のような画面が表示されます。

さて、今後スクレイピングを行うにあたり、この開発者ツールを使っていきます。
※画像の文字が現在のページと異なっている場合がございます。

cssセレクタでスクレイピング実践

では、AI Academy Gymにアクセスし、『本気でAIエンジニアに
なりたい人向けのパーソナルジム』という文を、cssセレクタでスクレイピングして見ましょう。

from bs4 import BeautifulSoup
from urllib.request import urlopen

target_url = "https://aiacademy.jp/gym"

html = urlopen(target_url)
data = html.read()
html = data.decode('utf-8')

soup = BeautifulSoup(html, 'html.parser')

data = soup.select("body > div > section.p-top-firstView > div.p-top-firstView__wrap > div > div > h2")
print(data[0].text)

次の6つのSTEPでCSSセレクタを取得可能です。
1. STEP1 開発者ツールで検証を開く。
2. STEP2 開発者ツール矢印ボタンを押して青色にする。
3. STEP3 青色にしたら、取得したい部分を選択しクリックする。
4. STEP4 青色ラインが引かれるので、左の白の・・・を選択する。
5. STEP5 copy > Copy selectorを押すとクリップボードにコピーされる。
6. STEP6 貼り付けする。

それでは順番に見ていきましょう。

  1. STEP1 開発者ツールで検証を開く。
  2. STEP2 開発者ツール矢印ボタンを押して青色にする。

  1. STEP3 青色にしたら、取得したい部分を選択しクリックする。

  1. STEP4 青色ラインが引かれるので、左の白の・・・を選択する。

  1. STEP5 copy > Copy selectorを押すとクリップボードにコピーされる。

  1. STEP6 貼り付けする。

貼り付けすると次のようなコードが貼り付けられます。
body > div > section.p-top-firstView > div.p-top-firstView__wrap > div > div > h2:nth-child(2) > strongこれがcssセレクターです。
また、cssセレクタをコピーした際に、今回のように、nth-child(2)といったような書式を見ます。
その場合、BeautifulSoupはnth-childの記述方法に対応していないため、nth-of-typeを使いましょう。
nth-child(n)というのは、n番目の子となる要素を意味しております。
nth-of-type(n)はn番目のその種類の要素という意味でこちらを使えば取得可能です。

ですので、次のようにします。

body > div > section.p-top-firstView > div.p-top-firstView__wrap > div > div > h2:nth-of-type(2) > strong

ですが、今回この状態のCSSセレクタでプログラムを実行すると、何も取得できないため、次のようにします。

body > div > section.p-top-firstView > div.p-top-firstView__wrap > div > div > h2

このように、セレクタをそのままとってもうまくとれない場合がありますが、セレクタを多少修正する必要があるとはいえ、目視でセレクタを取得するよりChromeの検証ツールを使うことで簡単に必要なセレクタを取得できます。

まとめ

この章では、スクレイピングの基礎を学び、
Pythonのbeutiful Soupを使い、簡単なテキストのスクレイピングを行ってきました。

関連:Pythonで画像データをスクレイピング 手軽に画像収集したい方必読!

Pythonを効率よく学ぶには?

Pythonを効率よく学ぶには、普段からPythonを利用している現役のデータサイエンティストや機械学習エンジニアに質問できる環境で学ぶことです。
質問し放題かつ、体系的に学べる動画コンテンツでデータ分析技術を学びたい方は、オンラインで好きな時間に勉強できるAI Academy Bootcampがオススメです。受講料も業界最安値の35,000円(6ヶ月間質問し放題+オリジナルの動画コンテンツ、テキストコンテンツの利用可能)なので、是非ご活用ください。