ウェブスクレイピング、正規表現、データ可視化、そのすべてをPythonで行う

パイソン, スクレイピング, 11月-1520225分で読める

Webスクレイピングとは、Webサイトからデータを収集し、再構築する手法と定義できる。また、自動化された方法でウェブサイトのデータを取得するプログラム的アプローチとも定義できる。例えば、Facebookの投稿にコメントした人全員のEメールIDを抽出したいとします。そのためには

目次

Webスクレイピングとは、Webサイトからデータを収集し、再構築する手法と定義できる。また、自動化された方法でウェブサイトのデータを取得するプログラム的アプローチとも定義できる。例えば、Facebookの投稿にコメントした人全員のEメールIDを抽出したいとします。これには2つの方法がある。まず、カーソルを任意の人のメールアドレス文字列に向ける。次に、それをコピーしてファイルに貼り付ける。この方法は手動スクレイピングとして知られている。しかし、もしあなたが2000のEメールIDを集めたいとしたらどうする?ウェブスクレイピングツールを使えば、手動スクレイピングで3時間かかるところを30秒ですべてのEメールIDを抽出することができる。

ウェブスクレイピングツールを使って、ウェブサイトから情報を抽出することができる。クリックの仕方だけ知っていればよく、プログラミングの知識は必要ない。これらのツールはリソース効率に優れ、時間とコストを節約します。ネットワークの帯域幅を気にすることなく、ニーズに応じて何百万ものページをスクレイピングできる。ウェブサイトによっては、スクレイパーによるデータ収集を阻止するアンチボットを実装しているところもある。しかし、良いWebスクレイピングツールは、これらのツールをバイパスし、シームレスなスクレイピング体験を提供するための機能が組み込まれています。

Pythonでウェブスクレイピング

Pythonにはウェブからデータをスクレイピングするための優れたツールがある。例えば、ウェブページからコンテンツを取得するためにrequestsライブラリを、関連情報を抽出するためにbs4(BeautifulSoup)をインポートすることができる。以下の手順に従って、PythonでWebスクレイピングを行うことができます。このウェブサイトから情報を抽出します。 

輸入のリクエスト

ウェブサイトのHTMLを取得するには、リクエスト・ライブラリをインポートする必要がある。 

輸入リクエスト

GETリクエスト:

ウェブサイトにGETリクエストをする必要があります。これは、requests.get()関数にURLを貼り付けることで可能です。

r= requests.get('http://www.cleveland.com/metro/index.ssf/2017/12/case_western_reserve_university_president_barbara_snyders_base_salary_and_bonus_pay_tops_among_private_colleges_in_ohio.html')

コンテンツを抽出する:

r.contentを使ってウェブサイトのコンテンツを抽出する。これは、ウェブサイトのコンテンツをバイト単位で提供します。 

c =r.content

BeautifulSoupをインポートする:

BeautifulSoupライブラリをインポートすれば、ウェブページから情報を簡単にスクレイピングできる。

frombs4importBeautifulSoup

スープ・オブジェクトを作成する:

コンテンツからBeautifulSoupオブジェクトを作成し、いくつかのメソッドを使用してそれを解析する必要があります。

soup=BeautifulSoup(c)
print(soup.get_text())

このような出力(ほんの一部です)が得られます。

有用なデータを抽出する:

目的のデータを抽出する必要があるので、適切なCSSセレクタを見つけなければなりません。スープ・オブジェクトの.find()メソッドを使用して、ウェブページのメイン・コンテンツを見つけることができます。

main_content = soup.find('div', attrs = {'class': 'entry-content'})

.text属性を使用する:

スープの.text属性を使って、テーブルから情報をテキストとして取り出すことができる。

content = main_content.find('ul').text
print(content)

テーブルのテキストを文字列として取り出した。しかし、文字列の特定の部分を抽出すれば、その情報は大いに役立つだろう。このタスクを達成するためには、正規表現に移る必要がある。

Pythonの正規表現

正規表現(RegEx)は、検索パターンを定義する一連のパターンです。基本的な考え方はこうだ:

  • テキスト文字列でマッチさせたいパターンを定義する。 
  • 文字列を検索してマッチを返す。

テキスト・テーブルから以下の情報を抽出したいとする。

  • 給与
  • 大学名
  • 歴代会長の氏名

以下の手順で3つの情報を抽出することができる。

ステップ01:

re をインポートし、給与を抽出するために給与パターンを作成する必要があります。re.compile() メソッドを使用して、文字列として指定された正規表現パターンを RegEx pattern オブジェクトにコンパイルします。さらに、pattern.findall() を使用してすべてのマッチを検索し、文字列のリストとして返すことができます。それぞれの文字列がひとつのマッチを表します。

インポートre
salary_pattern = re.compile(r'˶$.+')
salaries = salary_pattern.findall(content)

ステップ02:

大学名を抽出するために同じ手順を繰り返す。パターンを作り、名前を抽出する。 

school_pattern = re.compile(r'(?:,|,\s)([A-Z]{1}.*?)(?:\s\(|:|,)')
schools = school_pattern.findall(content)
print(schools)
print(salaries)

ステップ03:

