序章

Webは、私たちが読んで理解できるよりも多くのデータを提供してくれるので、その情報を理解するために、プログラムでその情報を処理したいことがよくあります。 時々、そのデータはウェブサイトの作成者によって私たちに提供されます .csv またはコンマ区切りの値ファイル、またはAPI(アプリケーションプログラミングインターフェイス)を介して。 また、自分でWebからテキストを収集する必要がある場合もあります。

このチュートリアルでは、RequestsおよびBeautifulSoup Pythonパッケージを使用して、Webページのデータを利用する方法について説明します。 Requestsモジュールを使用するとPythonプログラムをWebサービスと統合できますが、BeautifulSoupモジュールは画面のスクレイピングをすばやく実行できるように設計されています。 Pythonインタラクティブコンソールとこれら2つのライブラリを使用して、Webページを収集し、そこで利用可能なテキスト情報を操作する方法を説明します。

前提条件

このチュートリアルを完了するには、Python3の開発環境が必要です。 シリーズPython3のローカルプログラミング環境をインストールしてセットアップする方法またはPython3をインストールしてプログラミング環境をセットアップする方法から入手できるオペレーティングシステムの適切なガイドに従うことができます。 Ubuntu20.04サーバーで必要なものをすべて構成します。

さらに、次のことをよく理解しておく必要があります。

開発環境をセットアップし、これらのPythonプログラミングの概念を念頭に置いて、RequestsとBeautifulSoupの使用を開始しましょう。

リクエストのインストール

Python3プログラミング環境をアクティブ化することから始めましょう。 環境が配置されているディレクトリにいることを確認し、次のコマンドを実行します。

  1. . my_env/bin/activate

Webページを操作するには、ページをリクエストする必要があります。 Requestsライブラリを使用すると、Pythonプログラム内で人間が読める形式でHTTPを利用できます。

プログラミング環境をアクティブにして、pipを使用してRequestsをインストールします。

  1. pip install requests

Requestsライブラリのインストール中に、次の出力が表示されます。

Output
Collecting requests Downloading requests-2.26.0-py2.py3-none-any.whl (88kB) 100% |████████████████████████████████| 92kB 3.1MB/s ... Installing collected packages: chardet, urllib3, certifi, idna, requests Successfully installed certifi-2017.4.17 chardet-3.0.4 idna-2.5 requests-2.26.0 urllib3-1.21.1

Requestsが以前にインストールされていた場合は、ターミナルウィンドウから次のようなフィードバックを受け取ります。

Output
Requirement already satisfied ...

プログラミング環境にリクエストをインストールしたら、次のモジュールのインストールに進むことができます。

美しいスープをインストールする

Requestsで行ったのと同じように、pipを使用してBeautifulSoupをインストールします。 Beautiful Soup 4の現在のバージョンは、次のコマンドでインストールできます。

  1. pip install beautifulsoup4

このコマンドを実行すると、次のような出力が表示されます。

Output
Collecting beautifulsoup4 Downloading beautifulsoup4-4.10.0-py3-none-any.whl (97 kB) |████████████████████████████████| 97 kB 6.8 MB/s Collecting soupsieve>1.2 Downloading soupsieve-2.3.1-py3-none-any.whl (37 kB) Installing collected packages: soupsieve, beautifulsoup4 Successfully installed beautifulsoup4-4.10.0 soupsieve-2.3.1

Beautiful SoupとRequestsの両方がインストールされたので、ライブラリを操作してWebサイトをスクレイプする方法の理解に進むことができます。

リクエストを含むWebページの収集

これから使用する2つのPythonライブラリがインストールされているので、基本的なWebページをステップスルーすることに慣れることができます。

まず、 Python InteractiveConsoleに移動しましょう。

  1. python

ここから、Requestsモジュールをインポートして、サンプルWebページを収集できるようにします。

  1. import requests

サンプルWebページのURL(以下)を割り当てます。 mockturtle.html 変数url:

  1. url = 'https://assets.digitalocean.com/articles/eng_python/beautiful-soup/mockturtle.html'

次に、そのページのリクエストの結果を変数に割り当てることができます page request.get()メソッドを使用します。 ページのURL(に割り当てられたもの)を渡します url 変数)そのメソッドに。

  1. page = requests.get(url)

