Pythonによるデータ分析・機械学習ブログ

Pythonによるデータの前処理・グラフ化、機械学習、統計解析、画像処理、Webスクレイピング、自然言語処理の基礎について紹介していきます。

MENU

【第1回】requestsとBeautifulSoupを用いたHTML情報の取得

はじめに

Webスクレイピングとは、WebサイトからWebページのHTMLデータを取得し、HTMLのテキスト情報を解析することでマーケティングなどの必要な情報やデータを取得して、新たな価値を生むことができます。

Pythonを用いてWebスクレイピングをする際に必要となる代表的なライブラリに、requests、BeautifulSoup、Selniumがあります。requestsおよびBetifulSoupはHTMLやXMLファイルからデータを取得し、解析するPythonのWEBスクレイピング用のライブラリです。インターネット上に公開されているWEBサイトでは広くHTMLやXMLが使われており、これらの情報の取得や解析に、大変便利なライブラリです。requestsでHTMLデータを取得し、BeautifulSoupでHTMLの内容を解析する流れがWebスクレイピングの基本になります。

本記事では、requestsおよびBetifulSoupを用いてHTMLの情報を取得・解析する方法を紹介します。

SAMURAI TERAKOYA

 

1. ライブラリのインストール

requestsおよびBetifulSoupは以下のコマンドを実行することでインストールすることができます。

 

2. requestsを用いたHTMLの情報取得

requestsを用いてHTMLの情報を取得するには、requests.get()関数を用います。引数にページのURLを指定することでそのページのHTMLの情報を取得することがきます。

戻り値はステータスライン、ヘッダ、ボディが含まれるrequestsオブジェクトとなります。それぞれの表示方法を以下で示していきます。

まずは、指定したHTMLの情報を表示します。表示には.textを用います。そのまま表示すると長くなるので先頭から500文字だけ表示します。今回、私のブログページのURLを使用しています。

出力例は以下の様になります。

 

基本的には上記の.textでデータを取得することが基本になります。以降ではそのほかの情報の取得方法を示します。

まずは、ステータスコードです。HTTPステータスコードのことを指しており、Webサーバからのレスポンスの状況を示すコードになります。

ステータスコード 意味
100番台 リクエストを受け入れ可能で継続して処理されている状態
200番台 リクエストがサーバに送られ理解されて受理された状態
300番台 リクエストを完了させるために追加的な処理が必要な状態
400番台 クライアント側で操作や入力に不備がある状態
500番台 サーバーエラー(サーバーの不具合など)の状態

 

ステータスコードを表示するには.status_codeを用います。

出力は以下の様になります。200番台なのでリクエストが成功しています。

 

次はヘッダー情報です。これはHTTP通信Webサーバからのレスポンスのヘッダ部分です。ヘッダーを表示するには.headersを用います。

出力は以下の様になります。辞書型のデータになっています。

 

次は、ボディに含まれるバイナリデータを確認します。バイナリーデータなので人間が見てもわからない情報になっています。ボディに含まれるバイナリデータを表示するには.contentを用います。今回は先頭から2000文字のみ表示します。

出力は以下の様になります。

 

3. BetifulSoupを用いたHTMLの情報解析

BeautifulSoupを用いてHTMLの情報を解析していきます。ここではHTMLのボディの情報や見出しのタイトルを取得していきたいと思います。

3.1 body部分のテキストの取得

BeautifulSoupを用いてHTMLの解析を取得する前にrequestsを用いてHTMLの情報を取得します。その後、その取得したテキストデータをBeautifulSoup関数に渡します。BeautifulSoup関数の引数にはrequestsで取得したHTMLのデータとパーサー(解析器)を指定します。パーサーはhtml.parser、lxml、xml、html5libがあります。本記事ではhtml.parserを用います。このパーサーの特徴は追加ライブラリが不要な点です。

今回はまずbody部分(bodyタグの情報)の情報を取得し、そのテキスト情報を表示します。HTMLから指定した箇所を取得するには.find()または.find_all()を用います。引数に該当のタグを指定します。.find()は該当する部分の一番最初の情報を取得、.find_all()は該当部分のすべての内容を表示ます。

body部分のテキストを表示します。bodyタグは基本1つしかないので、find('body')でHTMLの情報を取得できます。出力例は長くなるので省略します。

さらにそのbody部分のテキスト情報を取得するには.get_text()を用います。こちらは先頭から500文字のみのテキストを取得します。

出力は以下の様になります。

 

3.2 見出しh5タグの内容を取得

次に見出しのh5タグの内容を取得します。なぜ見出しのh5タグかというと、今回読み込むHTMLのページが私の書いたはてなブログになっています。h5タグが各ライブラリの名前になっているので、各ライブラリの名前を取得できればここではOKです。

では、上節と同じように.find_all('h5')でh5タグのすべての内容を取得します。

 

出力は以下の様になります。h5タグの内容がリストで取得されているのがわかると思います。

それでは、.get_text()でテキスト部分を取得します。リストになっているので、ここではfor文で一つずつテキストを表示させていきます。

出力結果は以下の様になります。

 

3.3 見出しh1タグの内容を取得

先ほどとは別の手法でHTMLの情報を取得します。以下の方法でもタグの内容を取得することができます。

出力結果は以下の様になります。

 

3.4 aタグのhref属性の取得

3.3ではh1タグの内容を取得しました。さらにそこからaタグのhref属性を取得していきます。その取得方法は以下のようになります。

出力結果は以下の様になります。

 

4. 応用例の紹介

本記事で紹介した手法を用いることで、以下の記事のようにseleniumを用いて検索ワードに対する各ページのタイトルとURLを取得して、そのURLからrequestsとBeautifulSoupを用いてHTMLの取得・解析ができるようになります。

chantastu.hatenablog.com

 

オススメ書籍

Pythonによるスクレイピング機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事では、requestsおよびBetifulSoupを用いてHTMLの情報を取得する方法を紹介しました。requestsでHTMLデータを取得し、BeautifulSoupでHTMLの内容を解析する流れは基本になるので覚えましょう。

本記事のようにHTMLの情報を取得し、自然言語処理などを行うことで必要な情報を取得したり、価値のあるデータを生み出すことができます。