【コード付】PythonでWebスクレイピングをおこなう方法

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年7月)

✔当記事は以下のような方へおすすめの記事です

「Pythonでwebスクレイピングを始めたいけど何から始めればいいの?」

「Pythonでwebスクレイピングの手法を掴みたい」

「Pythonでwebスクレイピングの具体例が見たい」

✔当記事を読めば以下のようなことが学べます

  • Pythonを使用したwebスクレイピングの基本知識
  • Pythonを使用したwebスクレイピングの具体的な手法とその応用
  • Pythonによるwebスクレイピングの実例

当記事では、Pythonを用いたwebスクレイピングの基本から応用法まで、具体的な例を通じて詳細に解説します。

最後まで読んで、webスクレイピングの成功へ一歩近づきましょう!

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Webスクレイピングの概要

こちらでは、Webスクレイピングの基本的な意味とその可能性についてお伝えしていきます。

スクレイピングの一般的手順と、使用されるライブラリの選択についてもご覧ください。

  • Webスクレイピングの意味と可能性
  • スクレイピングの一般的手順
  • Pythonでスクレイピングをする理由
  • ライブラリとその選択:RequestsからBeautifulSoupまで

Webスクレイピングの意味と可能性

Webスクレイピングは、ウェブページから情報を抽出するプロセスです。

これを使用して、ニュース記事や製品の価格、株価など、ウェブ上のあらゆる情報を自動的に収集できます。

データ分析や機械学習のプロジェクトで使用されるデータセットを作成するためによく使用されます。

スクレイピングの一般的手順

スクレイピングの基本的な手順は、以下のとおり。

  • ウェブページにアクセスし、HTMLデータを取得する
  • 取得したHTMLデータから必要な情報をパース(解析)して抽出
  • 抽出されたデータを所定の形式で保存

Pythonでスクレイピングをする理由

Pythonは、そのシンプルな構文と豊富なライブラリにより、Webスクレイピングに非常に適しています。

主に以下のようなメリットがあります。

  • Pythonのコードは読みやすい
  • 初心者でも短期間で学べる
  • 豊富なライブラリが存在する
  • 取得したデータを機械学習やデータ分析で使える

また、Pythonのコミュニティは活発で、Webスクレイピングに関する多くのリソースが利用可能です。

ライブラリとその選択:RequestsからBeautifulSoupまで

Pythonには、RequestsやBeautifulSoupなど、Webスクレイピングに役立つライブラリがいくつかあります。

  • Requests:ウェブページにアクセスしてHTMLデータを取得する
  • BeautifulSoup:HTMLデータをパースして情報を抽出する

スクレイピング開始:Pythonライブラリ活用

こちらでは、PythonのRequestsライブラリを使用してHTMLデータを取得し、BeautifulSoupでタイトルやURLを取得する方法を解説します。

  • PythonとRequests:HTMLデータ取得
  • Requestsの使い方詳細
  • BeautifulSoupとタイトル、URL取得等

requestsライブラリのインストール

requestsライブラリを使用するにはpipを使ったインストールが必要です。

requestsは、標準で備わっているライブラリではありません。

pip install requests

pipのインストールなど、pipについて知りたい方はこちらをどうぞ。

またrequestsを使ったAPIからのデータ取得方法を知りたい方はこちらもご覧ください。

PythonでAPIを使いこなす|リクエストからAPI構築まで
PythonでAPIを使いこなしたいですか?当記事では、筆者が自作した無料のAPIをつかって、リクエスト・レスポンスを試してみたり、実際に構築した方法を解説しています。実際のコード付きなので、初心者の方は必見です。

requestsそのものについてはこちらもどうぞ。

【便利】Pythonのrequestsとは?コード付きで徹底解説
Pythonの「requests」ライブラリを活用する手法を学びたいですか?requestsライブラリはPythonにおけるHTTP通信をシンプルに実行するためのツールです。当記事では、「requests」ライブラリの使用方法を実際のコードを用いて詳しく解説します。特にPython初心者やrequestsライブラリに新しい方は必見です。

PythonとRequests:HTMLデータ取得

PythonのRequestsライブラリを使用すれば、HTMLデータを取得するのは非常に簡単です。

