ウェブサイト検索

Python と美しいスープを使用した Web スクレイピングのステップバイステップ ガイド


Web スクレイピングとその Python 実装の基本を学びます。また、Beautiful Soup ライブラリのさまざまなメソッドについても知ってください。

Web スクレイピングは、さまざまな Web サイトから HTML コンテンツを抽出するために使用される技術です。これらの Web スクレイパーは主に、HTTP プロトコルを使用して World Wide Web に直接アクセスし、この情報をさまざまなアプリケーションで使用できるコンピューター ボットです。データは非構造化形式で取得され、複数の前処理ステップを実行した後に構造化形式に変換されます。ユーザーはこのデータをスプレッドシートに保存したり、API を通じてエクスポートしたりできます。

Web スクレイピングは、Web ページからデータをコピーして貼り付けるだけで、小さな Web ページに対して手動で実行することもできます。しかし、大規模な複数の Web ページからのデータが必要な場合、このコピー アンド ペーストは機能しません。ここで、自動化された Web スクレイパーが登場します。これらは、多数の Web ページから短時間で大量のデータを抽出できるインテリジェントなアルゴリズムを使用しています。 

Webスクレイピングの用途

Web スクレイピングは、企業がオンラインで情報を収集および分析するための強力なツールです。さまざまな業界にわたって複数のアプリケーションがあります。以下にその一部をご紹介しますので、ぜひチェックしてみてください。

  1. マーケティング: Web スクレイピングは、一般大衆の感情を得るために、さまざまなソーシャル メディア Web サイトから製品やサービスに関する情報を収集するために多くの企業で使用されています。また、さまざまな Web サイトから電子メール ID を抽出し、これらの電子メール ID の所有者にプロモーション電子メールを大量に送信します。

  1. コンテンツ作成: ウェブ スクレイピングでは、ニュース記事、調査レポート、ブログ投稿などの複数のソースから情報を収集できます。クリエイターが高品質でトレンドのコンテンツを作成するのに役立ちます。

  1. 価格比較: Web スクレイピングを使用すると、複数の e コマース Web サイトにまたがる特定の商品の価格を抽出し、ユーザーに公正な価格比較を提供できます。また、企業が競合他社と競争するために製品の最適な価格設定を修正するのにも役立ちます。

  1. 求人情報: Web スクレイピングを使用して、複数の求人ポータルにわたるさまざまな求人情報のデータを収集し、この情報が多くの求職者や採用担当者に役立つようにすることもできます。

ここでは、Python と Beautiful Soup ライブラリを使用して簡単な Web スクレイパーを作成します。 HTML ページを解析し、そこから有用な情報を抽出します。このチュートリアルでは、唯一の前提条件として Python の基本を理解している必要があります。

コードの実装

私たちの実装は、以下に示す 4 つのステップで構成されます。

環境のセットアップ

プロジェクト用に別のディレクトリを作成し、コマンド プロンプトを使用して以下のライブラリをインストールします。最初に仮想環境を作成することが望ましいですが、仮想環境をグローバルにインストールすることもできます。

$ pip install requests
$ pip install bs4

requests モジュールは、URL から HTML コンテンツを抽出します。すべてのデータを、さらなる処理が必要な文字列として生の形式で抽出します。

bs4 は Beautiful Soup モジュールです。これは、「request」モジュールから取得した生の HTML コンテンツを適切に構造化された形式で解析します。

HTMLを取得する

そのディレクトリ内に Python ファイルを作成し、次のコードを貼り付けます。

import requests

url = "https://www.kdnuggets.com/"
res = requests.get(url)
htmlData = res.content
print(htmlData)

出力:

このスクリプトは、URL `/` からすべての生の HTML コンテンツを抽出します。この生データには、すべてのテキスト、段落、アンカー タグ、div などが含まれています。次のタスクは、そのデータを解析し、すべてのテキストとタグを個別に抽出することです。

HTMLを解析する

ここで、Beautiful Soup の役割が登場します。これは、上記で取得した生データを解析して整形するために使用されます。これにより、DOM のツリー状の構造が作成され、ツリーの枝に沿ってたどることができ、ターゲットのタグとオブジェクトを見つけることができます。

import requests
from bs4 import BeautifulSoup

url = "https://www.kdnuggets.com/"
res = requests.get(url)
htmlData = res.content
parsedData = BeautifulSoup(htmlData, "html.parser")
print(parsedData.prettify())

出力:

上記の出力では、Beautiful Soup が適切なインデントを備えたより構造化された形式でコンテンツを提示していることがわかります。関数 BeautifulSoup() は 2 つの引数を受け取ります。1 つは入力 HTML、もう 1 つはパーサーです。現在は html.parser を使用していますが、lxmlhtml5lib などの他のパーサーもあります。それらにはそれぞれ長所と短所があります。より寛大なものもあれば、非常に速いものもあります。パーサーの選択は完全にユーザーの選択に依存します。以下は、チェックアウトできるパーサーとその長所と短所のリストです。

HTML ツリー トラバーサル

このセクションでは、HTML のツリー構造を理解し、Beautiful Soup を使用して解析されたコンテンツからタイトル、さまざまなタグ、クラス、リストなどを抽出します。

HTML ツリーは階層的な情報ビューを表します。ルート ノードは タグで、親、子、兄弟を持つことができます。 HTMLタグの後にはheadタグとbodyタグが続きます。 head タグにはメタデータとタイトルが含まれ、body タグには div、段落、見出しなどが含まれます。

HTML ドキュメントが Beautiful Soup に渡されると、複雑な HTML コンテンツが 4 つの主要な Python オブジェクトに変換されます。これらは

  1. 美しいスープ:

これは、解析された文書全体を表します。これは私たちが廃棄しようとしている完全な文書です。

