第4章: Pythonでのスクレイピングの基本技術

Pythonを使ったWebスクレイピングの基本は、Webページからデータを取得し、それを解析することにあります。この章では、requestsライブラリを使ってWebページのHTMLを取得し、BeautifulSoupライブラリでそのHTMLを解析する方法を詳しく解説します。

Webページには多くの種類があり、その内容は静的なものと動的なものに分かれます。静的なWebページでは、HTMLはサーバーから送信されたままブラウザに表示されますが、動的なWebページでは、JavaScriptなどのスクリプトによって表示内容が変化します。この章では、まず静的なWebページからのデータの取得方法を学び、動的なページへの対処方法は後の章で扱います。

1. requestsライブラリの基本

PythonでHTTPリクエストを行うためには、標準ライブラリのurllibを使うこともできますが、より簡便で扱いやすいライブラリとしてrequestsが広く利用されています。requestsは、HTTPリクエストを行い、WebページのHTMLを取得するのに非常に便利なツールです。

requestsのインストール

まず、requestsライブラリがインストールされていない場合は、次のコマンドでインストールしてください。

pip install requests

基本的なHTTPリクエスト

次に、requestsライブラリを使って、あるWebページにHTTPリクエストを送り、そのレスポンスを取得する方法を見ていきます。基本的な使い方は非常にシンプルです。

import requests

url = 'https://example.com'
response = requests.get(url)
print(response.text) # レスポンスのHTML内容を出力

上記のコードは、requests.get()を使ってhttps://example.comというWebページにGETリクエストを送り、そのレスポンス(HTMLの内容)を取得しています。response.textには、HTMLの内容が文字列として格納されています。

HTTPリクエストの種類

HTTPには、いくつかのリクエストメソッドがあります。最も一般的なものは以下の通りです。

  • GET: サーバーからデータを取得するためのリクエスト
  • POST: サーバーにデータを送信するためのリクエスト
  • PUT: サーバー上のデータを更新するためのリクエスト
  • DELETE: サーバー上のデータを削除するためのリクエスト

Webスクレイピングでは、主にGETメソッドを使ってWebページのデータを取得しますが、場合によってはPOSTリクエストを使うこともあります。

ステータスコードの確認

HTTPリクエストの結果には、ステータスコードと呼ばれるコードが含まれています。これにより、リクエストが成功したかどうかを確認できます。以下は一般的なステータスコードです。

  • 200: リクエストが成功し、レスポンスが正常に返された
  • 404: リクエストしたページが見つからなかった
  • 500: サーバー側でエラーが発生した

requestsを使ってステータスコードを確認するには、以下のようにします。

response = requests.get(url)
if response.status_code == 200:
print("リクエストが成功しました")
else:
print(f"エラーが発生しました: {response.status_code}")

これで、リクエストが正常に処理されたかどうかを確認できます。

ヘッダー情報の設定

Webスクレイピングでは、場合によってはリクエストヘッダーを設定する必要があります。多くのWebサイトは、ブラウザからのリクエストに応答するため、スクリプトからのリクエストを検出してブロックすることがあります。これを回避するために、ヘッダーに「User-Agent」を指定して、あたかもブラウザからリクエストしているかのように見せることができます。

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

response = requests.get(url, headers=headers)
print(response.text)

このコードでは、headers辞書を作成し、その中にUser-Agentを指定しています。これにより、サーバーはリクエストがブラウザから送信されたものだと認識する可能性が高まります。

2. BeautifulSoupライブラリの基本

次に、取得したHTMLを解析するために使用するライブラリ、BeautifulSoupについて説明します。BeautifulSoupは、HTMLやXMLを簡単に解析できるPythonライブラリで、Webページから特定のデータを抽出するのに非常に役立ちます。

BeautifulSoupのインストール

まず、BeautifulSoupをインストールします。beautifulsoup4パッケージと、HTMLのパーサとしてlxmlもインストールしておくと便利です。

pip install beautifulsoup4 lxml

HTMLの解析

BeautifulSoupを使うと、HTMLの構造をツリー状に解析でき、特定の要素を簡単に取得できます。以下は基本的な使用例です。

from bs4 import BeautifulSoup

