ホーム フィンテック 暗号通貨 Python を使用した Web スクレイピング: ステップバイステップ ガイド

Python を使用した Web スクレイピング: ステップバイステップ ガイド


Web スクレイピングは、Web サイトから情報を抽出し、それを特定のユースケースに使用するというアイデアです。

Web ページからテーブルを抽出して JSON ファイルに変換し、その JSON ファイルを内部ツールの構築に使用しようとしているとします。 Web スクレイピングを利用すると、Web ページ内の特定の要素をターゲットにして、必要なデータを抽出できます。 Python を使用した Web スクレイピングは、データを効果的に抽出するための BeautifulSoup や Scrapy などの複数のライブラリを Python が提供しているため、非常に人気のある選択肢です。

ウェブスクレイピング
ウェブスクレイピング

データを効率的に抽出するスキルを持つことも、開発者またはデータ サイエンティストとして非常に重要です。この記事は、Web サイトを効果的にスクレイピングし、必要に応じて Web サイトを操作するために必要なコンテンツを取得する方法を理解するのに役立ちます。このチュートリアルでは、 BeautifulSoupパッケージを使用します。これは、Python でデータをスクレイピングするためのトレンディーなパッケージです。

Web スクレイピングに Python を使用する理由

Python は、多くの開発者にとって、Web スクレイパーを構築する際の最初の選択肢です。 Python が最初の選択肢となる理由はたくさんありますが、この記事では、データ スクレイピングに Python が使用される主な 3 つの理由について説明します。

ライブラリとコミュニティのサポート: BeautifulSoup、Scrapy、Selenium など、Web ページを効果的にスクレイピングするための優れた機能を提供する優れたライブラリがいくつかあります。 Web スクレイピングのための優れたエコシステムを構築しています。また、世界中の多くの開発者がすでに Python を使用しているため、行き詰まったときにすぐにヘルプを得ることができます。

自動化: Python は自動化機能で有名です。スクレイピングに依存する複雑なツールを作成しようとしている場合は、Web スクレイピング以上のものが必要です。たとえば、オンライン ストアの商品の価格を追跡するツールを構築したい場合は、毎日の価格を追跡してデータベースに追加できるように、自動化機能を追加する必要があります。 Python を使用すると、このようなプロセスを簡単に自動化できます。

データの視覚化: Web スクレイピングはデータ サイエンティストによって頻繁に使用されます。データ サイエンティストは、多くの場合、Web ページからデータを抽出する必要があります。 Pandas のようなライブラリを使用すると、Python は生データからのデータ視覚化をより簡単にします。

Python での Web スクレイピング用のライブラリ

Python では、Web スクレイピングを簡単にするために利用できるライブラリがいくつかあります。ここでは最も人気のある 3 つのライブラリについて説明します。

#1.美しいスープ

Web スクレイピング用の最も人気のあるライブラリの 1 つ。 BeautifulSoup は、 2004 年以来、開発者による Web ページのスクレイピングを支援してきました。これは、解析ツリーをナビゲート、検索、変更するための簡単な方法を提供します。 Beautifulsoup 自体も、受信データと送信データのエンコードを行います。よく維持されており、素晴らしいコミュニティがあります。

#2.スクレイピー

データ抽出のためのもう 1 つの人気のあるフレームワーク。 Scrapy にGitHub上に 43000 を超えるスターが付いています。 API からデータを収集するためにも使用できます。また、電子メールの送信など、いくつかの興味深い組み込みサポートもあります。

#3.セレン

Selenium は主に Web スクレイピング ライブラリではありません。代わりに、これはブラウザ自動化パッケージです。ただし、Web ページをスクレイピングするためにその機能を簡単に拡張できます。さまざまなブラウザを制御するために WebDriver プロトコルを使用します。 Selenium は 20 年近く市場に出回っています。しかし、Selenium を使用すると、Web ページからデータを簡単に自動化し、収集することができます。

Python Webスクレイピングの課題

