Python 3でリクエストとBeautiful Soupを使用してWebデータを操作する方法

前書き

Webは、誰もが読み取ったり理解したりできるよりも多くのデータを提供します。そのため、多くの場合、その情報を理解するためにプログラムで作業したいと考えています。 時々、そのデータは、ウェブサイトの作成者から `+ .csv +`またはコンマ区切り値ファイル、またはAPI(Application Programming Interface)を介して提供されます。 また、自分でウェブからテキストを収集する必要がある場合もあります。

このチュートリアルでは、http://docs.python-requests.org/en/master/ [Requests]およびhttps://www.crummy.com/software/BeautifulSoup/[Beautiful Soup] Pythonパッケージの使用方法について説明します。 Webページのデータを利用するため。 Requestsモジュールを使用すると、PythonプログラムをWebサービスと統合できます。一方、Beautiful Soupモジュールは、画面のスクレイピングをすばやく実行できるように設計されています。 Pythonインタラクティブコンソールとこれら2つのライブラリを使用して、Webページを収集し、そこで利用可能なテキスト情報を操作する方法を説明します。

前提条件

このチュートリアルを完了するには、Python 3の開発環境が必要です。 シリーズhttps://www.digitalocean.com/community/tutorial_series/how-to-install-and-set-up-a-local-programming-environment-for-から利用可能なオペレーティングシステムの適切なガイドに従うことができます。 python-3 [Python 3のローカルプログラミング環境をインストールおよびセットアップする方法]またはhttps://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a -programming-environment-on-an-ubuntu-16-04-server [Python 3をインストールし、Ubuntu 16.04サーバーにプログラミング環境をセットアップする方法]を使用して、必要なすべてを構成します。

さらに、次のことにも精通している必要があります。

開発環境をセットアップし、これらのPythonプログラミングの概念を念頭に置いて、リクエストとビューティフルスープの作業を始めましょう。

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

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

. /bin/activate

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

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

pip install requests

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

OutputCollecting requests
 Downloading requests-2.18.1-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.18.1 urllib3-1.21.1

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

OutputRequirement already satisfied
...

プログラミング環境にRequestsをインストールしたら、次のモジュールをインストールできます。

Beautiful Soupのインストール

リクエストで行ったように、Beautiful Soupをpipでインストールします。 Beautiful Soup 4の現在のバージョンは、次のコマンドでインストールできます。

pip install beautifulsoup4

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

OutputCollecting beautifulsoup4
 Downloading beautifulsoup4-4.6.0-py3-none-any.whl (86kB)
   100% |████████████████████████████████| 92kB 4.4MB/s
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.6.0

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

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

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

最初にhttps://www.digitalocean.com/community/tutorials/how-to-work-with-the-python-interactive-console[Python Interactive Console]に移動しましょう。

python

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

import requests

サンプルWebページのURL(下)を + mockturtle.html +`にhttps://www.digitalocean.com/community/tutorials/how-to-use-variables-in-python-3に割り当てます。 [変数] `+ url +

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

次に、http://docs.python-requests.org/en/master/user/quickstart/#make-a-request [を使用して、そのページのリクエストの結果を変数 + page + `に割り当てることができます+ request.get()+ `メソッド]。 ページのURL( `+ url +`変数に割り当てられた)をそのメソッドに渡します。

page = requests.get(url)

変数 `+ page +`にはResponseオブジェクトが割り当てられます:

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

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

>>> page.status_code
200
>>>

返されたコード「200」は、ページが正常にダウンロードされたことを示しています。 「2」で始まるコードは通常成功を示し、「+ 4+」または「5」で始まるコードはエラーが発生したことを示します。 HTTPステータスコードの詳細については、https://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01#Status-Codes [W3Cのステータスコード定義]をご覧ください。

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

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ドキュメント(閉じられていないタグまたはhttps://en.wikipedia.org/wiki/Tag_soup[tag soup]およびその他の不正なマークアップを含むドキュメント)から解析ツリーを作成します。 この機能により、リクエストモジュールから見たものよりもウェブページのテキストが読みやすくなります。

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

from bs4 import BeautifulSoup

次に、モジュールを介して + page.text +`ドキュメントを実行し、 `+ BeautifulSoup +`オブジェクトを提供します。つまり、Pythonの組み込みhttpsを実行することで取得するこの解析ページからの解析ツリーです。 //docs.python.org/3/library/html.parser.html [+ html.parser `] HTML上。 構築されたオブジェクトは、ネストされたデータ構造として ` mockturtle.html `ドキュメントを表します。 これは変数 ` soup +`に割り当てられます。

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

ページのコンテンツを端末に表示するには、 `+ prettify()+`メソッドを使用してページを印刷し、Beautiful Soup解析ツリーを適切にフォーマットされたUnicode文字列に変換します。

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つのタグがあり、Beautiful Soupで使用されるツリースキーマのためにタグがネストされていることがわかります。

タグのインスタンスを見つける

Beautiful Soupの `+ find_all +`メソッドを使用して、ページから単一のタグを抽出できます。 これは、ドキュメント内の特定のタグのすべてのインスタンスを返します。

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 list data typeであることを意味します。

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

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要素は、Beautiful Soupを使用してWebデータを操作する際に参照すると役立ちます。 `+ find_all()+`メソッドを使用し、クラスとIDの文字列を引数として渡すことで、特定のクラスとIDをターゲットにできます。

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

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>]

`+ chorus `のクラスを持つ2つの ` <p> +`タグ付きセクションが端末に出力されました。

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

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

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

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

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>]

IDが「+ third 」の「 <p> +」タグに関連付けられたテキストは、関連するタグとともに端末に出力されます。

結論

このチュートリアルでは、PythonのRequestsモジュールでWebページを取得し、Beautiful Soupを理解するために、そのWebページのテキストデータを事前にスクレイピングしました。

ここから、チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-scrape-に従って、Webから収集したデータからCSVファイルを作成するWebスクレイピングプログラムの作成に進むことができます。 web-pages-with-beautiful-soup-and-python-3 [Webページを美しいスープとPython 3でスクレイピングする方法]。