Pythonでウェブスクレイピングとデータ可視化を学ぶための初心者ガイド

ガイド, パイソン, スクレイピング, 12月 -0020215分で読める

ウェブサイトから重要な情報を迅速かつ効率的に引き出すにはどうすればいいのでしょうか?手作業でデータを抽出するには多くの時間がかかります。ウェブスクレイピングを使えば、表形式でない、あるいは構造化されていないデータをウェブサイトから自動的に取得することができる。その後、そのデータをスプレッドシートなどの構造化された使用可能な形式に変換することができます。

目次

ウェブサイトから重要な情報を迅速かつ効率的に引き出すにはどうすればいいのでしょうか?手作業でデータを抽出するには多くの時間がかかります。Webスクレイピングを使えば、Webサイトから表形式でないデータや構造化されていないデータを自動的に取得することができます。その後、そのデータをスプレッドシートや.csvファイルのような構造化された使用可能な形式に変換することができます。

Webスクレイピングは、データをアーカイブし、オンラインでデータの変更を追跡することができます。企業は様々な目的でスクレイピングを利用している。例えば、オンラインショップは競合他社の価格項目や一般に公開されているページをスクレイピングするために使用する。そして、この情報を価格調整に利用する。Webスクレイピングのもう一つの一般的な慣行は、組織がマーケティング目的で電話番号や電子メールアドレスのような個人データを収集する連絡先スクレイピングです。 

ウェブスクレイピングはなぜ使われるのか?

なぜ誰かがウェブサイトから大量の情報を抽出しなければならないのか?それを理解するために、ウェブスクレイピングの以下の用途を見てみよう。

  • 研究開発 - ウェブサイトから大規模なデータセット(気温、一般情報など)を収集し、研究開発のための調査を実施するために分析することができます。
  • 価格比較 - ParseHubのようなビジネスやサービスは、ウェブスクレイピングを使ってオンラインショッピングサイトからデータを収集し、商品の価格を比較する。
  • 求人リスト - ウェブスクレイピングを利用して、さまざまなウェブサイトから求人や面接に関する詳細を収集し、一箇所にリストアップすることができます。 
  • ソーシャルメディア・スクレイピング - ウェブ・スクレイピングを使って、インスタグラムやツイッターなどのソーシャルメディア・ウェブサイトからデータを収集し、何がトレンドかを調べることができる。
  • Eメールアドレスの収集 - 多くの企業がマーケティング媒体としてEメールを利用している。彼らはウェブスクレイピングを使ってEメールIDを収集し、Eメールを大量に送信します。

Pythonを使ったWebスクレイピング

以下の手順でウェブサイトからデータをスクレイピングできる。

  • スクレイピングしたいURLを取得する
  • ページを見る
  • 抽出するデータを見つける
  • コードを書く
  • コードを実行し、データを抽出する
  • 希望する形式でデータを保存する

Pythonでウェブスクレイピングに使えるライブラリは以下の通り:

Pandas - Pandasはデータの操作と分析に使用されます。このライブラリを使用してデータを抽出し、必要な形式で保存することができます。

Beautiful Soup - HTML や XML ドキュメントを解析する Python パッケージです。ウェブサイトからデータを簡単に抽出するのに役立つ解析木を作成します。

Requests - シンプルなHTTPライブラリ。

私たちはこのサイトを使ってCOVIDの症例数を抽出する予定です。その後、データを分析し、いくつかのビジュアライゼーションを作成します。

ライブラリのインポート

以下のように、PythonでリクエストとBeautifulSoupをインポートしてWebスクレイピングを行うことができる。

インポートリクエスト
frombs4importBeautifulSoup

スクレイピング・データ用URL

データをスクレイピングするウェブサイトのURLを指定します。requests.get()メソッドを使用して、指定されたURLにGETリクエストを送信する必要があります。さらに、以下のコードに示すように、2つの文字列引数を取るBeautifulSoupコンストラクタを作成する必要があります。