変数 page 応答オブジェクトが割り当てられます:

>>> page
<Response [200]>
>>> 

上記のResponseオブジェクトは、 status_code 角括弧内のプロパティ(この場合) 200). この属性は明示的に呼び出すことができます。

>>> page.status_code
200
>>> 

返されたコード 200 ページが正常にダウンロードされたことを示します。 番号で始まるコード 2 通常は成功を示しますが、 4 また 5 エラーが発生したことを示します。 HTTPステータスコードの詳細については、W3Cのステータスコード定義を参照してください。

Webデータを操作するために、Webファイルのテキストベースのコンテンツにアクセスする必要があります。 サーバーの応答の内容を次のように読み取ることができます page.text (また page.content バイト単位の応答にアクセスしたい場合)。

  1. page.text

一度押すと ENTER、次の出力を受け取ります。

Output
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n\n<html lang="en-US" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">\n<head>\n <meta http-equiv="content-type" content="text/html; charset=us-ascii" />\n\n <title>Turtle Soup</title>\n</head>\n\n<body>\n <h1>Turtle Soup</h1>\n\n <p class="verse" id="first">Beautiful Soup, so rich and green,<br />\n Waiting in a hot tureen!<br />\n Who for such dainties would not stoop?<br />\n Soup of the evening, beautiful Soup!<br />\n Soup of the evening, beautiful Soup!<br /></p>\n\n <p class="chorus" id="second">Beau--ootiful Soo--oop!<br />\n Beau--ootiful Soo--oop!<br />\n Soo--oop of the e--e--evening,<br />\n Beautiful, beautiful Soup!<br /></p>\n\n <p class="verse" id="third">Beautiful Soup! Who cares for fish,<br />\n Game or any other dish?<br />\n Who would not give all else for two<br />\n Pennyworth only of Beautiful Soup?<br />\n Pennyworth only of beautiful Soup?<br /></p>\n\n <p class="chorus" id="fourth">Beau--ootiful Soo--oop!<br />\n Beau--ootiful Soo--oop!<br />\n Soo--oop of the e--e--evening,<br />\n Beautiful, beauti--FUL SOUP!<br /></p>\n</body>\n</html>\n' >>>

ここでは、ページの全文がすべてのHTMLタグとともに印刷されていることがわかります。 ただし、間隔が狭いため読みづらいです。

次のセクションでは、Beautiful Soupモジュールを活用して、このテキストデータをより人間に優しい方法で操作できます。

美しいスープでページをステップスルー

Beautiful Soupライブラリは、解析されたHTMLおよびXMLドキュメント(閉じられていないタグまたはタグスープおよびその他の不正な形式のマークアップを含むドキュメントを含む)から解析ツリーを作成します。 この機能により、RequestsモジュールからのテキストよりもWebページのテキストが読みやすくなります。

まず、BeautifulSoupをPythonコンソールにインポートします。

  1. from bs4 import BeautifulSoup

次に、を実行します page.text モジュールを介して文書化し、 BeautifulSoup オブジェクト—つまり、HTML上でPythonの組み込みhtml.parserを実行して取得するこの解析済みページの解析ツリー。 構築されたオブジェクトは、 mockturtle.html ネストされたデータ構造としてのドキュメント。 これは変数に割り当てられます soup.

  1. soup = BeautifulSoup(page.text, 'html.parser')

ターミナルにページの内容を表示するために、 prettify() BeautifulSoup解析ツリーを適切にフォーマットされたUnicode文字列に変換するためのメソッド。

  1. print(soup.prettify())

これにより、各HTMLタグが独自の行にレンダリングされます。

Output
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="text/html; charset=utf-8" http-equiv="content-type"/> <title> Turtle Soup </title> </head> <body> <h1> Turtle Soup </h1> <p class="verse" id="first"> Beautiful Soup, so rich and green, <br/> Waiting in a hot tureen! <br/> Who for such dainties would not stoop? <br/> Soup of the evening, beautiful Soup! ... </html>

上記の出力では、1行に1つのタグがあり、BeautifulSoupで使用されるツリースキーマのためにタグがネストされていることがわかります。