requests.get(URL)の形式で、URLにアクセスしてHTMLデータを取得できます。

import requests

def get_html_data(url):
    response = requests.get(url)

    # レスポンスのステータスコードが200(成功)の場合のみ処理を続行
    if response.status_code == 200:
        html_data = response.text
        return html_data
    else:
        print("Error: Failed to get HTML data.")
        return None

# ウェブサイトのURLを指定
url = "https://example.com"

# HTMLデータを取得
html_data = get_html_data(url)

# 取得したHTMLデータを表示
if html_data:
    print(html_data)

Requestsの使い方詳細

Requestsライブラリは多機能で、ヘッダーやクエリパラメータをカスタマイズしてHTTPリクエストを送れます。

また、レスポンスのステータスコードやヘッダー情報も確認可能です。

import requests

def get_response(url, headers=None, params=None):
    response = requests.get(url, headers=headers, params=params)

    # レスポンスのステータスコードとヘッダー情報を表示
    print("Status Code:", response.status_code)
    print("Headers:", response.headers)

    return response

# ウェブサイトのURLを指定
url = "https://example.com"

# カスタムヘッダーを指定
custom_headers = {
    "User-Agent": "MyApp/1.0",
    "Authorization": "Bearer my-api-key"
}

# クエリパラメータを指定
query_params = {
    "page": 1,
    "limit": 10
}

# HTTPリクエストを送信してレスポンスを取得
response = get_response(url, headers=custom_headers, params=query_params)

# レスポンスの内容を表示
print("Response Content:")
print(response.text)

BeautifulSoupとタイトル、URL取得等

BeautifulSoupを使用すると、HTMLデータから特定の要素を抽出が簡単になります。

import requests
from bs4 import BeautifulSoup

def get_links_from_url(url):
    # URLからHTMLデータを取得
    response = requests.get(url)
    html_data = response.text

    # BeautifulSoupオブジェクトを作成
    soup = BeautifulSoup(html_data, 'html.parser')

    # すべての<a>要素を抽出
    links = soup.find_all('a')

    return links

# ウェブサイトのURLを指定
url = "https://example.com"

# URLからリンクを抽出
links = get_links_from_url(url)

# 抽出したリンクを表示
for link in links:
    print(link['href'])

soup.find_all(‘a’)は、すべてのリンクを抽出するための具体例です。

上級スクレイピング:SeleniumとScrapyの利用

こちらでは、動的なウェブページに対応するSeleniumと、より高度なスクレイピングのためのScrapyの利用について解説します。

  • Selenium:動的ページへの対応とインスタログイン
  • Scrapy:より進行なスクレイピング

Selenium:動的ページへの対応とインスタログイン

Seleniumはウェブブラウザを自動操作するためのライブラリ。

JavaScriptで動的に生成されるコンテンツを扱う場合に役立ちます。

例えば、Instagramにログインして、データを収集する際などに使えるものです。

まず、Seleniumをインストールします。

pip install selenium

次に、以下のコードを実行してInstagramにログインします。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# Chromeドライバーのパスを指定
driver_path = 'path/to/chromedriver'

# Chromeドライバーを起動
driver = webdriver.Chrome(executable_path=driver_path)

# Instagramのログインページにアクセス
driver.get("https://www.instagram.com/accounts/login/")

# ログイン情報を入力
username = "Your_Instagram_Username"
password = "Your_Instagram_Password"

username_input = driver.find_element_by_name("username")
password_input = driver.find_element_by_name("password")

username_input.send_keys(username)
password_input.send_keys(password)

# ログインボタンをクリック
login_button = driver.find_element_by_xpath('//button[@type="submit"]')
login_button.click()

# ログインに少し時間がかかる場合に備えて待機
time.sleep(5)

# ログイン後のページを表示
print("ログイン後のページタイトル:", driver.title)

# ブラウザを閉じる
driver.quit()

Seleniumを使用する際には、対象のウェブサイトの利用規約に従うことを忘れないでください。無許可でのウェブサイトの自動操作は、違法行為とみなされる可能性があります。

Scrapy:より進行なスクレイピング

Scrapyは、Pythonのフレームワークで、大規模なウェブサイトからデータを効率的に抽出するためのツールを提供します。