url='https://www.worldometers.info/coronavirus/countries-where-coronavirus-has-spread/'
page= requests.get(url) 
soup= BeautifulSoup(page.text,'html.parser') 
  
data= [] (データ)

すべての要素を削る

soup.find_all()メソッドを使用すると、URLのテーブル内のすべての要素をスクレイピングすることができます。find_all()メソッドは、見つかった要素へのインデックスベースのアクセスを提供するオブジェクトを返し、forまたはwhileループを使用して出力することができます。

data_iterator= iter(soup.find_all('td'))

ループの使用

イテレータに利用可能なデータがあるまで繰り返すwhile Trueループを使うことができる。

while Truetry: 
        country =next(data_iterator).text
        確定 =next(data_iterator).text 
        死亡 =next(data_iterator).text 
        大陸 =next(data_iterator).text

confirmed "および "deaths "列については、カンマを外してint型に変換する。 

data.append(( 
            国 
            (confirmed.replace(', ',''))、 
            (deaths.replace(',',''))、 
            大陸
        )) 
    
    except StopIteration: 
       ブレーク

反復処理に必要な要素数がゼロになると、StopIterationエラーが発生する。

Pandasデータフレームの作成

上記のコードを実行すると、ウェブサイトからデータを抽出できます。さらにデータを分析するには、Pandasデータフレームを作成する必要があります。以下のコードでは、確認されたCOVIDの症例数でデータをソートしています。

pandasライブラリをインポートしてデータフレームを作成する。

data.sort(key = lambda row: row[1], reverse = True)
pandas を pd としてインポート
df = pd.DataFrame(data,columns=['country','number of cases','Deaths','Continent'],dtype=float)
df.head()
df['Number of cases']=[x.replace(',','') for x in df['Number of cases']].
df['Number of cases'] = pd.to_numeric(df['Number of cases'])
df

以下の出力が得られる:

Dataframeに関する情報を得るには、df.info()を使用する。

df.info()

Death_rateカラムの作成

以下のように、Death_rateという新しいカラムを作成する。

dff = df.sort_values(by ='症例数',ascending = False)
dff['Death_rate']= (dff['Deaths']/dff['Number of cases'])*100
dff.head()

出力はこうだ。

プロキシを使ったウェブスクレイピング

プロキシサーバーは、あなたがスクレイピングしたい情報にアクセスするためにユニークなIPアドレスを使用することができます。こうすることで、ウェブサイトはあなたの実際のIPアドレスを見ないので、匿名でデータをスクレイピングすることができます。ウェブスクレイピングにプロキシを使用しなければならない理由は以下の通りです。

  • プロキシのプールを使えば、禁止されることなくウェブサーバーに複数の同時リクエストを送ることができる。
  • プロキシの助けを借りて、特定の場所、デバイス、ISP、モバイルネットワークからのリクエストを行うことができます。また、特定の地域やデバイス向けに表示されたコンテンツをクロールすることもできます。
  • 一部のウェブサイトではIPの利用が禁止されているが、プロキシを使えばそれを回避することができる。 

ウェブスクレイピング用プロキシの種類

以下の2つのプロキシを使って、ウェブサイトからデータをスクレイピングすることができる。

  • データセンター・プロキシ - データセンターIPアドレスはサーバーIPアドレスです。サーバーはデータセンターに設置されています。データセンター・プロキシの主な目的は、クロールするウェブサイトからあなたのアドレスを隠すことです。これらのプロキシは、主にビジネスデータのスクレイピングに使用されます。
  • レジデンシャル・プロキシ -レジデンシャルIPアドレスは、データセンターIPよりも高価であり、取得が困難です。これらのプロキシを使用すると、特定の場所(都市、国など)を選択し、その地域の実際のユーザーとしてネットサーフィンをすることができます。

Pythonによるデータ可視化

