Webスクレイピングとは何か理解しよう
それでは、早速Webスクレイピングとは何か理解していきましょう。
このレッスンの目標
- Webスクレイピングが何をしているか理解する
- Webスクレイピングを行う際に考えておくべきリスクなどを理解する
Webスクレイピングとは
スクレイピングとは、Webページの情報を取得することができる技術のことです。
例えば、日経平均のデータを毎日エクセルに記録したいとします。
でもこれを毎日
- Webサイトにアクセスする
- 該当する箇所をメモしてエクセルに貼り付ける
- これを繰り返す
とやっていたら、相当面倒くさいですよね?
ほかにも例えば、あるWebサイトから、10記事分くらいデータを収集して、画像を全てダウンロードしたいとします。
これも
- Webサイトのページ一つ一つにアクセスする
- ページの画像を1枚1枚フォルダにダウンロードする
- 次のページに移動する
- ページの画像を1枚1枚フォルダにダウンロードする
という風にやっていったら、らちがあかないですよね?
Pythonを利用したWebスクレイピングを行えば、指定した文字、ファイルなどを、プログラムで自動収集することができるようになります。
Pythonを利用したWebスクレイピングの活用方法
具体的な利用方法について解説します。
Webサイトの関連キーワードを自動取得し、リバースエンジニアリング
あるキーワードを検索した際に、Googleの検索関連キーワードを取得できますよね。下の画像のような部分です。
関連キーワードを一つ一つさらに検索をかけると、そのキーワードに関する関連キーワードを取得することができます。
- 検索キーワードで検索
- 関連キーワードを取得
- 一つ一つ関連キーワードを検索して、その関連キーワードを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スクレイピングをする方法は、いろいろありますが、代表的なのは以下の方法です。
- Requests / BeautifulSoupを利用する
- Seleniumを利用する
1. Requests / BeautifulSoupを利用する
初学者の人の場合は、Requests / BeautifulSoupを利用するとよいと思います。 Requestsは、Pythonライブラリでして、HTTPの通信を行うことができるライブラリとなります。
もう少し簡単にいうと、あるページにアクセスしたり、データを送ったりするネットワーク処理を操作できるライブラリですね。
簡単なデータであれば、RequestsとBeautifulSoupを利用すれば、取得することができます。
2. 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"))
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はスクレイピングで「ここを抜き出して!」と命令出すときに理解していないと難しいので、勉強しておきましょう。
Python
Pythonは、サーバーサイド言語のひとつです。
スクレイピングを行う際の処理はすべてPythonで実行します。Pythonの基礎はProgateで勉強してください。
また、Pythonを動作させるためには、Pythonの環境構築を行う必要があります。
初学者には難しいと思うので、Google Colaboratoryを利用してPythonを動作させるのがおすすめです。特に難しい環境構築をせずとも、すぐにPythonをブラウザ上で動作させることが可能です。
次のレッスンでは、実際にスクレイピングを行っていきましょう!
メモが保存されました
メモ一覧を見る