Python

【初心者向け】PythonでWebスクレイピングする方法【コードあり】

Python Webスクレイピング
PythonでWebスクレイピングしたい人
PythonでWebスクレイピングしたい人
Pythonを使ったWebスクレイピングを学習していきたいな…。

どこか基礎から教えてくれるサイトはないかな…。

この記事では、上記のような悩みを解決していきます。

 

この記事の想定読者

想定している読者は、次のとおりです。

  • Pythonを勉強している人
  • Pythonを勉強していて、スクレイピングをやってみたい人
  • 概要だけでなく、サンプルコードも探している人

 

この記事では「PythonでWebスクレイピングする方法」について書いていきます。

PythonでWebスクレイピングを学習していきたいけど、なんだか色々な方法とかあってよく分からないですよね。

 

この記事を読み終えれば、PythonでWebスクレイピングする方法が分かるようになります。

さらに、注意点も併せて紹介しているので、安心してスクレイピングできるようになっています。

 

準備 : PythonでWebスクレイピングするための前提知識

Python Webスクレイピング

PythonでWebスクレイピングをやっていく前に、前提となる知識を整理しておきましょう。

特にWebスクレイピングは、一歩間違えると違法な攻撃だと認識されて法律によって処罰される可能性すらあります。

この記事をしっかりと読んで、安全にスクレイピングしていきましょう(`・ω・´)!

 

準備① : そもそもWebスクレイピングとは?

 

そもそもWebスクレイピングとは何かというと、Web上のデータをダウンロード(クローリング)して、Webページから必要な情報を抜き出す作業です。

なぜWebスクレイピングをするのかといえば、必要な情報をWebページから収集するためです。「スクレイピング = Webページから必要な情報を抜き出す作業」なので当たり前かもですが。

たとえば僕の場合だと、ブログ運営している関係上、他のブログサイトがどんなタイトルの記事を書いているのか気になるので、Webスクレイピングを使って記事タイトルだけ抜き出しています。

 

自分で全てのページを開くのが面倒だったり、ネット上の情報をコピペするのが面倒なときに、Webスクレイピングが有効だと言えますね。

 

準備② : Webスクレイピングで必要になる知識

 

Webスクレイピングしていくのに必要にある知識は、以下のとおりです。

  • Python
  • HTML/CSS
  • JavaScript
  • httpなどのWebの知識

PythonでWebスクレイピングをやっていくわけですが、ここら辺の知識も一緒に持っていると、理解しやすくなっています。

JavaScriptとWeb知識はなくてもOKですが、しっかりとスクレイピングをやっていくのであれば、勉強しておきましょう。

 

なおPythonについては、Progateくらいのレベルがあれば問題ナシです。

progate python

ここに書かれている全5レッスンを勉強したのちに、Webスクレイピングをやっていきましょう。

 

準備③ : PythonでWebスクレイピングするためのライブラリ

 

PythonではWebスクレイピングするためのライブラリが豊富です。

 

Webスクレイピングするためのライブラリ

  • BeautifulSoup : 1番定番/この記事でも使用
  • pyquery : jQueryっぽく抽出できる
  • selenium : 本来はブラウザを自動操作するためライブラリ/JavaScriptも抽出可
  • Pyppeteer : Google Chrome限定でブラウザを自動操作できるライブラリ

こんな感じで、PythonにはWebスクレイピングするためのライブラリが豊富に揃っています。

この記事では1番定番なライブラリBeautifulSoupを使っていきます。

補足 : Webスクレイピングする上での注意点

 

なお、Webスクレイピングするときには注意点があり、以下のとおりです。

  • 著作権
  • Webスクレイピングが禁止されていないか確認
  • スクレイピング時に負荷をかけないようにする

これらに注意しつつスクレイピングする必要があります。

 

特にWebスクレイピングを禁止されていないか」と「スクレイピング時に負荷をかけないようにする」には注意しましょう。

そもそも禁止されているのに、Webスクレイピングをやってしまうと、法的な処分を受ける可能性があります。

≫参考記事 : 岡崎市立中央図書館事件 – Wikipedia

 

あらかじめスクレイピングOKか確認した上で実行するようにしましょう。

なお、スクレイピングOKだとしても、対象サイトの負荷にならないように間隔をあけて実行する必要があります。

Pythonだとtimeモジュールを使えばOKです。しっかり挟んでおきましょう。

 

スクレイピングが禁止でもAPIが提供されている可能性アリ

たとえばTwitterとかはスクレイピングが禁止されていますが、APIが提供されています。

なので、スクレイピングはできないけど、情報収拾することは可能です。

 

Twitter APIの取得方法については、以下の記事でまとめていますので、興味のある方は見てみてください。

Twitter API 申請 取得
【最新】Twitter APIの「申請から取得まで」を丁寧に解説『TwitterAPIの取得方法が分からない...。』『TwitterAPIってどうやって申請するんだろう...。』このような悩みを解決できる記事になっています。...

 

【初心者向け】PythonでWebスクレイピングする方法【コードあり】

Python Webスクレイピング

ここからは、PythonでWebスクレイピングする方法を、実際のコードを確認しつつ実装していきます。

※なおスクレイピングする対象は、当サイト(テックダイアリー)になっています。紹介しているコードの実行のみ可ですが、コードを変更して実行する場合には、他サイトにてお願いしますm(_ _)m

 

先にコードの全体像

import requests
from bs4 import BeautifulSoup

url = "https://tech-diary.net"
html = requests.get(url)

soup = BeautifulSoup(html.text, "lxml")

# ①当サイト(テックダイアリー)のタイトル取得
titles = soup.find_all('title')
print(titles[0].text)

# ②h2タグの情報を取得
for row in soup.find_all('h2'):
    print(row)

# ③h2タグのpost-list-titleクラスを取得
h2_tag_class = soup.find_all('h2', {'class':'post-list-title'})

for h2 in h2_tag_class:
    print(h2.text)


# ④spanタグのpost-list-descクラスを取得
span_tag_class = soup.find_all('span', {'class':'post-list-desc'})

for span in span_tag_class:
    print(span.text)

 

コードは以上になりますが、詳しく見ていきたいと思います。

 

PythonでWebスクレイピング① : ライブラリのインポート

 

まずはスクレイピングで必要になるライブラリのインポートから始めていきましょう。

import requests
from bs4 import BeautifulSoup

Pythonを使ったスクレイピングでは、上2つのライブラリが必要になります。

※ライブラリのインストールが完了していない場合には、pip installを使いましょう。

 

BeautifulSoupは、pip install beautifulsoup4でインストールすることに注意です!

 

PythonでWebスクレイピング② : スクレイピングで必要になる情報を入力

 

スクレイピングする前の下準備に必要な部分を記述していきます。

url = "https://tech-diary.net"
html = requests.get(url)

soup = BeautifulSoup(html.text, "lxml")

 

requests.get()するためのURLを記述しておき、getしたページ情報をhtmlに入れています。

さらに、BeautifulSoup()を使ってhtmlのテキスト情報のみを使うようにしています。

 

BeautifulSoup()の引数

なお、BeautifulSoup()の引数では、lxmlを指定しています。

逆に指定しないで実行する(=BeautifulSoup(html.text)だけだ)と、以下のようなエラーが出てきます。

Python スクレイピング

これは、beautifulsoupでは構文解析処理のほとんどをhtml parser(構文解析器)に頼っているためです。

parser間でわずかな違いがあるため、どれを使うか明示的に指定しないとbeautifulsoupによって警告が出されます。

 

parser(構文解析プログラム)の種類

  • html.parser : Pythonに組み込まれているparser、追加インストール不要
  • lxml : 非常に高速だが、追加インストールが必要
  • html5lib : webブラウザーと同じ方法でwebページの構文解析を行うことを目的としているが、処理速度はwebブラウザーより少し遅い

このようなparserがあるので、明示的に指定してあげましょう。

今回の練習では、lxmlを使ってBeautifulSoup(html.text, "lxml")としています。

 

PythonでWebスクレイピング③ : 実際に取得したいデータを抽出する

 

ここまで出来たら、取得したいデータを抽出していきます。

 

ブログタイトルを取得

# ①当サイト(テックダイアリー)のタイトル取得
titles = soup.find_all('title')
print(titles[0].text)

ブログタイトルを取得するには、以上のコードです。

titlefind_all()で全部見つけて、print()にて出力しています。

 

なおtitles[0].textとしているのは、今回だとタイトルは1つですがtitleの0番目を取得しつつ、さらにテキスト部分だけ抽出すると言う意味です。

逆にtitles[0]だけだと、titleタグも一緒にスクレイピングしてしまいます。

 

  h2タグの取得

# ②h2タグの情報を取得
for row in soup.find_all('h2'):
    print(row)

次にトップページあるh2を取得します。

トップページには、ブログ記事が10本入っているので、soup.find_all('h2')では10個の要素を持つことになります。

それをfor文にて1つ1つ取得している感じですね。

 

h2タグのclassを指定して取得

# ③h2タグのpost-list-titleクラスを取得
h2_tag_class = soup.find_all('h2', {'class':'post-list-title'})

for h2 in h2_tag_class:
    print(h2.text)

さらに、クラスを指定したh2タグの取得も行えます。

先ほどと書き方が似ていて`soup.find_all(‘h2’, {‘class’:’post-list-title’})`としてあげればOKです。

これでpost-list-titleクラスが付いているh2タグを取得できます。

 

spanタグのclassを指定して取得

# ④spanタグのpost-list-descクラスを取得
span_tag_class = soup.find_all('span', {'class':'post-list-desc'})

for span in span_tag_class:
    print(span.text)

さらに、h2タグと同様にして、spanタグでもクラスを指定して取得できます。

やり方は、h2同様ですね。

 

以上のようにして、Pythonによるスクレイピングがおこなえます。

HTMLで記載されている内容であれば取得できない情報はないので、beautifulsoupを使ってゴリゴリにスクレイピングしていきましょう。

 

さらに : Pythonを使ったWebスクレイピングを深く学ぶ

 

Pythonを使ったWebスクレイピングをより深く学びたいのであれば、以下の書籍がおすすめです。

 

スクレイピングの本は何冊か出ていますが、基礎から応用までしっかりと網羅されているのは、この書籍くらいかなと。

2019年8月にアップデートされているので、最新の情報まで盛り込まれていますよ。

 

まとめ : PythonのWebスクレイピングは、楽しく安全にやろう

 

というわけで、Pythonを使ったWebスクレイピングについて紹介してきました。

Webスクレイピングは、一歩間違えると法的な処罰を受ける可能性がありつつも、かなり便利なツールです。

 

禁止されていないか確認しつつ、スクレイピングしていきましょう(`・ω・´)!

それではこの辺で。

 

おすすめの記事