注意)この記事には一部アフィリエイトが導入されています。アフィリエイトポリシーをご覧ください。

先に結論から。Youtubeのチャンネル登録をして、この動画を見ればすべて解決しますのでご覧ください!

※追記 2019年6月7日
これ以外にもプログラミングの解説動画があるので、ぜひ以下のリンクからチャンネル登録して、ほかの動画も見てみてください!

Youtubeでチャンネル登録して動画解説を見る

Pythonでは、スクレイピングという技術を使って、日々の業務を自動化することができます。今回の記事では、

  • スクレイピングという技術で何ができるようになるのか
  • スクレイピングをする際に学んでおいた方がよい知識
  • スクレイピングを学ぶ際に利用すべきWebサイト、書籍

などについて解説していきたいと思います。

✓この記事の読者の想定

こんな悩みを持っている方向けにまとめていきます!

  • Pythonのスクレイピング方法を知りたい
  • 日々の業務を自動化したい
  • プログラミングで何ができるのか知りたい

スクレイピングとは

スクレイピングとは、Webページの情報を取得することができる技術のことです。例えば、日経平均のデータを毎日エクセルに記録したいとします。でもこれを毎日

  • Webサイトにアクセスする
  • 該当する箇所をメモしてエクセルに貼り付ける
  • これを繰り返す

とやっていたら、相当面倒くさいですよね?

ほかにも例えば、あるWebサイトから、10記事分くらいデータを収集して、画像を全てダウンロードしたいとします。これも

  • Webサイトのページ一つ一つにアクセスする
  • ページの画像を1枚1枚フォルダにダウンロードする
  • 次のページに移動する
  • ページの画像を1枚1枚フォルダにダウンロードする

という風にやっていったら、らちがあかないですよね?

Pythonを利用したWebスクレイピングを行えば、指定した文字、ファイルなどを、プログラムで自動収集することができるようになります。

Pythonを利用したWebスクレイピングの活用方法

僕自身はWebマーケターなのですが、日々Pythonを利用して、スクレイピングを利用します。いくつか具体例を提示したいと思います。

Webサイトの関連キーワードを自動取得し、リバースエンジニアリング

あるキーワードを検索した際に、Googleの検索関連キーワードを取得できますよね。下の画像のような部分です。

関連キーワードを一つ一つさらに検索をかけると、そのキーワードに関する関連キーワードを取得することができます。

  1. 検索キーワードで検索
  2. 関連キーワードを取得
  3. 一つ一つ関連キーワードを検索して、その関連キーワードをCSVに出力

みたいな感じですね。

これをスクレイピングを利用すると、全て自動で収集することができます。

ニュースサイトの過去のブックマーク数をCSVに一括ダウンロード

あるニュースサイトでブックマークされた過去記事を20年分さかのぼって、どういうキーワードが記事タイトルに含まれるとバズりやすいのか分析する際に、スクレイピングを利用しました。これを手動でやると、たぶん1日かかるのですが、スクレイピングを利用して5分で完了させ、さらにPythonを利用して過去1万件の膨大なデータを分析しました。

このように、Pythonを利用したWebスクレイピングを利用すると、簡単に情報を自動収集することができるようになります。

PythonでWebスクレイピングするために必要な知識

PythonでWebスクレイピングするために必要な知識をまとめておきます。

HTML

HTMLは、このページを記述している文書です。F12ボタンをクリックすると、このWebサイトのソースが見れるかと思いますが、これがHTMLです。

Webスクレイピングは、結論からいうとURLからHTMLを読み込んで、データを収集することになります。ですので、HTMLの理解が最低限必要になります。

CSS

さらに、HTMLのうちどこを取得するかという問題なのですが、そこでCSSが出てきます。例えば、あるタグの中のここの一部分をとりたい!みたいなときに、CSSを利用して取得することになります。

JavaScript

JavaScriptはマストではないのですが、学んでおいた方がいいです。後述するSeleniumなどを利用する際に、利用します。