タグのインスタンスの検索

Beautiful Soupを使用して、ページから1つのタグを抽出できます。 find_all 方法。 これにより、ドキュメント内の特定のタグのすべてのインスタンスが返されます。

  1. soup.find_all('p')

オブジェクトでそのメソッドを実行すると、関連する曲の全文と一緒に曲の全文が返されます <p> タグおよびその要求されたタグに含まれるすべてのタグ。ここには改行タグが含まれます <br/>:

Output
[<p class="verse" id="first">Beautiful Soup, so rich and green,<br/> Waiting in a hot tureen!<br/> Who for such dainties would not stoop?<br/> Soup of the evening, beautiful Soup!<br/> Soup of the evening, beautiful Soup!<br/></p>, <p class="chorus" id="second">Beau--ootiful Soo--oop!<br/> ... Beau--ootiful Soo--oop!<br/> Soo--oop of the e--e--evening,<br/> Beautiful, beauti--FUL SOUP!<br/></p>]

上記の出力では、データが角かっこで囲まれていることがわかります。 [ ]. これは、Pythonリストデータ型であることを意味します。

これはリストであるため、その中の特定のアイテムを呼び出すことができます(たとえば、3番目のアイテム) <p> 要素)、およびを使用します get_text() そのタグ内からすべてのテキストを抽出するメソッド:

  1. soup.find_all('p')[2].get_text()

私たちが受け取る出力は、3番目の出力になります <p> この場合の要素:

Output
'Beautiful Soup! Who cares for fish,\n Game or any other dish?\n Who would not give all else for two\n Pennyworth only of Beautiful Soup?\n Pennyworth only of beautiful Soup?'

ご了承ください \n 改行は、上記の返される文字列にも表示されます。

クラスとIDによるタグの検索

クラスやIDなどのCSSセレクターを参照するHTML要素は、BeautifulSoupを使用してWebデータを操作するときに確認するのに役立ちます。 を使用して特定のクラスとIDをターゲットにできます find_all() メソッドとクラスとID文字列を引数として渡します。

まず、クラスのすべてのインスタンスを見つけましょう chorus. Beautiful Soupでは、クラスの文字列をキーワード引数に割り当てます class_:

  1. soup.find_all(class_='chorus')

上記の行を実行すると、次のリストが出力として表示されます。

Output
[<p class="chorus" id="second">Beau--ootiful Soo--oop!<br/> Beau--ootiful Soo--oop!<br/> Soo--oop of the e--e--evening,<br/> Beautiful, beautiful Soup!<br/></p>, <p class="chorus" id="fourth">Beau--ootiful Soo--oop!<br/> Beau--ootiful Soo--oop!<br/> Soo--oop of the e--e--evening,<br/> Beautiful, beauti--FUL SOUP!<br/></p>]

二つ <p>-のクラスでタグ付けされたセクション chorus ターミナルに印刷されました。

クラスを検索するように指定することもできます chorus 内のみ <p> タグ、複数のタグに使用される場合:

  1. soup.find_all('p', class_='chorus')

上記の行を実行すると、以前と同じ出力が生成されます。

また、Beautiful Soupを使用して、HTMLタグに関連付けられたIDをターゲットにすることもできます。 この場合、文字列を割り当てます 'third' キーワード引数に id:

  1. soup.find_all(id='third')

上記の行を実行すると、次の出力が表示されます。

Output
[<p class="verse" id="third">Beautiful Soup! Who cares for fish,<br/> Game or any other dish?<br/> Who would not give all else for two<br/> Pennyworth only of Beautiful Soup?<br/> Pennyworth only of beautiful Soup?<br/></p>]

に関連付けられているテキスト <p> IDのタグ third 関連するタグとともに端末に印刷されます。

結論

このチュートリアルでは、PythonのRequestsモジュールを使用してWebページを取得し、Beautiful Soupを理解するために、そのWebページのテキストデータを予備的にスクレイピングする方法について説明しました。

ここから、チュートリアル美しいスープとPython 3でWebページをスクレイピングする方法に従って、Webから収集されたデータからCSVファイルを作成するWebスクレイピングプログラムの作成に進むことができます。