データ・ビジュアライゼーションとは、データや情報をグラフィカルに表現することであることはご存知でしょう。表現されたデータを理解するためのアクセス可能な方法として、チャート、マップ、グラフのような視覚的ツールを使用することができます。データ可視化ツールを使って、このウェブサイトから抽出したデータをどのように可視化できるか見てみましょう。

ライブラリのインポート

データを可視化するには、以下のライブラリをインポートする必要があります。

snsとしてseabornをインポート
importmatplotlib.pyplotasplt
frompylabimportrcParams

ペアプロット

データセット内の対の関係を示すためにペアプロットをプロットすることができます。以下のコードを使用することで簡単に実装でき、フォローアップ分析のためにデータの傾向を特定することができます。

rcParams['figure.figsize'] = 15, 10
frommatplotlib.pyplot import figure
figure(num=None, figsize=(20, 6),dpi=80,facecolor='w',edgecolor='k')
sns.pairplot(dff,hue='Continent')

と出力される。

棒グラフのプロット

カテゴリカル・データを長方形の棒として表示し、データ内の異なるカテゴリの値を比較する棒グラフをプロットできます。 

sns.barplot(x ='国',y ='症例数',data = dff.head(10))

出力はこうだ。

散布図のプロット

散布図を使って数値間の関係を理解することができます。散布図は、変数間の関係を表すために点を使用します。 

sns.scatterplot(x ="症例数", y ="死亡数",色相 ="大陸",データ= dff)

出力はこうだ。

データのグループ化と並べ替え

以下のコードでは、データを大陸別にグループ化し、COVIDケースの数でソートします。

dfg = dff.groupby(by = 'Continent',as_index = False).agg({'Number of cases':sum,'Deaths':sum})
dfgg = dfg[1:]
df1 = dfgg.sort_values(by = 'Number of cases',ascending = False)
df1['Death_rate'] = (df1['Deaths']/df1['Number of cases'])*100
df1.sort_values(by = 'Death_rate',ascending = False)

出力はこうだ。

ここで、"Continent "と "Death_rate "を以下のように棒グラフにプロットする。

sns.barplot(x ='Continent',y ='Death_rate',data= df1.sort_values(by='Death_rate',ascending=False))

出力はこうだ。

この棒グラフは、死亡率が南米で最も高く、オーストラリアで最も低いことを示している。 

テキストテーブルのインポート

単純なASCII表を作成するためにtexttableをインストールする。そして、それをttとしてインポートする。

pip install texttable

ttとしてtexttableをインポートする

texttableオブジェクトの作成

下図のようにtexttableオブジェクトを作成しなければならない。ヘッダー用にテーブルの最初に空の行を追加し、列を整列させる必要があります。

table = tt.Texttable() 

table.add_rows([(None,None,None,None)] + data)table.set_cols_align(('c','c','c','c'))  # l'は左、'c'は中央 'r'は右を表す。 
table.header((' 国 ',' 症例数 ',' 死亡者数 ',' 大陸 ')) 
  
print(table.draw())

ここで、出力はテーブルのいくつかの行を次のように表している。

結論

ウェブスクレイピングでは、ウェブサイトから大量のデータを迅速かつ効率的に抽出することができます。抽出した非構造化データを.csvファイルのような使用可能な形式に変換することができる。Pandasと BeautifulSoupという2つのモジュールを使うことで、ウェブからデータをスクレイピングできることがわかった。プロキシを使えば、ウェブから匿名でデータを抽出することができる。ウェブスクレイピングには、データセンター型プロキシとレジデンシャル型プロキシのどちらかを使うことができる。住宅プロキシはデータセンター用プロキシよりも信頼性が高いが、高価である。さらに、データ分析を行って、ニーズに基づいた洞察力のある情報を導き出すことができる。この記事では、棒グラフ、ペア・プロット、散布図などのデータ可視化ツールを使ってデータを分析した。