Pythonを使ったWebスクレイピングの基本は、Webページからデータを取得し、それを解析することにあります。この章では、requestsライブラリを使ってWebページのHTMLを取得し、BeautifulSoupライブラリでそのHTMLを解析する方法を詳しく解説します。
Webページには多くの種類があり、その内容は静的なものと動的なものに分かれます。静的なWebページでは、HTMLはサーバーから送信されたままブラウザに表示されますが、動的なWebページでは、JavaScriptなどのスクリプトによって表示内容が変化します。この章では、まず静的なWebページからのデータの取得方法を学び、動的なページへの対処方法は後の章で扱います。
PythonでHTTPリクエストを行うためには、標準ライブラリのurllibを使うこともできますが、より簡便で扱いやすいライブラリとしてrequestsが広く利用されています。requestsは、HTTPリクエストを行い、WebページのHTMLを取得するのに非常に便利なツールです。
まず、requestsライブラリがインストールされていない場合は、次のコマンドでインストールしてください。
pip install requests
次に、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には、いくつかのリクエストメソッドがあります。最も一般的なものは以下の通りです。
Webスクレイピングでは、主にGETメソッドを使ってWebページのデータを取得しますが、場合によってはPOSTリクエストを使うこともあります。
HTTPリクエストの結果には、ステータスコードと呼ばれるコードが含まれています。これにより、リクエストが成功したかどうかを確認できます。以下は一般的なステータスコードです。
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を指定しています。これにより、サーバーはリクエストがブラウザから送信されたものだと認識する可能性が高まります。
次に、取得したHTMLを解析するために使用するライブラリ、BeautifulSoupについて説明します。BeautifulSoupは、HTMLやXMLを簡単に解析できるPythonライブラリで、Webページから特定のデータを抽出するのに非常に役立ちます。
まず、BeautifulSoupをインストールします。beautifulsoup4パッケージと、HTMLのパーサとしてlxmlもインストールしておくと便利です。
pip install beautifulsoup4 lxml
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オブジェクトとして読み込み、その後、特定のタグや属性を簡単に取得しています。
BeautifulSoupでは、特定のタグを検索するために、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の段落をすべて検索し、それらのテキストを出力しています。
次に、実際の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ページからデータを自動的に取得し、それを任意の形式で出力することができます。
この章では、requestsとBeautifulSoupを使ってシンプルなWebページからデータを取得する基本技術について学びました。HTTPリクエストを送信してHTMLを取得し、それをBeautifulSoupで解析するという基本的な流れを理解できたと思います。
プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。
独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。
プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:
どちらが自分に合っているか、よく考えて選ぶのが大事です。
プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:
なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。
カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。
独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
↓ ↓ こちらをクリック ↓ ↓