
Web スクレイピングとは、Web サイトから情報を抽出し、特定のユース ケースに使用するという考え方です。
Web ページからテーブルを抽出し、それを JSON ファイルに変換し、JSON ファイルを使用していくつかの内部ツールを構築しようとしているとします。 Web スクレイピングを使用すると、Web ページ内の特定の要素をターゲットにして、必要なデータを抽出できます。 Python を使用した Web スクレイピングは、Python が BeautifulSoup や Scrapy などの複数のライブラリを提供してデータを効果的に抽出できるため、非常に一般的な選択肢です。
データを効率的に抽出するスキルを持つことも、開発者またはデータ サイエンティストとして非常に重要です。 この記事は、ウェブサイトを効果的にスクレイピングし、必要に応じて操作するために必要なコンテンツを取得する方法を理解するのに役立ちます. このチュートリアルでは、BeautifulSoup パッケージを使用します。 Pythonでデータをスクレイピングするためのトレンディなパッケージです。
Web スクレイピングに Python を使用する理由
Python は、多くの開発者が Web スクレイパーを構築する際に最初に選択するものです。 Python が最初の選択肢である理由はたくさんありますが、この記事では、Python がデータ スクレイピングに使用される 3 つの主な理由について説明します。
ライブラリとコミュニティのサポート: BeautifulSoup、Scrapy、Selenium など、Web ページを効果的にスクレイピングするための優れた機能を提供する優れたライブラリがいくつかあります。 Webスクレイピングの優れたエコシステムを構築しており、世界中の多くの開発者がすでにPythonを使用しているため、行き詰まったときにすぐに助けを得ることができます.
自動化: Python は自動化機能で有名です。 スクレイピングに依存する複雑なツールを作成しようとしている場合は、Web スクレイピング以上のものが必要です。 たとえば、オンライン ストアのアイテムの価格を追跡するツールを作成する場合は、自動化機能を追加して、毎日料金を追跡し、データベースに追加できるようにする必要があります。 Python を使用すると、このようなプロセスを簡単に自動化できます。
データの視覚化: Web スクレイピングは、データ サイエンティストによって頻繁に使用されます。 データ サイエンティストは、多くの場合、Web ページからデータを抽出する必要があります。 Pandas のようなライブラリを使用すると、Python は生データからデータを簡単に視覚化できます。
Python での Web スクレイピング用ライブラリ
Web スクレイピングを簡単にするために Python で利用できるライブラリがいくつかあります。 ここでは、最も人気のある 3 つのライブラリについて説明します。
#1。 美しいスープ
Web スクレイピング用の最も人気のあるライブラリの 1 つ。 BeautifulSoup は、2004 年以来、開発者が Web ページをスクレイピングするのを支援してきました。解析ツリーをナビゲート、検索、および変更するための簡単な方法を提供します。 Beautifulsoup 自体も、受信データと送信データのエンコードを行います。 よく管理されており、素晴らしいコミュニティがあります。
#2。 スクレイピー
データ抽出のためのもう 1 つの一般的なフレームワーク。 Scrapy は GitHub で 43000 を超えるスターを獲得しています。 また、API からデータをスクレイピングするためにも使用できます。 また、電子メールの送信など、興味深い組み込みサポートもいくつかあります。
#3。 セレン
Selenium は、主に Web スクレイピング ライブラリではありません。 代わりに、これはブラウザー自動化パッケージです。 しかし、ウェブページをスクレイピングする機能を簡単に拡張できます。 さまざまなブラウザーを制御するために WebDriver プロトコルを使用します。 Selenium は、20 年近く市場に出回っています。 しかし、Selenium を使用すると、Web ページからデータを簡単に自動化およびスクレイピングできます。
Python Web スクレイピングの課題
Web サイトからデータをスクレイピングしようとすると、多くの課題に直面する可能性があります。 遅いネットワーク、アンチ スクレイピング ツール、IP ベースのブロック、キャプチャ ブロックなどの問題があります。これらの問題は、Web サイトをスクレイピングしようとすると大きな問題を引き起こす可能性があります。
ただし、いくつかの方法に従うことで、課題を効果的に回避できます。 たとえば、ほとんどの場合、特定の時間間隔で一定量以上のリクエストが送信されると、Web サイトによって IP アドレスがブロックされます。 IP ブロックを回避するには、リクエストの送信後にスクレイパーが冷却されるようにスクレイパーをコーディングする必要があります。
開発者は、スクレイパーにハニーポット トラップを配置する傾向もあります。 これらのトラップは通常、肉眼では見えませんが、スクレーパーで這うことができます。 このようなハニーポット トラップを配置する Web サイトをスクレイピングする場合は、それに応じてスクレイパーをコーディングする必要があります。
キャプチャは、スクレーパーのもう 1 つの深刻な問題です。 現在、ほとんどの Web サイトはキャプチャを使用して、ボットによるページへのアクセスを保護しています。 このような場合、キャプチャ ソルバーを使用する必要がある場合があります。
Python で Web サイトをスクレイピングする
説明したように、BeautifulSoup を使用して Web サイトをスクラップします。 このチュートリアルでは、Coingecko から Ethereum の履歴データをスクレイピングし、テーブル データを JSON ファイルとして保存します。 スクレーパーの作成に移りましょう。
最初のステップは、BeautifulSoup と Requests をインストールすることです。 このチュートリアルでは、Pipenv を使用します。 Pipenv は、Python 用の仮想環境マネージャーです。 必要に応じて Venv を使用することもできますが、私は Pipenv の方が好みです。 Pipenv についての議論は、このチュートリアルの範囲を超えています。 ただし、Pipenv の使用方法を知りたい場合は、このガイドに従ってください。 または、Python 仮想環境を理解したい場合は、このガイドに従ってください。
コマンド pipenv shell を実行して、プロジェクト ディレクトリで Pipenv シェルを起動します。 仮想環境でサブシェルを起動します。 次に、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-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 内に格納されます。 同様に、すべての td 要素が td 変数に格納されます。
空の辞書データが初期化されます。 初期化の後、td 要素の範囲をループします。 各行について、まず辞書の最初のフィールドを th の最初の項目で更新します。 コード table_headings[0]: 番目[0].text は、日付と最初の th 要素のキーと値のペアを割り当てます。
最初の要素を初期化した後、他の要素は data.update({table_headings を使用して割り当てられます[i+1]: td[i].text.replace(‘n’, ”)})。 ここでは、最初に text メソッドを使用して td 要素のテキストが抽出され、次に replace メソッドを使用してすべての n が置き換えられます。 次に、i 番目の要素が既に割り当てられているため、値は table_headings リストの i+1 番目の要素に割り当てられます。
次に、データ ディクショナリの長さが 0 を超える場合は、そのディクショナリを 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 スクレイプを実装する方法について説明しました。 Web サイトからデータをすばやくスクレイピングするために BeautifulSoup を使用する方法について説明しました。 また、他の利用可能なライブラリと、多くの開発者が Web サイトをスクレイピングするために Python を最初に選択する理由についても説明しました。
これらの Web スクレイピング フレームワークも参照してください。