soup = BeautifulSoup("<h1> Welcome to KDnuggets! </h1>", "html.parser")
print(type(soup))

出力:

<class 'bs4.BeautifulSoup'>

HTML コンテンツ全体が Beautiful Soup タイプのオブジェクトであることがわかります。

  1. タグ:

タグ オブジェクトは、HTML ドキュメント内の特定のタグに対応します。同じ名前の複数のタグが DOM 内に存在する場合、ドキュメント全体からタグを抽出し、最初に見つかったタグを返すことができます。

soup = BeautifulSoup("<h1> Welcome to KDnuggets! </h1>", 'html.parser')
print(type(soup.h1))

出力:

<class 'bs4.element.Tag'>
  1. NavigableString:

タグ内のテキストが文字列形式で含まれます。 Beautiful Soup は、NavigableString オブジェクトを使用してタグのテキストを保存します。

soup = BeautifulSoup("<h1> Welcome to KDnuggets! </h1>", "html.parser")
print(soup.h1.string)
print(type(soup.h1.string))

出力:

Welcome to KDnuggets! 
<class 'bs4.element.NavigableString'>
  1. コメント:

タグ内にある HTML コメントを読み取ります。これは特別なタイプの NavigableString です。

soup = BeautifulSoup("<h1><!-- This is a comment --></h1>", "html.parser")
print(soup.h1.string)
print(type(soup.h1.string))

出力:

 This is a comment 
<class 'bs4.element.Comment'>

次に、解析された HTML コンテンツからタイトル、さまざまなタグ、クラス、リストなどを抽出します。

1. タイトル

HTMLページのタイトルを取得します。

print(parsedData.title)

出力:

<title>Data Science, Machine Learning, AI &amp; Analytics - KDnuggets</title>

または、タイトル文字列のみを出力することもできます。

print(parsedData.title.string)

出力:

Data Science, Machine Learning, AI & Analytics - KDnuggets

2. 検索してすべてを検索

これらの関数は、HTML コンテンツ内の特定のタグを検索する場合に便利です。 Find() はそのタグの最初の出現のみを返しますが、find_all() はそのタグのすべての出現を返します。それらを反復処理することもできます。以下の例でこれを見てみましょう。

探す():

h2 = parsedData.find('h2')
print(h2)

出力:

<h2>Latest Posts</h2>

find_all():

H2s = parsedData.find_all("h2")
for h2 in H2s:
    print(h2)

出力:

<h2>Latest Posts</h2>
<h2>From Our Partners</h2>
<h2>Top Posts Past 30 Days</h2>
<h2>More Recent Posts</h2>
<h2 size="+1">Top Posts Last Week</h2>

これでは完全なタグが返されますが、文字列だけを出力したい場合はこのように記述できます。

h2 = parsedData.find('h2').text
print(h2)

特定のタグのクラス、ID、タイプ、href などを取得することもできます。たとえば、存在するすべてのアンカー タグのリンクを取得します。

anchors = parsedData.find_all("a")
for a in anchors:
    print(a["href"])

出力:

すべての div のクラスを取得することもできます。

divs = parsedData.find_all("div")
for div in divs:
    print(div["class"])

3. ID とクラス名を使用した要素の検索

特定の ID またはクラス名を指定して、特定の要素を検索することもできます。

tags = parsedData.find_all("li", class_="li-has-thumb")
for tag in tags:
    print(tag.text)

これにより、li-has-thumb クラスに属するすべての li のテキストが出力されます。ただし、タグ名がわからない場合は、必ずしもタグ名を記述する必要はありません。このように書くこともできます。

tags = parsedData.find_all(class_="li-has-thumb")
print(tags)

このクラス名を持つすべてのタグを取得します。

ここで、美しいスープのさらに興味深い方法について説明します。

美しいスープのその他の方法

このセクションでは、作業を簡単かつ迅速にする Beautiful Soup の機能についてさらに説明します。

  1. select()

select() 関数を使用すると、CSS セレクターに基づいて特定のタグを見つけることができます。 CSS セレクターは、クラス、ID、属性などに基づいて特定の HTML タグを選択するパターンです。

以下は、KDnuggets で始まる alt 属性を持つ画像を検索する例です。

data = parsedData.select("img[alt*=KDnuggets]")
print(data)

出力:

この属性は、指定されたタグの親を返します。

tag = parsedData.find('p')
print(tag.parent)
  1. コンテンツ

この属性は、選択したタグの内容を返します。

tag = parsedData.find('p')
print(tag.contents)
  1. 属性

この属性は、辞書内のタグの属性を取得するために使用されます。

tag = parsedData.find('a')
print(tag.attrs)
  1. has_attr()

このメソッドは、タグに特定の属性があるかどうかを確認します。

tag = parsedData.find('a')
print(tag.has_attr('href'))

属性が存在する場合は True を返し、存在しない場合は False を返します。

  1. find_next()

このメソッドは、指定されたタグの後の次のタグを検索します。次に検索する必要がある入力タグの名前を受け取ります。

first_anchor = parsedData.find("a")
second_anchor = first_anchor.find_next("a")
print(second_anchor)
  1. find_previous()

このメソッドは、指定されたタグの後の前のタグを検索するために使用されます。次に検索する必要がある入力タグの名前を受け取ります。

second_anchor = parsedData.find_all('a')[1]
first_anchor = second_anchor.find_previous('a')
print(first_anchor)

最初のアンカータグが再度出力されます。

他にもたくさんの方法がありますので、ぜひ試してみてください。これらのメソッドは、Beautiful Soup のこのドキュメントで利用できます。

結論

Web スクレイピング、その用途、Python と Beautiful Soup の実装について説明しました。今日はここまでです。コメントやご提案がございましたら、お気軽に以下にコメントしてください。

関連記事