例えば、あるページを下にスクロールしたりする場合、JavaScriptのコードをスクレイピングのライブラリ上で利用することがあります。かゆいところに手が届かないときに、JavaScriptを利用することがあるので、覚えておきましょう。

Pythonでスクレイピングを行うためのライブラリと活用方法

PythonでWebスクレイピングをする方法は、いろいろありますが、代表的なのは以下の方法です。

  1. Requests / BeautifulSoupを利用する
  2. Seleniumを利用する

1. Requests / BeautifulSoupを利用する

初学者の人の場合は、Requests / BeautifulSoupを利用するとよいと思います。
Requestsは、Pythonライブラリでして、HTTPの通信を行うことができるライブラリとなります。

もう少し簡単にいうと、あるページにアクセスしたり、データを送ったりするネットワーク処理を操作できるライブラリですね。

簡単なデータであれば、RequestsとBeautifulSoupを利用すれば、取得することができます。

Seleniumを利用する場合

さて、Seleniumは、仮想ブラウザを立ち上げて、ブラウザを自動操作することでスクレイピングを行うことができるライブラリです。(※もともとはブラウザテストで利用するツールです)

Seleniumを使うメリットは、以下のような点があります。

  • Requestsだと認証で躓くが、Seleniumだとブラウザ操作でログイン情報を入力したりできるので、ログインが必要なサイトからのデータ取得が簡単
  • Requestsだと、あるWebページの一番下までいくと読み込まれるデータが存在する場合取得することができないが、Seleniumだと仮想ブラウザを操作して、JavaScriptでスクロールさせることができるので、データを取得することができる
  • ECサイトでボタンをクリックしないと出てこないデータがあって、Requestsだと取得することができないが、Seleniumだとクリックイベントなどをプログラムで操作することができる。
  • RequestsだとBot判定されて、スクレイピングすることができないが、Seleniumだと実際のブラウザを立ち上げて自動操作するので、Bot判定に引っ掛かりにくい

一方で、Seleniumを利用する場合、以下のようなデメリットがあります。

  • Requestsと比べると重い。ブラウザを一個立ち上げているのと変わらないので、高速処理したいときには不向き。
  • Chroniumなどの仮想ブラウザ(ドライバー)を設定する必要がある。Linuxの知識がないと設定が難しい。

PythonでWebスクレイピングする際のサンプルコード

それでは、サンプルコードです。

Requests

まず、Requestsを利用したサンプルコードです。#DAINOTE のスクレイピング入門から引用します。ある記事から、そのページのURLをすべて取得してCSVに落とすスクリプトの一部となります。

import requests
response = requests.get("https://review-of-my-life.blogspot.com/")
print (response.text)
html_doc = requests.get("https://review-of-my-life.blogspot.com").text
soup = BeautifulSoup(html_doc, 'html.parser') # BeautifulSoupの初期化
print(soup.prettify())

# TODO1 このページのaタグをすべて抜き出してください。(HTMLの内容)
real_page_tags = soup.find_all("a")
for tag in real_page_tags:
print(tag)

# TODO2 このページのaタグをすべて抜き出してください。(HTMLの内容)

for tag in real_page_tags:
print(tag.string)
# TODO3 このページのaタグをすべて抜き出してください。(HTMLの内容)

for tag in real_page_tags:
print(tag.get("href"))

 

≫Pythonによるスクレイピング①入門編 ブログの記事をCSVにエクスポートする

Selenium

Seleniumのサンプルコードです。ここでは、Google検索で取得した関連キーワードを検索して、さらに関連キーワードを取得するスクリプトとなります。

from selenium import webdriver
import time
import requests
import json 
from bs4 import BeautifulSoup
import pandas as pd
import sys
import time
import os

args = sys.argv
root_query = input("キーワードを入力してください: ")

browser = webdriver.Chrome(os.getcwd() + "/chromedriver.exe")