Web サイトからデータを収集しようとすると、多くの課題に直面する可能性があります。遅いネットワーク、スクレイピング対策ツール、IP ベースのブロック、キャプチャ ブロックなどの問題があります。これらの問題は、Web サイトをスクレイピングしようとすると大きな問題を引き起こす可能性があります。

ただし、いくつかの方法に従うことで、問題を効果的に回避できます。たとえば、ほとんどの場合、特定の時間間隔で一定量を超えるリクエストが送信されると、Web サイトによって IP アドレスがブロックされます。 IP ブロッキングを回避するには、リクエストの送信後に冷却するようにスクレイパーをコーディングする必要があります。

Webスクレイピングの課題
Webスクレイピングの課題

開発者はスクレーパーのためにハニーポット トラップを設置する傾向もあります。これらの罠は通常、人間の肉眼では見えませんが、スクレーパーで這うことができます。このようなハニーポット トラップを設置する Web サイトをスクレイピングしている場合は、それに応じてスクレイパーをコーディングする必要があります。

キャプチャはスクレイパーに関するもう 1 つの深刻な問題です。現在、ほとんどの Web サイトではキャプチャを使用して、ボットによるページへのアクセスを保護しています。このような場合、キャプチャ ソルバーの使用が必要になる場合があります。

Python を使用して Web サイトをスクレイピングする

先ほど説明したように、BeautifulSoup を使用して Web サイトをスクラップします。このチュートリアルでは、Coingecko からイーサリアムの履歴データをスクレイピングし、テーブル データを JSON ファイルとして保存します。スクレーパーの構築に進みましょう。

最初のステップは、BeautifulSoup と Requests をインストールすることです。このチュートリアルでは、 Pipenv を使用します。 Pipenv は、Python の仮想環境マネージャーです。必要に応じてVenvを使用することもできますが、私は Pipenv を好みます。 Pipenv についての説明は、このチュートリアルの範囲を超えています。ただし、Pipenv の使用方法を知りたい場合は、 このガイドに従ってください。または、Python 仮想環境を理解したい場合は、このガイドに従ってください。

コマンド Pipenv shell を実行して、プロジェクト ディレクトリでpipenv shellを起動します。仮想環境でサブシェルが起動されます。次に、BeautifulSoup をインストールするには、次のコマンドを実行します。

 pipenv install beautifulsoup4

また、インストール リクエストの場合は、上記と同様のコマンドを実行します。

 pipenv install requests

インストールが完了したら、必要なパッケージをメイン ファイルにインポートします。 main.pyというファイルを作成し、以下のようにパッケージをインポートします。

 from bs4 import BeautifulSoup
import requests
import json

次のステップでは、履歴データ ページのコンテンツを取得し、BeautifulSoup で利用可能な HTML パーサーを使用してそれらを解析します。

 r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel')

soup = BeautifulSoup(r.content, 'html.parser')

上記のコードでは、リクエスト ライブラリで使用可能なgetメソッドを使用してページにアクセスします。解析されたコンテンツは、 soupという変数に保存されます。

ここからオリジナルのスクレイピング部分が始まります。まず、DOM 内でテーブルを正しく識別する必要があります。 このページを開いて、ブラウザで利用可能な開発者ツールを使用して調べると、テーブルtable table-striped text-sm text-lg-normalというクラスがあることがわかります。

Coingecko イーサリアム履歴データ表
コインゲッコ
コインゲッコ

このテーブルを正しくターゲットにするには、 findメソッドを使用できます。

 table = soup.find('table', attrs={'class': 'table table-striped text-sm text-lg-normal'})

table_data = table.find_all('tr')

table_headings = []

for th in table_data[0].find_all('th'):
    table_headings.append(th.text)

上記のコードでは、まず、 soup.findメソッドを使用してテーブルが検索され、次にfind_allメソッドを使用して、テーブル内のすべてのtr要素が検索されます。これらのtr要素は、 table_dataという変数に格納されます。テーブルにはタイトルのいくつかth要素があります。 table_headingsと呼ばれる新しい変数は、リスト内のタイトルを保持するために初期化されます。