html = """
<html>
<head><title>サンプルページ</title></head>
<body>
<h1>見出し1</h1>
<p>これはサンプルの段落です。</p>
<a href="https://example.com">リンク</a>
</body>
</html>
"""

soup = BeautifulSoup(html, 'lxml')

# タイトルの取得
print(soup.title.text) # サンプルページ

# 見出しの取得
print(soup.h1.text) # 見出し1

# 段落の取得
print(soup.p.text) # これはサンプルの段落です。

# リンクの取得
print(soup.a['href']) # https://example.com

この例では、HTMLをBeautifulSoupオブジェクトとして読み込み、その後、特定のタグや属性を簡単に取得しています。

find()とfind_all()メソッド

BeautifulSoupでは、特定のタグを検索するために、find()やfind_all()メソッドを使用します。

  • find(): 最初に見つかった要素を返す
  • find_all(): 条件に一致するすべての要素をリストで返す
# 単一のタグを取得
heading = soup.find('h1')
print(heading.text) # 見出し1

# すべての段落を取得
paragraphs = soup.find_all('p')
for p in paragraphs:
print(p.text)

特定の属性を持つ要素の検索

Webページには、classやidなどの属性を持つ要素が多く存在します。これらの属性を使って特定の要素を検索することができます。

html = """
<html>
<body>
<p class="intro">はじめに</p>
<p class="content">本文</p>
<p class="content">さらに本文</p>
</body>
</html>
"""

soup = BeautifulSoup(html, 'lxml')

# class属性がcontentの段落をすべて取得
content_paragraphs = soup.find_all('p', class_='content')
for p in content_paragraphs:
print(p.text)

このコードでは、class属性がcontentの段落をすべて検索し、それらのテキストを出力しています。

3. 実際のWebページからのデータ取得

次に、実際のWebページを対象に、requestsとBeautifulSoupを組み合わせてデータを取得する例を見ていきましょう。

たとえば、ニュースサイトの見出しやリンクを取得したい場合、以下のようにコードを組みます。

import requests
from bs4 import BeautifulSoup

url = 'https://news.ycombinator.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'lxml')

# ニュースの見出しとリンクを取得
for item in soup.find_all('a', class_='storylink'):
title = item.text
link = item['href']
print(f"タイトル: {title}")
print(f"リンク: {link}")
print('---')

このコードでは、Hacker Newsというニュースサイトから記事のタイトルとリンクを取得しています。class_=’storylink’という条件で、ニュースの見出しリンクをすべて検索し、それらを出力しています。

タイトル: A New Way to Teach Programming
リンク: https://example.com/new-way-teach
---
タイトル: The Future of AI in Healthcare
リンク: https://example.com/future-ai-healthcare
---

実行結果の例

このように、Pythonを使ってWebページからデータを自動的に取得し、それを任意の形式で出力することができます。

まとめ


初心者におすすめ!プログラミングスクールのススメ

未経験でも気軽に!サブスク型プログラミングスクール【Freeks】

プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。

独学の挫折率、驚きの87.5%!

独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。

有料と無料、スクールの違いは?

プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:

  • 受講条件が異なる
  • 学べるスキルやカリキュラム内容が異なる
  • 就職や転職のサポート内容が異なる

どちらが自分に合っているか、よく考えて選ぶのが大事です。

サブスク型プログラミングスクール『FREEKS(フリークス)』に注目!

プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:

  • 未経験者向けのわかりやすいカリキュラム
  • 経験豊富なエンジニアのサポート
  • オンラインで自分のペースで学習可能

なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。

終了後は副業もサポート!

カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。

独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
 ↓ ↓ こちらをクリック ↓ ↓ 

p-school

Share
Published by
p-school

Recent Posts

第6章: PHPのデータベース操作

PHPを使用してデータベースに…

2週間 ago

第5章: PHPのオブジェクト指向プログラミング(OOP)

オブジェクト指向プログラミング…

2週間 ago

第4章: PHPの関数

プログラミングにおいて、関数は…

2週間 ago

第3章: PHPの配列とコレクション

PHPでの配列とコレクションの…

2週間 ago

第2章: PHPの基本文法

PHPの基本的な構文や使い方を…

2週間 ago