大統領の名前を抽出するために同じ手順を繰り返す。パターンを作り、必要な名前を抽出する。 

name_pattern = re.compile(r'^([A-Z]{1}.+?)(?:,)', flags = re.M)
names = name_pattern.findall(content)
print(names)

ステップ04:

給与の文字列は乱雑に見え、理解できない。そこで、文字列の給与を数字に変換するためにPythonのリスト内包を使います。文字列のスライシング、分割と結合、リスト内包を使って目的の結果を得ます。

salaries = ['$876,001','$543,903','$2453,896']
[int('.join(s[1:].split(',')))forsinsalaries].

出力はこうだ:

Pythonによるデータ可視化

データの可視化は、トレンド、パターン、相関関係を明らかにするために、データを視覚的に理解するのに役立ちます。大量のデータをグラフ、チャート、その他のビジュアルに変換することで、異常値を特定し、貴重な洞察を得ることができます。

以下のように、matplotlibを使ってデータを可視化することができる。

以下に示すように、必要なライブラリをインポートする。

importpandasaspd
インポートmatplotlib.pyplotasplt

学校、名前、給料のpandasデータフレームを作る。例えば、以下のように学校をデータフレームに変換することができます:

df_school = pd.DataFrame(schools)
プリント(df_school)

出力はこうだ:

同様に、給料や名前についても同じことができる。

データを視覚化するために、以下のように棒グラフをプロットすることができる。

df.plot(kind='barh', x ='社長', y ='給料')

出力はこうだ:

なぜウェブスクレイピングにプロキシが必要なのか?

Webスクレイピングは、企業が市場の洞察や業界に関する有益な情報を抽出し、データ駆動型のサービスを提供し、データ駆動型の意思決定を行うのに役立ちます。プロキシは、以下の理由で様々なウェブサイトからデータを効果的にスクレイピングするために不可欠です。

  • IPバンの回避 - スクレイパーによる大量のリクエストを阻止するため、ビジネスウェブサイトはクロール可能なデータ量を制限している。クロールレートはウェブサイトの速度を低下させ、ユーザーが目的のコンテンツに効果的にアクセスすることが困難になります。しかし、データをスクレイピングするために十分なプロキシのプールを使用する場合は、ターゲットウェブサイトのレート制限を乗り越えることができます。プロキシは異なるIPアドレスからリクエストを送信するため、要件に応じてウェブサイトからデータを抽出することができるからです。
  • 地域固有のコンテンツへのアクセスを可能にする - 企業は、特定の地理的地域の顧客に適切な製品機能と価格を提供するために、競合他社(ウェブサイト)を監視する必要があります。IPアドレスを持つ居住用プロキシを使用することで、その地域で利用可能なすべてのコンテンツにアクセスすることができます。
  • セキュリティの強化 - プロキシサーバーは、ユーザーのデバイスのIPアドレスを隠すことで、セキュリティのレイヤーを追加します。

上記のメリットを得るために必要なプロキシの数をご存知ですか?必要なプロキシの数は、以下の計算式で求めることができます:

プロキシ数 = アクセスリクエスト数 / クロール率

アクセス要求の数は、以下のパラメータに依存する。

  • スクレイパーがウェブサイトから情報を抽出する頻度
  • スクレイピングしたいページ数

一方、クロール率は、ユーザーが一定時間内に行うリクエスト数によって制限される。ウェブサイトによっては、自動化されたユーザーと人間によるユーザーのリクエストを区別するために、ユーザーごとのリクエスト数を制限しているところもあります。 

Pythonでプロキシを使う

以下の手順でPythonでプロキシを使うことができます。

  • Pythonのrequestsモジュールをインポートする必要があります。
輸入リクエスト
  • プロキシのプールを作ってローテーションさせることができる。
プロキシ='http://114.121.248.251:8080'
url='https://ipecho.net/plain'
  • requests.get()を使えば、URLのパラメータとしてプロキシを渡してGETリクエストを送ることができる。
page = requests.get(url,
                    proxies={"http": proxy, "https": proxy})
  • 接続エラーがなければ、リクエストされたURLの内容を取得できる。
プリント(ページ.テキスト)

出力はこうだ:

結論

手作業によるスクレイピングの代わりに、ウェブスクレイピングを使ってウェブサイトからデータを抽出できることを説明した。ウェブスクレイピングはコスト効率が高く、時間の節約にもなる。企業は、データ主導の意思決定を行い、貴重な洞察を得るために、ウェブ情報を収集し、再構築するためにこれを使用します。プロキシの使用は、ターゲットウェブサイトからユーザーの元のIPアドレスを隠すため、安全なウェブスクレイピングには不可欠です。ウェブスクレイピングには、データセンターまたは住宅用プロキシを使用することができます。しかし、高速で簡単に検出されないため、住宅プロキシを使用することをお勧めします。さらに、Pythonでは正規表現を使用して、文字列のセットをマッチさせたり検索したりすることができる。つまり、正規表現の助けを借りて、テキストから任意の文字列パターンを抽出できる。また、データの可視化は、膨大な量のデータをチャートやグラフなどの視覚的なデータに変換し、異常の検出やデータの有用な傾向の特定に役立てることができる。