次に、テーブルの最初の行に対して for ループが実行されます。この行では、 thを持つすべての要素が検索され、そのテキスト値がtable_headingsリストに追加されます。テキストはtextメソッドを使用して抽出されます。ここでtable_headings変数を出力すると、次の出力が表示されます。

 ['Date', 'Market Cap', 'Volume', 'Open', 'Close']

次のステップでは、残りの要素を取得し、行ごとに辞書を生成し、行をリストに追加します。

 for tr in table_data:
    th = tr.find_all('th')
    td = tr.find_all('td')

    data = {}

    for i in range(len(td)):
        data.update({table_headings[0]: th[0].text})
        data.update({table_headings[i+1]: td[i].text.replace('\n', '')})

    if data.__len__() > 0:
        table_details.append(data)

これはコードの重要な部分です。 table_data変数内の各trについて、最初にth要素が検索されます。 th要素は、表に示されている日付です。これらのth要素は変数th内に格納されます。同様に、すべてのtd要素はtd変数に格納されます。

空の辞書data初期化されます。初期化後、 td要素の範囲をループします。各行について、まず、辞書の最初のフィールドをthの最初の項目で更新します。コードtable_headings[0]: th[0].text日付と最初のth要素のキーと値のペアを割り当てます。

最初の要素を初期化した後、 data.update({table_headings[i+1]: td[i].text.replace('\\n', '')})使用して他の要素が割り当てられます。ここでは、最初にtextメソッドを使用してtd要素のテキストが抽出され、次にreplaceメソッドを使用してすべての\\nが置き換えられます。 i 番目の要素はすでに割り当てられているため、値はtable_headingsリストのi i+1番目の要素に割り当てられます。

次に、 dataディクショナリの長さがゼロを超える場合、そのディクショナリをtable_detailsリストに追加します。 table_detailsリストを印刷して確認できます。ただし、値を JSON ファイルに書き込みます。このコードを見てみましょう。

 with open('table.json', 'w') as f:
    json.dump(table_details, f, indent=2)
    print('Data saved to json file...')

ここではjson.dumpメソッドを使用して、 table.jsonという JSON ファイルに値を書き込みます。書き込みが完了したら、 Data saved to json file...コンソールに出力します。

次に、次のコマンドを使用してファイルを実行します。

 python run main.py

しばらくすると、コンソールに「JSON ファイルに保存されたデータ」というテキストが表示されるようになります。作業ファイル ディレクトリには、table.json という新しいファイルも表示されます。ファイルは次の JSON ファイルのようになります。

 [
  {
    "Date": "2022-11-27",
    "Market Cap": "$145,222,050,633",
    "Volume": "$5,271,100,860",
    "Open": "$1,205.66",
    "Close": "N/A"
  },
  {
    "Date": "2022-11-26",
    "Market Cap": "$144,810,246,845",
    "Volume": "$5,823,202,533",
    "Open": "$1,198.98",
    "Close": "$1,205.66"
  },
  {
    "Date": "2022-11-25",
    "Market Cap": "$145,091,739,838",
    "Volume": "$6,955,523,718",
    "Open": "$1,204.21",
    "Close": "$1,198.98"
  },
// ...
// ... 
]

Python を使用して Web スクレイパーを正常に実装しました。完全なコードを表示するには、このGitHub リポジトリにアクセスしてください。

結論

この記事では、単純な Python スクレイピングを実装する方法について説明しました。 BeautifulSoup を使用して Web サイトからデータを迅速にスクレイピングする方法について話し合いました。また、他の利用可能なライブラリと、多くの開発者が Web サイトをスクレイピングする際に Python が最初の選択肢となる理由についても説明しました。

これらの Web スクレイピング フレームワークも参照してください。

「 Python を使用した Web スクレイピング: ステップバイステップ ガイド」についてわかりやすく解説!絶対に観るべきベスト2動画

【PythonでWebスクレイピング】Beautiful Soupの使い方解説! 〜 初心者向け 〜 プログラミング入門
【Webスクレイピング超入門】2時間で基礎を完全マスター!PythonによるWebスクレイピング入門 連結版