columns = ["root_query", "branch_query", "query_name"]
df = pd.DataFrame(columns=columns)

browser.get('https://www.google.co.jp/search?num=100&q=' + root_query)
time.sleep(1)
tags = browser.find_elements_by_css_selector("p.nVcaUb")
print (tags)
related_words = []
counter = 0

for tag in tags:
branch_query = tag.text
print (branch_query)
related_words.append(branch_query)
se = pd.Series([root_query, branch_query,branch_query ], columns)
df = df.append(se, ignore_index=True)

related_words_num = len(related_words)
print (str(related_words_num) + "件関連キーワードを取得しました")
print (related_words)
counter = 1

for related_word in related_words:
print (str(counter) + "/" + str(related_words_num))
browser.get('https://www.google.co.jp/search?num=10&q=' + related_word)
second_tags = browser.find_elements_by_css_selector("p.nVcaUb")
for tag in second_tags:
branch_query = tag.text
print (branch_query)
se = pd.Series([related_word, branch_query,branch_query], columns)
df = df.append(se, ignore_index=True)
counter+=1
time.sleep(3)

df.to_csv(root_query + ".csv")
print ("CSVに出力しました")

PythonでWebスクレイピングする際の注意点

PythonでWebスクレイピングする際の注意点です。

  • Webサービスの利用規約で、スクレイピングが禁止されていないか確認する
  • Webサービスに過度な負担をかけないようにする

Webサービスの利用規約で、スクレイピングが禁止されていないか確認する

サービスによっては、個人情報保護、荒らしを防止するためにスクレイピングを禁止しているサービスがあります。僕が知っている範囲では以下の通りです。

例えば、マッチングアプリ Pairsは、利用規約で明確にスクレイピングやクローリングを禁止しています。

当社は、投稿コンテンツの利用を、利用者自身を除く、他の利用者その他の第三者に許諾するものではなく、利用者は他の利用者の投稿コンテンツの権利を侵害する行為を行ってはならないものとします。また、利用者は投稿コンテンツをクロール等で自動的に収集、解析する行為も行ってはならないものとします。(利用規約 | Pairs)

同様に、Twitter社も利用規約にスクレイピングを禁止しています。

Twitterから提供されている当社の現在利用可能な公開インターフェースを経由する(かつ、その使用条件を遵守する)ことなく、その他の何らかの手段(自動その他を問わず)でTwitterにアクセスまたはその検索を行うか、またはアクセスまたは検索を試みること。ただしTwitterと別途締結した契約によりこれを行うことが特に認められている場合は、この限りではありません。Twitterのクローリングは、robots.txtファイルの規定による場合には許可されます。ただし、Twitterの事前の承諾なしにスクレイピングを行うことは明示的に禁じられています。(ルール | Twitter)

日本では、裁判沙汰になる問題はあまりありませんが、海外では多く見られます。

参考)≫スクレイピングの倫理①海外のトラブル事例

Webサービスに過度な負担をかけないようにする

また、Webサービスに過度な負担をかけないようにしましょう。基本的には大規模なデータを取得する場合は、timeモジュールのsleepメソッドを利用して、待機時間を入れるのが礼儀です。

スクレイピングをする際に知っておいた方がよい知識と学習方法

スクレイピングをする際に前提として理解しておくべき知識です。

HTML / CSS

さきほど解説したように、HTMLはこのページのマークアップをしている言語で、CSSはHTMLを装飾する言語です。

HTML、CSSはスクレイピングで「ここを抜き出して!」と命令出すときに理解していないと難しいので、勉強しておきましょう。

≫ProgateでHTML / CSSを勉強する

JavaScript

JavaScriptはブラウザの動的な操作を制御するために利用します。スクレイピングでJavaScriptを利用する場合、

  • ブラウザで特定のボタンをクリックする
  • ブラウザを一番したにスクロースする

などを行う場合にJavaScriptが必要になります。こちらもProgateで学んでおきましょう。