Scrapyを使用すると、複数のページにわたるデータを一度に取得するクローラーが作成可能。

以下では、新しいScrapyプロジェクトを開始し、クローラー(スパイダー)を作成して実行するための基本的なPythonコードの例を提供します。

こちらでは、quotes.toscrape.comから引用を抽出します。

プロジェクトの開始

まず、新しいScrapyプロジェクトを開始。

myprojectという名前の新しいディレクトリを作成しましょう。

scrapy startproject myproject

ディレクトリ内には、プロジェクトの設定とスパイダーを含むいくつかのファイルが含まれます。

スパイダーの作成

次に、引用を抽出するための新しいスパイダーを作成してください。

スパイダーはmyproject/spidersディレクトリ内に保存されます。

myproject/spiders/quotes_spider.pyという新しいファイルを作成し、次のコードを追加しましょう。

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"

    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('span small::text').get(),
            }

        next_page = response.css('li.next a::attr(href)').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

スパイダーの実行

こちらがスパイダーを実行するコマンドです。

scrapy crawl quotes

各ページから引用とその作者を抽出し、次ページへと進みます。

コンソールに表示される情報を確認しましょう。

なお、Scrapyフレームワークは詳細な設定や多機能を提供しています。

具体的な要求に基づいてスパイダーのカスタマイズが可能です。

Pythonとデータ分析:情報解析への応用

こちらでは、Pythonで取得したデータを解析し、情報の価値を引き出す方法について解説します。

  • Pandasでの株価情報取得と保存
  • newspaper3kでのキーワードに基づくニュースサマリー情報取得

Pandasでの株価情報取得と保存

Pandasライブラリを活用すると、Webスクレイピングで取得したデータを解析しやすい形に整理し、さらにCSVファイルとして保存できます。

以下は、Yahoo FinanceからAppleの株価情報を取得してCSVに保存するサンプルコードです。

import pandas as pd
import requests
from bs4 import BeautifulSoup

url = "https://finance.yahoo.com/quote/AAPL/history?p=AAPL"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

table = soup.find("table", {"data-test": "historical-prices"})
df = pd.read_html(str(table))[0]
df.to_csv('apple_stock_prices.csv', index=False)

このコードは、Yahoo FinanceのAppleの株価履歴ページからHTMLデータを取得し、BeautifulSoupで解析。

その後、Pandasを使ってテーブルデータをCSVファイルとして保存します。

newspaper3kでのキーワードに基づくニュースサマリー情報取得

newspaper3kライブラリを使用すると、特定のキーワードに基づくニュースのサマリー情報を効率的に取得することができます。

以下は、キーワードを指定して関連ニュースのサマリーを取得するサンプルコードです。

from newspaper import Article

url = "https://example-news-website.com/some-news-article"
article = Article(url)
article.download()
article.parse()
article.nlp()

print(article.title)
print(article.summary)

このコードは、指定されたURLのニュース記事をダウンロードし、解析して自然言語処理をおこないます。

その結果、記事のタイトルとサマリーが表示されるのです。

注意点・スクレイピングマナー

こちらでは、Webスクレイピングを行う際の法的な注意点とエチケットについて解説します。

  • 禁止されているサイト・法的な注意点
  • スクレイピング時のエチケット

禁止されているサイト・法的な注意点

Webスクレイピングは便利ですが、すべてのウェブサイトで許可されているわけではありません

robots.txtファイルをチェックし、サイトの利用規約を読むことが重要です。

またサーバーに負担をかけてしまうため、大量のリクエストを送らないようにしましょう。

スクレイピング時のエチケット

Webスクレイピングを行う際は、サーバーに負荷をかけないように注意し、必要なデータのみを取得するようにしましょう。

また、取得したデータを適切な方法で使用して、プライバシーを尊重することも重要です。

まとめ:PythonでのWebスクレイピング

当記事では、PythonでのWebスクレイピングについて学習してきました。

PythonでのWebスクレイピングは非常にパワフルです。

さまざまなデータを手軽に収集できるため、情報解析や自動化タスクに大いに役立つでしょう。

今回学んだ基本的なスキルをベースに、さらにPythonのライブラリやツールを学ぶことで、更なるスキルの向上を目指してください。。

タイトルとURLをコピーしました