≫ProgateでJavaScriptを学ぶ

Python

Pythonは、サーバーサイド言語のひとつのです。スクレイピングを行う際の処理はすべてPythonで実行します。Pythonの基礎はProgateで勉強してください。

≫ProgateでPythonを学ぶ

また、Pythonを動作させるためには、Pythonの環境構築を行う必要があります。初学者には難しいと思うので、Google Colaboratoryを利用してPythonを動作させるのがおすすめです。特に難しい環境構築をせずとも、すぐにPythonをブラウザ上で動作させることが可能です。

≫Google DriveでPythonの実行環境を整える方法をまとめてみた

Pythonでスクレイピングを学べるサイト

最後に、Pythonでスクレイピングを学べるサイト・本について紹介します。

PythonでWebスクレイピングが学べるサイト

おすすめは以下3点

DAINOTE

僕が作成しているので手前味噌ですが、かなり実務的なスクレイピングが学べるようになっています。

この記事でも紹介した、Pythonのスクレイピング入門記事です。あるページの記事URLを自動で全部取得し、CSVにエクスポートすることができます。こちらのnote自体は無料ですので、お試しください!

≫Pythonによるスクレイピング①入門編 ブログの記事をCSVにエクスポートする

こちらは、Google検索の結果から、アフィリエイトコードを抜き出すスクレイピングのチュートリアルです。SEO対策や、アフィリエイターさんがプログラミングを学ぶには非常におすすめです。

PythonによるWebスクレイピング②Google検索の結果から、アフィリエイトコードが入っている記事を抜き出す –

こちらは、あるWebサイトの「次へ」が存在しなくなるまでページをロードし、全件数を取得してダウンロードするチュートリアルです。より発展的なものを学びたい場合はこちらを利用してみてください。

Pythonによるスクレイピング③「次へ」があるサイトからデータを全件取得する

PyQ

PyQは、Pythonに特化したプログラミング学習サイトです。Web APIの利用方法や、スクレピングの基礎等を詳しく解説してくれています。

実際に僕も登録して、レビュー記事を書いてみたので、興味がある方はぜひ!

≫評判のよかったPyQを実際に試してみたら、予想以上によかったので感想を書いてみた

PyQ公式サイトもこちらにまとめておきます。

≫PyQ公式

Aidemy

Aidemyは、人工知能特化型プログラミング学習サービスです。つい最近スクレイピングコースが出たみたいですね。まだ試していないのですが、興味がある方はこちらをみてみてください。

≫アイデミー スクレイピング入門

Pythonを利用したWebスクレイピングが学べる本

Pythonを利用したWebスクレイピングを学べる本について紹介します。

Pythonによるスクレイピング&機械学習 開発テクニッ BeautifulSoup,scikit-learn,TensorFlowを使ってみよう

 

この本では、Web API、スクレイピング、機械学習などを学ぶことができます。ただし、自分自身で環境構築ができないと全く何もできない書籍です。

ある程度Linuxがわかり、プログラミングの基礎が分かるヒトにはかなり読み応えのある本かと思いますので、おすすめです。

≫Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう

まとめ

ということで、PythonでWebスクレイピングをする方法について解説しました。プログラミング初心者であれば、

  • HTML
  • CSS
  • JavaScript
  • Python

を勉強したうえで、

などを利用して勉強してみるのがよいかと思います。

DAINOTEでは、上記実践的なチュートリアルを一括で購入することも可能です。無料のものを試したうえで、よさそうであればぜひ使ってみてください!
≫DAINOTEで実践的なWebスクレイピングを学ぶ

無料のチュートリアルに関して解説した動画もYoutubeでアップロードしましたので、ぜひチャンネル登録してYoutubeで学んでみてください!

YoutubeでPythonスクレイピングを学ぶ

また、PyQも3980円程度で学ぶことができるのでおすすめです!

≫PyQに登録して、Webスクレイピングを学んでみる