Python-web-scraping-quick-guide

提供:Dev Guides
移動先:案内検索

Python Webスクレイピング-はじめに

Webスクレイピングは、Webから情報を抽出する自動プロセスです。 この章では、Webスクレイピング、Webクロールとの比較、およびWebスクレイピングを選択する理由について詳しく説明します。 また、Webスクレイパーのコンポーネントと動作についても学びます。

Webスクレイピングとは何ですか?

「スクラップ」という単語の辞書の意味は、ウェブから何かを取得することを意味します。 ここで、Webから得られるものとその入手方法という2つの疑問が生じます。

最初の質問に対する答えは*「データ」*です。 プログラマーにとってデータは不可欠であり、すべてのプログラミングプロジェクトの基本的な要件は、大量の有用なデータです。

データを取得する方法はたくさんあるため、2番目の質問への答えは少し複雑です。 一般に、データベースやデータファイル、その他のソースからデータを取得する場合があります。 しかし、オンラインで利用可能な大量のデータが必要な場合はどうでしょうか? そのような種類のデータを取得する方法の1つは、必要なデータを手動で検索(Webブラウザーでクリックする)して保存(スプレッドシートまたはファイルにコピーアンドペースト)することです。 この方法は非常に面倒で時間がかかります。 そのようなデータを取得する別の方法は、*ウェブスクレイピング*を使用することです。

  • Webスクレイピング*は、* Webデータマイニング*または* Webハーベスティングとも呼ばれ、Webから有用な情報を自動的に抽出、解析、ダウンロード、整理できるエージェントを構築するプロセスです。 言い換えると、Webスクレイピングソフトウェアは、Webサイトから手動でデータを保存する代わりに、要件に従って複数のWebサイトからデータを自動的にロードおよび抽出します。

Webスクレイピングの起源

Webスクレイピングの起源はスクリーンスクラップであり、これは非WebベースのアプリケーションまたはネイティブWindowsアプリケーションを統合するために使用されました。 もともとは、World Wide Web(WWW)が広く使用される前にスクリーンスクレイピングが使用されていましたが、WWWを拡大することはできませんでした。 このため、画面スクレイピングのアプローチを自動化する必要があり、「Webスクレイピング」*と呼ばれる手法が登場しました。

WebクロールとWebスクレイピング

Webクロールとスクレイピングという用語は、それらの基本概念がデータの抽出であるため、しばしば同じ意味で使用されます。 ただし、それらは互いに異なります。 定義との基本的な違いを理解できます。

Webクロールは基本的に、ボットまたはクローラーを使用してページ上の情報のインデックスを作成するために使用されます。 *インデックス作成*とも呼ばれます。 一方、Webスクレイピングは、ボットまたはスクレーパーを使用して情報を抽出する自動化された方法です。 *データ抽出*とも呼ばれます。

これら2つの用語の違いを理解するために、以下に示す比較表を見てみましょう-

Web Crawling Web Scraping
Refers to downloading and storing the contents of a large number of websites. Refers to extracting individual data elements from the website by using a site-specific structure.
Mostly done on large scale. Can be implemented at any scale.
Yields generic information. Yields specific information.
Used by major search engines like Google, Bing, Yahoo. Googlebot is an example of a web crawler. The information extracted using web scraping can be used to replicate in some other website or can be used to perform data analysis. For example the data elements can be names, address, price etc.

Webスクレイピングの使用

Webスクレイピングを使用する用途と理由は、World Wide Webの使用と同様に無限です。 Webスクレイパーは、オンラインフードの注文、オンラインショッピングWebサイトのスキャン、試合のチケットの購入などを行うことができます。 人間ができるように。 Webスクレイピングの重要な使用法のいくつかをここで説明します-

  • * EコマースWebサイト*-Webスクレイパーは、比較のためにさまざまなEコマースWebサイトから特定の製品の価格に特に関連するデータを収集できます。
  • コンテンツアグリゲーター-Webスクレイピングは、更新されたデータをユーザーに提供するために、ニュースアグリゲーターやジョブアグリゲーターなどのコンテンツアグリゲーターによって広く使用されています。
  • マーケティングおよび販売キャンペーン-Webスクレイパーを使用して、電子メール、電話番号などのデータを取得できます。 販売およびマーケティングキャンペーン用。
  • 検索エンジン最適化(SEO)-Webスクレイピングは、SEMRush、MajesticなどのSEOツールで広く使用されています。 ビジネスにとって重要な検索キーワードのランク付け方法をビジネスに伝えます。
  • 機械学習プロジェクトのデータ-機械学習プロジェクトのデータの取得は、Webスクレイピングに依存します。

研究用データ-研究者は、この自動化プロセスにより時間を節約することにより、研究作業の目的に役立つデータを収集できます。

Webスクレーパーのコンポーネント

ウェブスクレーパーは、次のコンポーネントで構成されています-

Webクローラーモジュール

Webスクレイパーの非常に必要なコンポーネントであるWebクローラーモジュールは、URLに対してHTTPまたはHTTPSリクエストを行うことにより、ターゲットWebサイトをナビゲートするために使用されます。 クローラーは非構造化データ(HTMLコンテンツ)をダウンロードし、次のモジュールである抽出プログラムに渡します。

抽出器

抽出プログラムは、フェッチされたHTMLコンテンツを処理し、データを半構造化形式に抽出します。 これは、パーサーモジュールとも呼ばれ、正規表現、HTML解析、DOM解析、人工知能などのさまざまな解析手法を使用して機能します。

データ変換およびクリーニングモジュール

上記で抽出したデータは、すぐに使用するには適していません。 使用できるように、いくつかのクリーニングモジュールを通過する必要があります。 この目的には、文字列操作や正規表現などのメソッドを使用できます。 抽出と変換は単一のステップでも実行できることに注意してください。

ストレージモジュール

データを抽出した後、要件に従って保存する必要があります。 ストレージモジュールは、データベースまたはJSONまたはCSV形式で保存できる標準形式でデータを出力します。

Webスクレーパーの動作

Webスクレイパーは、複数のWebページのコンテンツをダウンロードし、そこからデータを抽出するために使用されるソフトウェアまたはスクリプトとして定義できます。

Web Scraper

上記の図に示すように、簡単な手順でWebスクレーパーの動作を理解できます。

ステップ1:Webページからコンテンツをダウンロードする

このステップでは、Webスクレイパーが要求されたコンテンツを複数のWebページからダウンロードします。

ステップ2:データの抽出

ウェブサイト上のデータはHTMLであり、ほとんど構造化されていません。 したがって、このステップでは、Webスクレイパーはダウンロードされたコンテンツから構造化データを解析および抽出します。

ステップ3:データを保存する

ここで、Webスクレイパーは、抽出されたデータをCSV、JSON、またはデータベースなどの形式で保存および保存します。

ステップ4:データの分析

これらのすべてのステップが正常に実行された後、Webスクレーパーはこうして得られたデータを分析します。

Python入門

最初の章では、Webスクレイピングとは何かを学びました。 この章では、Pythonを使用してWebスクレイピングを実装する方法を見てみましょう。

WebスクレイピングにPythonを使用する理由

Pythonは、Webスクレイピングを実装するための一般的なツールです。 Pythonプログラミング言語は、サイバーセキュリティ、侵入テスト、デジタルフォレンジックアプリケーションに関連する他の有用なプロジェクトにも使用されます。 Pythonの基本プログラミングを使用すると、他のサードパーティツールを使用せずにWebスクレイピングを実行できます。

Pythonプログラミング言語は非常に人気が高まっており、PythonがWebスクレイピングプロジェクトに適している理由は以下のとおりです-

構文のシンプルさ

Pythonは、他のプログラミング言語に比べて最も単純な構造を持っています。 Pythonのこの機能により、テストが容易になり、開発者はプログラミングに集中できます。

組み込みモジュール

PythonをWebスクレイピングに使用するもう1つの理由は、Pythonが備えている組み込みの有用な外部ライブラリです。 Pythonをプログラミングのベースとして使用することで、Webスクレイピングに関連する多くの実装を実行できます。

オープンソースプログラミング言語

Pythonはオープンソースのプログラミング言語であるため、コミュニティから大きな支持を得ています。

幅広いアプリケーション

Pythonは、小さなシェルスクリプトからエンタープライズWebアプリケーションまで、さまざまなプログラミングタスクに使用できます。

Pythonのインストール

Pythonディストリビューションは、Windows、MAC、Unix/Linuxなどのプラットフォームで利用できます。 Pythonをインストールするには、プラットフォームに適用可能なバイナリコードのみをダウンロードする必要があります。 ただし、プラットフォームのバイナリコードが利用できない場合は、ソースコードを手動でコンパイルできるようにCコンパイラが必要です。

次のように、さまざまなプラットフォームにPythonをインストールできます-

UnixおよびLinuxにPythonをインストールする

Unix/LinuxマシンにPythonをインストールするには、以下の手順に従う必要があります-

  • ステップ1 *-リンクhttps://www.python.org/downloads/に移動します
  • ステップ2 *-上記のリンクから、Unix/Linuxで利用可能なzip形式のソースコードをダウンロードします。
  • ステップ3 *-ファイルをコンピューターに抽出します。
  • ステップ4 *-次のコマンドを使用してインストールを完了します-
run ./configure script
make
make install

インストールされているPythonは、標準の場所 /usr/local/bin にあり、そのライブラリは /usr/local/lib/pythonXX にあります(XXはPythonのバージョンです)。

WindowsにPythonをインストールする

PythonをWindowsマシンにインストールするには、以下の手順に従う必要があります-

  • ステップ1 *-リンクhttps://www.python.org/downloads/に移動します

ステップ2 *-Windowsインストーラー *python-XYZ.msi ファイルをダウンロードします。XYZはインストールする必要のあるバージョンです。

  • ステップ3 *-ここで、インストーラファイルをローカルマシンに保存し、MSIファイルを実行します。
  • ステップ4 *-最後に、ダウンロードしたファイルを実行してPythonインストールウィザードを起動します。

MacintoshにPythonをインストールする

Mac OS XにPython 3をインストールするには、 Homebrew を使用する必要があります。 Homebrewは簡単にインストールでき、優れたパッケージインストーラーです。

Homebrewは、次のコマンドを使用してインストールすることもできます-

$ ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"

パッケージマネージャーを更新するには、次のコマンドを使用できます-

$ brew update

次のコマンドの助けを借りて、MACマシンにPython3をインストールできます-

$ brew install python3

PATHのセットアップ

次の手順を使用して、さまざまな環境でパスを設定できます-

Unix/Linuxでのパスのセットアップ

さまざまなコマンドシェルを使用してパスを設定するには、次のコマンドを使用します-

cshシェルの場合

setenv PATH "$PATH:/usr/local/bin/python".

bashシェルの場合(Linux)

ATH="$PATH:/usr/local/bin/python".

shまたはkshシェルの場合

PATH="$PATH:/usr/local/bin/python".

Windowsでのパスのセットアップ

Windowsでパスを設定するには、コマンドプロンプトでパス*%path%; C:\ Python *を使用し、Enterキーを押します。

Pythonを実行する

次の3つの方法のいずれかを使用してPythonを起動できます-

インタラクティブ通訳

コマンドラインインタープリターまたはシェルを提供しているUNIXやDOSなどのオペレーティングシステムは、Pythonの起動に使用できます。

次のようにインタラクティブなインタプリタでコーディングを開始できます-

ステップ1 *-コマンドラインで *python と入力します。

  • ステップ2 *-その後、インタラクティブインタープリターですぐにコーディングを開始できます。
$python # Unix/Linux
or
python% # Unix/Linux
or
C:> python # Windows/DOS

コマンドラインからのスクリプト

インタプリタを呼び出すことにより、コマンドラインでPythonスクリプトを実行できます。 それは次のように理解することができます-

$python script.py # Unix/Linux
or
python% script.py # Unix/Linux
or
C: >python script.py # Windows/DOS

統合開発環境

システムがPythonをサポートしているGUIアプリケーションを持っている場合、GUI環境からPythonを実行することもできます。 さまざまなプラットフォームでPythonをサポートするいくつかのIDEを以下に示します-

*IDE for UNIX* -PythonのUNIXにはIDLE IDEがあります。
*IDE for Windows* -WindowsにはGUIもあるPythonWin IDEがあります。
*Macintosh用IDE* -Macintoshには、メインWebサイトからMacBinaryまたはBinHex'dファイルとしてダウンロード可能なIDLE IDEがあります。

Webスクレイピング用のPythonモジュール

この章では、Webスクレイピングに使用できるさまざまなPythonモジュールについて学びましょう。

virtualenvを使用したPython開発環境

Virtualenvは、孤立したPython環境を作成するツールです。 virtualenvの助けを借りて、Pythonプロジェクトに必要なパッケージを使用するために必要なすべての実行可能ファイルを含むフォルダーを作成できます。 また、グローバルインストールにアクセスせずにPythonモジュールを追加および変更できます。

次のコマンドを使用して virtualenv をインストールできます-

(base) D:\ProgramData>pip install virtualenv
Collecting virtualenv
   Downloading
https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c3
5d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl
(1.9MB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 1.9MB 86kB/s
Installing collected packages: virtualenv
Successfully installed virtualenv-16.0.0

今、私たちは次のコマンドの助けを借りてプロジェクトを表すディレクトリを作成する必要があります-

(base) D:\ProgramData>mkdir webscrap

今、この次のコマンドの助けを借りてそのディレクトリに入る-

(base) D:\ProgramData>cd webscrap

今、私たちは次のように選択した仮想環境フォルダを初期化する必要があります-

(base) D:\ProgramData\webscrap>virtualenv websc
Using base prefix 'd:\\programdata'
New python executable in D:\ProgramData\webscrap\websc\Scripts\python.exe
Installing setuptools, pip, wheel...done.

次に、以下のコマンドを使用して仮想環境をアクティブ化します。 正常にアクティブ化されると、ブラケットの左側にその名前が表示されます。

(base) D:\ProgramData\webscrap>websc\scripts\activate

次のように、この環境に任意のモジュールをインストールできます-

(websc) (base) D:\ProgramData\webscrap>pip install requests
Collecting requests
   Downloading
https://files.pythonhosted.org/packages/65/47/7e02164a2a3db50ed6d8a6ab1d6d60b69
c4c3fdf57a284257925dfc12bda/requests-2.19.1-py2.py3-none-any.whl (9
1kB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 92kB 148kB/s
Collecting chardet<3.1.0,>=3.0.2 (from requests)
   Downloading
https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca
55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133
kB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 143kB 369kB/s
Collecting certifi>=2017.4.17 (from requests)
   Downloading
https://files.pythonhosted.org/packages/df/f7/04fee6ac349e915b82171f8e23cee6364
4d83663b34c539f7a09aed18f9e/certifi-2018.8.24-py2.py3-none-any.whl
(147kB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 153kB 527kB/s
Collecting urllib3<1.24,>=1.21.1 (from requests)
   Downloading
https://files.pythonhosted.org/packages/bd/c9/6fdd990019071a4a32a5e7cb78a1d92c5
3851ef4f56f62a3486e6a7d8ffb/urllib3-1.23-py2.py3-none-any.whl (133k
B)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 143kB 517kB/s
Collecting idna<2.8,>=2.5 (from requests)
   Downloading
https://files.pythonhosted.org/packages/4b/2a/0276479a4b3caeb8a8c1af2f8e4355746
a97fab05a372e4a2c6a6b876165/idna-2.7-py2.py3-none-any.whl (58kB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 61kB 339kB/s
Installing collected packages: chardet, certifi, urllib3, idna, requests
Successfully installed certifi-2018.8.24 chardet-3.0.4 idna-2.7 requests-2.19.1
urllib3-1.23

仮想環境を非アクティブ化するには、次のコマンドを使用できます-

(websc) (base) D:\ProgramData\webscrap>deactivate
(base) D:\ProgramData\webscrap>

(websc)が非アクティブ化されていることがわかります。

Webスクレイピング用のPythonモジュール

Webスクレイピングは、Webから有用な情報を自動的に抽出、解析、ダウンロード、整理できるエージェントを構築するプロセスです。 つまり、Webスクレイピングソフトウェアは、Webサイトからデータを手動で保存する代わりに、要件に従って複数のWebサイトからデータを自動的にロードおよび抽出します。

このセクションでは、Webスクレイピングに役立つPythonライブラリについて説明します。

リクエスト

これは、単純なPython Webスクレイピングライブラリです。 Webページへのアクセスに使用される効率的なHTTPライブラリです。 Requests の助けを借りて、Webページの生のHTMLを取得し、データを取得するために解析することができます。 *リクエスト*を使用する前に、そのインストールを理解してください。

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

仮想環境またはグローバルインストールのいずれかにインストールできます。 pip コマンドの助けを借りて、次のように簡単にインストールできます-

(base) D:\ProgramData> pip install requests
Collecting requests
Using cached
https://files.pythonhosted.org/packages/65/47/7e02164a2a3db50ed6d8a6ab1d6d60b69
c4c3fdf57a284257925dfc12bda/requests-2.19.1-py2.py3-none-any.whl
Requirement already satisfied: idna<2.8,>=2.5 in d:\programdata\lib\sitepackages
(from requests) (2.6)
Requirement already satisfied: urllib3<1.24,>=1.21.1 in
d:\programdata\lib\site-packages (from requests) (1.22)
Requirement already satisfied: certifi>=2017.4.17 in d:\programdata\lib\sitepackages
(from requests) (2018.1.18)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in
d:\programdata\lib\site-packages (from requests) (3.0.4)
Installing collected packages: requests
Successfully installed requests-2.19.1

この例では、Webページに対してGET HTTPリクエストを作成しています。 このためには、まず次のようにリクエストライブラリをインポートする必要があります-

In [1]: import requests

次のコード行では、リクエストを使用して、GETリクエストを作成することにより、URL [[1]] HTTPリクエストを作成します。

In [2]: r = requests.get('https://authoraditiagarwal.com/')

これで、次のように .text プロパティを使用してコンテンツを取得できます-

In [5]: r.text[:200]

次の出力では、最初の200文字が取得されていることに注意してください。

Out[5]: '<!DOCTYPE html>\n<html lang="en-US"\n\titemscope
\n\titemtype="http://schema.org/WebSite" \n\tprefix="og: http://ogp.me/ns#"
>\n<head>\n\t<meta charset
="UTF-8"/>\n\t<meta http-equiv="X-UA-Compatible" content="IE'

Urllib3

*requests* ライブラリに似たURLからデータを取得するために使用できるもう1つのPythonライブラリです。 詳細については、https://urllib3.readthedocs.io/en/latest/の技術文書をご覧ください。

Urllib3のインストール

*pip* コマンドを使用して、仮想環境またはグローバルインストールのいずれかに *urllib3* をインストールできます。
(base) D:\ProgramData>pip install urllib3
Collecting urllib3
Using cached
https://files.pythonhosted.org/packages/bd/c9/6fdd990019071a4a32a5e7cb78a1d92c5
3851ef4f56f62a3486e6a7d8ffb/urllib3-1.23-py2.py3-none-any.whl
Installing collected packages: urllib3
Successfully installed urllib3-1.23

例:Urllib3とBeautifulSoupを使用したスクレイピング

次の例では、 Urllib3 および BeautifulSoup を使用してWebページをスクレイピングしています。 Webページから生データ(HTML)を取得するために、リクエストライブラリの場所で Urllib3 を使用しています。 次に、そのHTMLデータの解析に BeautifulSoup を使用しています。

import urllib3
from bs4 import BeautifulSoup
http = urllib3.PoolManager()
r = http.request('GET', 'https://authoraditiagarwal.com')
soup = BeautifulSoup(r.data, 'lxml')
print (soup.title)
print (soup.title.text)

これは、このコードを実行したときに観察される出力です-

<title>Learn and Grow with Aditi Agarwal</title>
Learn and Grow with Aditi Agarwal

セレン

これは、さまざまなブラウザとプラットフォームにまたがるWebアプリケーション向けのオープンソースの自動テストスイートです。 単一のツールではなく、ソフトウェアのスイートです。 Python、Java、C#、Ruby、JavaScript用のセレンバインディングがあります。 ここでは、セレンとそのPythonバインディングを使用してWebスクレイピングを実行します。 リンクlink:/selenium/index [Selenium]でSelenium with Javaの詳細を学ぶことができます。

Selenium Pythonバインディングは、Firefox、IE、Chrome、RemoteなどのSelenium WebDriversにアクセスするための便利なAPIを提供します。 現在サポートされているPythonバージョンは2.7、3.5以上です。

Seleniumのインストール

*pip* コマンドを使用して、仮想環境またはグローバルインストールのいずれかに *urllib3* をインストールできます。
pip install selenium

seleniumは選択したブラウザとのインターフェイスにドライバーを必要とするため、それをダウンロードする必要があります。 次の表は、さまざまなブラウザーと、それらをダウンロードするためのリンクを示しています。

Chrome https://sites.google.com/a/chromium.org/
Edge https://developer.microsoft.com/
Firefox https://github.com/
Safari https://webkit.org/

この例は、セレンを使用したWebスクレイピングを示しています。 また、セレンテストと呼ばれるテストにも使用できます。

指定されたバージョンのブラウザー用の特定のドライバーをダウンロードした後、Pythonでプログラミングを行う必要があります。

まず、次のようにセレンから webdriver をインポートする必要があります-

from selenium import webdriver

次に、要件に従ってダウンロードしたWebドライバーのパスを指定します-

path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
browser = webdriver.Chrome(executable_path = path)

次に、Pythonスクリプトで制御されるWebブラウザーで開きたいURLを指定します。

browser.get('https://authoraditiagarwal.com/leadershipmanagement')

また、lxmlで提供されるxpathを提供することにより、特定の要素をスクレイピングすることもできます。

browser.find_element_by_xpath('/html/body').click()

出力については、Pythonスクリプトで制御されているブラウザーを確認できます。

スクレイピー

ScrapyはPythonで書かれた高速でオープンソースのWebクロールフレームワークであり、XPathに基づくセレクターの助けを借りてWebページからデータを抽出するために使用されます。 Scrapyは、BSDでライセンスされた2008年6月26日に初めてリリースされ、2015年6月にマイルストーン1.0がリリースされました。 Webサイトからデータを抽出、処理、構造化するために必要なすべてのツールを提供します。

Scrapyのインストール

*pip* コマンドを使用して、仮想環境またはグローバルインストールのいずれかに *urllib3* をインストールできます。
pip install scrapy

Scrapyの詳細については、次のリンクにアクセスしてください:/scrapy/index [Scrapy]

Webスクレイピングの合法性

Pythonを使用すると、WebサイトまたはWebページの特定の要素をスクレイピングできますが、合法かどうかはわかりますか? Webスクレイピングの前に、Webスクレイピングの合法性について知る必要があります。 この章では、Webスクレイピングの合法性に関連する概念について説明します。

前書き

一般に、スクレイピングされたデータを個人的な使用に使用する場合、問題はない可能性があります。 ただし、そのデータを再公開する場合は、同じことを行う前に、所有者にダウンロードリクエストを行うか、スクレイピングするデータに関するポリシーやバックグラウンド調査を行う必要があります。

スクレイピングの前に必要な調査

データをスクレイピングするためにWebサイトをターゲットにしている場合、その規模と構造を理解する必要があります。 以下は、Webスクレイピングを開始する前に分析する必要があるファイルの一部です。

robots.txtの分析

実際、ほとんどの出版社はプログラマーがある程度自分のウェブサイトをクロールすることを許可しています。 他の意味では、出版社はウェブサイトの特定の部分をクロールすることを望んでいます。 これを定義するには、Webサイトは、クロールできる部分とできない部分を示すためのいくつかのルールを設定する必要があります。 このようなルールは、 robots.txt というファイルに定義されています。

*robots.txt* は、クローラーが許可されているかどうかをスクレイピングできないWebサイトの部分を識別するために使用される、人間が読み取れるファイルです。 robots.txtファイルの標準形式はなく、Webサイトの発行者は必要に応じて変更できます。 特定のWebサイトのURLの後にスラッシュとrobots.txtを指定することにより、特定のWebサイトのrobots.txtファイルを確認できます。 たとえば、Google.comで確認する場合は、https://www.google.com/robots.txtと入力する必要があり、次のようになります-
User-agent: *
Disallow:/search
Allow:/search/about
Allow:/search/static
Allow:/search/howsearchworks
Disallow:/sdch
Disallow:/groups
Disallow:/indexl?
Disallow:/?
Allow:/?hl=
Disallow:/?hl=*&
Allow:/?hl=*&gws_rd=ssl$
and so on……..

ウェブサイトのrobots.txtファイルで定義されている最も一般的なルールのいくつかは次のとおりです-

   User-agent: BadCrawler
Disallow:/

上記のルールは、robots.txtファイルが BadCrawler ユーザーエージェントを持つクローラーにウェブサイトをクロールしないように要求することを意味します。

User-agent: *
Crawl-delay: 5
Disallow:/trap

上記のルールは、サーバーの過負荷を回避するために、すべてのユーザーエージェントのダウンロード要求の間にrobots.txtファイルがクローラーを5秒間遅延させることを意味します。 /trap リンクは、許可されていないリンクをたどる悪意のあるクローラーをブロックしようとします。 Webサイトの発行者は、要件に応じてさらに多くのルールを定義できます。 それらのいくつかはここで議論されています-

サイトマップファイルの分析

更新された情報を求めてWebサイトをクロールする場合はどうするべきですか? 更新された情報を取得するためにすべてのWebページをクロールしますが、これにより特定のWebサイトのサーバートラフィックが増加します。 ウェブサイトがサイトマップファイルを提供している理由は、クローラーがすべてのウェブページをクロールすることなく更新コンテンツを見つけるのを支援するためです。 サイトマップ標準はhttp://www.sitemaps.org/protocollで定義されています。

サイトマップファイルのコンテンツ

以下は、robot.txtファイルで発見されたhttps://www.microsoft.com/robots.txtのサイトマップファイルの内容です-

Sitemap: https://www.microsoft.com/en-us/explore/msft_sitemap_index.xml
Sitemap: https://www.microsoft.com/learning/sitemap.xml
Sitemap: https://www.microsoft.com/en-us/licensing/sitemap.xml
Sitemap: https://www.microsoft.com/en-us/legal/sitemap.xml
Sitemap: https://www.microsoft.com/filedata/sitemaps/RW5xN8
Sitemap: https://www.microsoft.com/store/collections.xml
Sitemap: https://www.microsoft.com/store/productdetailpages.index.xml
Sitemap: https://www.microsoft.com/en-us/store/locations/store-locationssitemap.xml

上記のコンテンツは、サイトマップがウェブサイト上のURLをリストし、さらにウェブマスターが最終更新日、コンテンツの変更、他との関係におけるURLの重要性などの追加情報を指定できることを示しています。 各URLについて。

ウェブサイトのサイズは?

ウェブサイトのサイズ、つまり WebサイトのWebページの数は、クロールの方法に影響しますか? もちろんそうです。 クロールするWebページの数が少ない場合、効率は深刻な問題にはなりませんが、Microsoft.comなどのWebページに数百万のWebページがある場合、各Webページを連続してダウンロードするには数か月かかり、効率性は深刻な問題になります。

ウェブサイトのサイズを確認する

Googleのクローラーの結果のサイズを確認することで、ウェブサイトのサイズを推定できます。 Google検索の実行中にキーワード site を使用して、結果をフィルタリングできます。 たとえば、https://authoraditiagarwal.com/のサイズの見積もりは以下のとおりです-

サイズの確認

約60の結果があることがわかります。これは、大きなWebサイトではなく、クロールしても効率の問題が発生しないことを意味します。

ウェブサイトで使用されているテクノロジーはどれですか?

もう1つの重要な質問は、Webサイトで使用されているテクノロジーがクロール方法に影響するかどうかです。 はい、影響します。 しかし、ウェブサイトで使用されているテクノロジーについてはどうすれば確認できますか? builtwith という名前のPythonライブラリがあり、その助けを借りてWebサイトで使用されているテクノロジーについて調べることができます。

この例では、https://authoraditiagarwal.comというWebサイトで使用されているテクノロジーを、Pythonライブラリ builtwith を使用して確認します。 しかし、このライブラリを使用する前に、次のようにインストールする必要があります-

(base) D:\ProgramData>pip install builtwith
Collecting builtwith
   Downloading
https://files.pythonhosted.org/packages/9b/b8/4a320be83bb3c9c1b3ac3f9469a5d66e0
2918e20d226aa97a3e86bddd130/builtwith-1.3.3.tar.gz
Requirement already satisfied: six in d:\programdata\lib\site-packages (from
builtwith) (1.10.0)
Building wheels for collected packages: builtwith
   Running setup.py bdist_wheel for builtwith ... done
   Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\2b\00\c2\a96241e7fe520e75093898b
f926764a924873e0304f10b2524
Successfully built builtwith
Installing collected packages: builtwith
Successfully installed builtwith-1.3.3

今、次の簡単なコード行の助けを借りて、特定のウェブサイトで使用されている技術を確認できます-

In [1]: import builtwith
In [2]: builtwith.parse('http://authoraditiagarwal.com')
Out[2]:
{'blogs': ['PHP', 'WordPress'],
   'cms': ['WordPress'],
   'ecommerce': ['WooCommerce'],
   'font-scripts': ['Font Awesome'],
   'javascript-frameworks': ['jQuery'],
   'programming-languages': ['PHP'],
   'web-servers': ['Apache']}

ウェブサイトの所有者は誰ですか?

Webサイトの所有者も重要です。所有者がクローラーをブロックすることで知られている場合、クローラーはWebサイトからデータをスクレイピングする際に注意する必要があるためです。 Whois という名前のプロトコルがあり、これを使用してWebサイトの所有者を確認できます。

この例では、Whoisの助けを借りて、https://www.microsoft.com/en-in/[microsoft.com]と言うWebサイトの所有者を確認します。 しかし、このライブラリを使用する前に、次のようにインストールする必要があります-

(base) D:\ProgramData>pip install python-whois
Collecting python-whois
   Downloading
https://files.pythonhosted.org/packages/63/8a/8ed58b8b28b6200ce1cdfe4e4f3bbc8b8
5a79eef2aa615ec2fef511b3d68/python-whois-0.7.0.tar.gz (82kB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 92kB 164kB/s
Requirement already satisfied: future in d:\programdata\lib\site-packages (from
python-whois) (0.16.0)
Building wheels for collected packages: python-whois
   Running setup.py bdist_wheel for python-whois ... done
   Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\06\cb\7d\33704632b0e1bb64460dc2b
4dcc81ab212a3d5e52ab32dc531
Successfully built python-whois
Installing collected packages: python-whois
Successfully installed python-whois-0.7.0

今、次の簡単なコード行の助けを借りて、特定のウェブサイトで使用されている技術を確認できます-

In [1]: import whois
In [2]: print (whois.whois('microsoft.com'))
{
   "domain_name": [
      "MICROSOFT.COM",
      "microsoft.com"
   ],
   -------
   "name_servers": [
      "NS1.MSFT.NET",
      "NS2.MSFT.NET",
      "NS3.MSFT.NET",
      "NS4.MSFT.NET",
      "ns3.msft.net",
      "ns1.msft.net",
      "ns4.msft.net",
      "ns2.msft.net"
   ],
   "emails": [
      "[email protected]",
      "[email protected]",
      "[email protected]",
      "[email protected]"
   ],
}

Python Webスクレイピング-データ抽出

Webページを分析するということは、その構造を理解することを意味します。 さて、なぜWebスクレイピングにとって重要なのかという疑問が生じます。 この章では、これを詳細に理解してみましょう。

Webページ分析

Webページの分析は重要です。分析なしでは、抽出後にそのWebページ(構造化または非構造化)からデータを受信する形式を知ることができないためです。 私たちは次の方法でウェブページの分析を行うことができます-

ページソースの表示

これは、ソースコードを調べることでWebページがどのように構成されているかを理解する方法です。 これを実装するには、ページを右クリックし、[ページのソースを表示]オプションを選択する必要があります。 次に、そのWebページから関心のあるデータをHTMLの形式で取得します。 しかし、主な関心事は、書式設定が困難な空白と書式設定です。

[要素の検査]オプションをクリックしてページソースを検査する

これは、Webページを分析する別の方法です。 ただし、違いは、Webページのソースコードの書式設定と空白の問題を解決することです。 これを実装するには、右クリックして、メニューから Inspect または Inspect element オプションを選択します。 そのWebページの特定の領域または要素に関する情報を提供します。

Webページからデータを抽出するさまざまな方法

以下の方法は、主にWebページからデータを抽出するために使用されます-

正規表現

Pythonに埋め込まれた高度に専門化されたプログラミング言語です。 Pythonの re モジュールで使用できます。 REまたは正規表現または正規表現パターンとも呼ばれます。 正規表現の助けを借りて、データから照合する文字列の可能なセットに対していくつかのルールを指定できます。

正規表現全般について詳しく知りたい場合は、リンクlink//automata_theory/regular_expressions [https://www.finddevguides.com/automata_theory/regular_expressions]にアクセスし、reモジュールまたは正規表現について詳しく知りたい場合Pythonでは、リンク:/python/python_reg_expressions [link https://www.finddevguides.com/python/python_reg_expressions]をたどることができます。

次の例では、正規表現を使用して<td>の内容を照合した後、http://example.webscraping.comからインドに関するデータをスクレイピングします。

import re
import urllib.request
response =
   urllib.request.urlopen('http://example.webscraping.com/places/default/view/India-102')
html = response.read()
text = html.decode()
re.findall('<td class="w2p_fw">(.*?)</td>',text)

出力

対応する出力は次のようになります-

[
   '<img src="/places/static/images/flags/in.png"/>',
   '3,287,590 square kilometres',
   '1,173,108,018',
   'IN',
   'India',
   'New Delhi',
   '<a href="/places/default/continent/AS">AS</a>',
   '.in',
   'INR',
   'Rupee',
   '91',
   '######',
   '^(\\d{6})$',
   'enIN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc',
   '<div>
      <a href="/places/default/iso/CN">CN </a>
      <a href="/places/default/iso/NP">NP </a>
      <a href="/places/default/iso/MM">MM </a>
      <a href="/places/default/iso/BT">BT </a>
      <a href="/places/default/iso/PK">PK </a>
      <a href="/places/default/iso/BD">BD </a>
   </div>'
]

上記の出力では、正規表現を使用して、インドの国に関する詳細を確認できます。

美しいスープ

Webページからすべてのハイパーリンクを収集したい場合、BeautifulSoupという名前のパーサーを使用できます。これは、https://www.crummy.com/software/BeautifulSoup/bs4/doc/[[[2]]]簡単に言えば、BeautifulSoupはHTMLおよびXMLファイルからデータを引き出すためのPythonライブラリです。 スープオブジェクトを作成するために入力(ドキュメントまたはURL)が必要なため、それ自体ではWebページを取得できないため、リクエストで使用できます。 次のPythonスクリプトを使用して、Webページとハイパーリンクのタイトルを収集できます。

Beautiful Soupのインストール

*pip* コマンドを使用して、仮想環境またはグローバルインストールのいずれかに *beautifulsoup* をインストールできます。
(base) D:\ProgramData>pip install bs4
Collecting bs4
   Downloading
https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89
a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Requirement already satisfied: beautifulsoup4 in d:\programdata\lib\sitepackages
(from bs4) (4.6.0)
Building wheels for collected packages: bs4
   Running setup.py bdist_wheel for bs4 ... done
   Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\a0\b0\b2\4f80b9456b87abedbc0bf2d
52235414c3467d8889be38dd472
Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1

この例では、Pythonモジュールのリクエストで実装された上記の例を拡張していることに注意してください。 Webページのタイトルなどの詳細を取得するためにさらに使用されるスープオブジェクトの作成に r.text を使用しています。

まず、必要なPythonモジュールをインポートする必要があります-

import requests
from bs4 import BeautifulSoup

この次のコード行では、リクエストを使用して、GETリクエストを作成することにより、URL [[3]] HTTPリクエストを作成します。

r = requests.get('https://authoraditiagarwal.com/')

今、私たちは次のようにスープオブジェクトを作成する必要があります-

soup = BeautifulSoup(r.text, 'lxml')
print (soup.title)
print (soup.title.text)

出力

対応する出力は次のようになります-

<title>Learn and Grow with Aditi Agarwal</title>
Learn and Grow with Aditi Agarwal

Lxml

Webスクレイピングについて説明するもう1つのPythonライブラリはlxmlです。 これは、高性能のHTMLおよびXML解析ライブラリです。 比較的高速で簡単です。 詳細については、https://lxml.de/[[[4]]]をご覧ください。

lxmlのインストール

pipコマンドを使用して、仮想環境またはグローバルインストールのいずれかに lxml をインストールできます。

(base) D:\ProgramData>pip install lxml
Collecting lxml
   Downloading
https://files.pythonhosted.org/packages/b9/55/bcc78c70e8ba30f51b5495eb0e
3e949aa06e4a2de55b3de53dc9fa9653fa/lxml-4.2.5-cp36-cp36m-win_amd64.whl
(3.
6MB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 3.6MB 64kB/s
Installing collected packages: lxml
Successfully installed lxml-4.2.5

例:lxmlとリクエストを使用したデータ抽出

次の例では、lxmlとリクエストを使用して、 authoraditiagarwal.com からWebページの特定の要素をスクレイピングしています-

まず、次のようにlxmlライブラリからリクエストとhtmlをインポートする必要があります-

import requests
from lxml import html

次に、スクラップするWebページのURLを指定する必要があります

url = 'https://authoraditiagarwal.com/leadershipmanagement/'

今、私たちはそのウェブページの特定の要素にパス*(Xpath)*を提供する必要があります-

path = '//*[@id="panel-836-0-0-1"]/div/div/p[1]'
response = requests.get(url)
byte_string = response.content
source_code = html.fromstring(byte_string)
tree = source_code.xpath(path)
print(tree[0].text_content())

出力

対応する出力は次のようになります-

The Sprint Burndown or the Iteration Burndown chart is a powerful tool to communicate
daily progress to the stakeholders. It tracks the completion of work for a given sprint
or an iteration. The horizontal axis represents the days within a Sprint. The vertical
axis represents the hours remaining to complete the committed work.

Python Webスクレイピング-データ処理

以前の章では、さまざまなPythonモジュールによるWebページまたはWebスクレイピングからのデータの抽出について学びました。 この章では、スクレイピングされたデータを処理するためのさまざまな手法を見てみましょう。

前書き

スクレイピングされたデータを処理するには、ローカルマシンにスプレッドシート(​​CSV)、JSONなどの特定の形式でデータを保存するか、MySQLなどのデータベースに保存する必要があります。

CSVおよびJSONデータ処理

最初に、Webページから取得した情報をCSVファイルまたはスプレッドシートに書き込みます。 先に行ったように、まず BeautifulSoup モジュールを使用して情報を取得する簡単な例を使用して理解し、次にPython CSVモジュールを使用してそのテキスト情報をCSVファイルに書き込みます。

まず、次のように必要なPythonライブラリをインポートする必要があります-

import requests
from bs4 import BeautifulSoup
import csv

次のコード行では、リクエストを使用して、GETリクエストを作成することにより、URL [[5]] HTTPリクエストを作成します。

r = requests.get('https://authoraditiagarwal.com/')

今、私たちは次のようにスープオブジェクトを作成する必要があります-

soup = BeautifulSoup(r.text, 'lxml')

次のコード行を使用して、取得したデータをdataprocessing.csvという名前のCSVファイルに書き込みます。

f = csv.writer(open(' dataprocessing.csv ','w'))
f.writerow(['Title'])
f.writerow([soup.title.text])

このスクリプトの実行後、テキスト情報またはWebページのタイトルは、ローカルマシンの上記のCSVファイルに保存されます。

同様に、収集した情報をJSONファイルに保存できます。 以下は、前回のPythonスクリプトで行ったのと同じ情報を取得するのと同じことを行うためのPythonスクリプトを理解するのは簡単ですが、今回は取得した情報はJSON Pythonモジュールを使用してJSONfile.txtに保存されます。

import requests
from bs4 import BeautifulSoup
import csv
import json
r = requests.get('https://authoraditiagarwal.com/')
soup = BeautifulSoup(r.text, 'lxml')
y = json.dumps(soup.title.text)
with open('JSONFile.txt', 'wt') as outfile:
   json.dump(y, outfile)

このスクリプトを実行した後、取得した情報、つまり Webページのタイトルは、ローカルマシンの上記のテキストファイルに保存されます。

AWS S3を使用したデータ処理

アーカイブ目的でローカルストレージにスクレイピングされたデータを保存したい場合があります。 しかし、このデータを大規模に保存および分析する必要がある場合はどうでしょうか? 答えは、Amazon S3またはAWS S3(Simple Storage Service)という名前のクラウドストレージサービスです。 基本的にAWS S3は、どこからでもあらゆる量のデータを保存および取得するために構築されたオブジェクトストレージです。

AWS S3にデータを保存するには、次の手順に従います-

  • ステップ1 *-最初に、データの保存中にPythonスクリプトで使用するための秘密キーを提供するAWSアカウントが必要です。 データを保存できるS3バケットが作成されます。

ステップ2 *-次に、S3バケットにアクセスするために *boto3 Pythonライブラリをインストールする必要があります。 それは、次のコマンドの助けを借りてインストールすることができます-

pip install boto3
  • ステップ3 *-次に、次のPythonスクリプトを使用して、Webページからデータを取得し、AWS S3バケットに保存します。

最初に、スクレイピングのためにPythonライブラリをインポートする必要があります。ここでは、 requests および boto3 を使用してデータをS3バケットに保存します。

import requests
import boto3

これで、URLからデータを取得できます。

data = requests.get("Enter the URL").text

S3バケットにデータを保存するために、次のようにS3クライアントを作成する必要があります-

s3 = boto3.client('s3')
bucket_name = "our-content"

次のコード行は、次のようにS3バケットを作成します-

s3.create_bucket(Bucket = bucket_name, ACL = 'public-read')
s3.put_object(Bucket = bucket_name, Key = '', Body = data, ACL = "public-read")

これで、AWSアカウントからour-contentという名前のバケットを確認できます。

MySQLを使用したデータ処理

MySQLを使用してデータを処理する方法を学びましょう。 MySQLについて学びたい場合は、リンクlink//mysql/index [[[6]]]をたどることができます。

次の手順の助けを借りて、データをスクレイプしてMySQLテーブルに処理できます-

  • ステップ1 *-まず、MySQLを使用して、スクレイピングされたデータを保存するデータベースとテーブルを作成する必要があります。 たとえば、次のクエリでテーブルを作成しています-
CREATE TABLE Scrap_pages (id BIGINT(7) NOT NULL AUTO_INCREMENT,
title VARCHAR(200), content VARCHAR(10000),PRIMARY KEY(id));
  • ステップ2 *-次に、Unicodeを扱う必要があります。 MySQLはデフォルトでUnicodeを処理しないことに注意してください。 データベース、テーブル、および両方の列のデフォルトの文字セットを変更する次のコマンドを使用して、この機能をオンにする必要があります-
ALTER DATABASE scrap CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE Scrap_pages CONVERT TO CHARACTER SET utf8mb4 COLLATE
utf8mb4_unicode_ci;
ALTER TABLE Scrap_pages CHANGE title title VARCHAR(200) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE pages CHANGE content content VARCHAR(10000) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
  • ステップ3 *-次に、MySQLとPythonを統合します。 これには、次のコマンドを使用してインストールできるPyMySQLが必要です。
pip install PyMySQL
  • ステップ4 *-これで、先ほど作成したScrapという名前のデータベースは、WebからScrap_pagesという名前のテーブルにデータを保存した後、データを保存する準備ができました。 この例では、ウィキペディアからデータをスクレイピングし、データベースに保存します。

まず、必要なPythonモジュールをインポートする必要があります。

from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import pymysql
import re

ここで、接続を確立します。つまり、これをPythonと統合します。

conn = pymysql.connect(host='127.0.0.1',user='root', passwd = None, db = 'mysql',
charset = 'utf8')
cur = conn.cursor()
cur.execute("USE scrap")
random.seed(datetime.datetime.now())
def store(title, content):
   cur.execute('INSERT INTO scrap_pages (title, content) VALUES ''("%s","%s")', (title, content))
   cur.connection.commit()

次に、ウィキペディアに接続して、そこからデータを取得します。

def getLinks(articleUrl):
   html = urlopen('http://en.wikipedia.org'+articleUrl)
   bs = BeautifulSoup(html, 'html.parser')
   title = bs.find('h1').get_text()
   content = bs.find('div', {'id':'mw-content-text'}).find('p').get_text()
   store(title, content)
   return bs.find('div', {'id':'bodyContent'}).findAll('a',href=re.compile('^(/wiki/)((?!:).)*$'))
links = getLinks('/wiki/Kevin_Bacon')
try:
   while len(links) > 0:
      newArticle = links[random.randint(0, len(links)-1)].attrs['href']
      print(newArticle)
      links = getLinks(newArticle)

最後に、カーソルと接続の両方を閉じる必要があります。

finally:
   cur.close()
   conn.close()

これにより、Wikipediaから収集したデータがscrap_pagesという名前のテーブルに保存されます。 MySQLとWebスクレイピングに精通している場合、上記のコードを理解するのは難しくありません。

PostgreSQLを使用したデータ処理

世界中のボランティアチームによって開発されたPostgreSQLは、オープンソースのリレーショナルデータベース管理システム(RDMS)です。 PostgreSQLを使用してスクレイピングされたデータを処理するプロセスは、MySQLのプロセスと似ています。 2つの変更点があります。1つ目はコマンドがMySQLと異なり、2つ目は psycopg2 Pythonライブラリを使用してPythonとの統合を実行します。

PostgreSQLに慣れていない場合は、リンク:/postgresql/index [[[7]]]で学習できます。次のコマンドを使用すると、psycopg2 Pythonライブラリをインストールできます-

pip install psycopg2

画像とビデオの処理

Webスクレイピングには、通常、Webメディアコンテンツのダウンロード、保存、処理が含まれます。 この章では、Webからダウンロードしたコンテンツを処理する方法を理解しましょう。

前書き

スクレイピング中に取得するWebメディアコンテンツは、データファイルだけでなく、非Webページの形式の画像、音声、ビデオファイルでもかまいません。 しかし、ダウンロードしたデータを信頼して、特にコンピューターのメモリにダウンロードして保存するデータの拡張子を信頼できますか? これにより、ローカルに保存するデータの種類を知ることが不可欠になります。

Webページからメディアコンテンツを取得する

このセクションでは、Webサーバーからの情報に基づいてメディアタイプを正しく表すメディアコンテンツをダウンロードする方法を学習します。 前の章で行ったように、Python requests モジュールの助けを借りてそれを行うことができます。

まず、次のように必要なPythonモジュールをインポートする必要があります-

import requests

次に、ダウンロードしてローカルに保存するメディアコンテンツのURLを指定します。

url = "https://authoraditiagarwal.com/wpcontent/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg"

次のコードを使用して、HTTP応答オブジェクトを作成します。

r = requests.get(url)

次のコード行を使用して、受信したコンテンツを.pngファイルとして保存できます。

with open("ThinkBig.png",'wb') as f:
   f.write(r.content)

上記のPythonスクリプトを実行した後、ThinkBig.pngという名前のファイルを取得します。このファイルには、ダウンロードしたイメージが含まれます。

URLからファイル名を抽出する

Webサイトからコンテンツをダウンロードした後、URLで見つかったファイル名を持つファイルに保存することもできます。 しかし、追加のフラグメントの数がURLにも存在するかどうかも確認できます。 そのためには、URLから実際のファイル名を見つける必要があります。

*urlparse* を使用して、次のPythonスクリプトの助けを借りて、URLからファイル名を抽出できます-
import urllib3
import os
url = "https://authoraditiagarwal.com/wpcontent/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg"
a = urlparse(url)
a.path

次のように出力を確認できます-

'/wp-content/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg'
os.path.basename(a.path)

次のように出力を確認できます-

'MetaSlider_ThinkBig-1080x180.jpg'

上記のスクリプトを実行すると、URLからファイル名が取得されます。

URLからのコンテンツのタイプに関する情報

GET要求によってWebサーバーからコンテンツを抽出している間、Webサーバーから提供された情報を確認することもできます。 次のPythonスクリプトの助けを借りて、コンテンツのタイプでWebサーバーの意味を判断できます-

まず、次のように必要なPythonモジュールをインポートする必要があります-

import requests

次に、ダウンロードしてローカルに保存するメディアコンテンツのURLを指定する必要があります。

url = "https://authoraditiagarwal.com/wpcontent/uploads/2018/05/MetaSlider_ThinkBig-1080x180.jpg"

次のコード行は、HTTP応答オブジェクトを作成します。

r = requests.get(url, allow_redirects=True)

これで、Webサーバーが提供できるコンテンツに関する情報を取得できます。

for headers in r.headers: print(headers)

次のように出力を確認できます-

Date
Server
Upgrade
Connection
Last-Modified
Accept-Ranges
Content-Length
Keep-Alive
Content-Type

コードの次の行の助けを借りて、コンテンツタイプに関する特定の情報、たとえばコンテンツタイプを取得できます-

print (r.headers.get('content-type'))

次のように出力を確認できます-

image/jpeg

次のコード行の助けを借りて、コンテンツタイプに関する特定の情報、たとえばETypeを取得できます-

print (r.headers.get('ETag'))

次のように出力を確認できます-

None

次のコマンドを観察します-

print (r.headers.get('content-length'))

次のように出力を確認できます-

12636

次のコード行の助けを借りて、コンテンツタイプに関する特定の情報を取得できます。

print (r.headers.get('Server'))

次のように出力を確認できます-

Apache

画像のサムネイルを生成する

サムネイルは非常に小さな説明または表現です。 ユーザーは、大きな画像のサムネイルのみを保存する場合と、画像とサムネイルの両方を保存する場合があります。 このセクションでは、前のセクション「Webページからメディアコンテンツを取得する」でダウンロードした ThinkBig.png という名前の画像のサムネイルを作成します。

このPythonスクリプトでは、Pillowという名前のPythonライブラリをインストールする必要があります。Pillowは、画像を操作するための便利な機能を備えたPython Imageライブラリのフォークです。 次のコマンドの助けを借りてインストールすることができます-

pip install pillow

次のPythonスクリプトは、画像のサムネイルを作成し、サムネイルファイルの先頭に Th_ を付けて現在のディレクトリに保存します。

import glob
from PIL import Image
for infile in glob.glob("ThinkBig.png"):
   img = Image.open(infile)
   img.thumbnail((128, 128), Image.ANTIALIAS)
   if infile[0:2] != "Th_":
      img.save("Th_" + infile, "png")

上記のコードは非常に理解しやすく、現在のディレクトリでサムネイルファイルを確認できます。

ウェブサイトからのスクリーンショット

Webスクレイピングで非常に一般的なタスクは、Webサイトのスクリーンショットを撮ることです。 これを実装するために、セレンとwebdriverを使用します。 次のPythonスクリプトは、Webサイトからスクリーンショットを取得し、現在のディレクトリに保存します。

From selenium import webdriver
path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
browser = webdriver.Chrome(executable_path = path)
browser.get('https://finddevguides.com/')
screenshot = browser.save_screenshot('screenshot.png')
browser.quit

次のように出力を確認できます-

DevTools listening on ws://127.0.0.1:1456/devtools/browser/488ed704-9f1b-44f0-
a571-892dc4c90eb7
<bound method WebDriver.quit of <selenium.webdriver.chrome.webdriver.WebDriver
(session="37e8e440e2f7807ef41ca7aa20ce7c97")>>

スクリプトを実行した後、 screenshot.png ファイルの現在のディレクトリを確認できます。

スクリーンショット

ビデオのサムネイル生成

Webサイトからビデオをダウンロードし、サムネイルに基づいて特定のビデオをクリックできるように、サムネイルを生成したいとします。 ビデオのサムネイルを生成するには、 www.ffmpeg.org からダウンロードできる ffmpeg というシンプルなツールが必要です。 ダウンロード後、OSの仕様に従ってインストールする必要があります。

次のPythonスクリプトは、ビデオのサムネイルを生成し、ローカルディレクトリに保存します-

import subprocess
video_MP4_file = “C:\Users\gaurav\desktop\solar.mp4
thumbnail_image_file = 'thumbnail_solar_video.jpg'
subprocess.call(['ffmpeg', '-i', video_MP4_file, '-ss', '00:00:20.000', '-
   vframes', '1', thumbnail_image_file, "-y"])

上記のスクリプトを実行した後、ローカルディレクトリに保存された thumbnail_solar_video.jpg という名前のサムネイルを取得します。

MP4ビデオをMP3にリッピングする

Webサイトからビデオファイルをダウンロードしたが、目的に応じてそのファイルからの音声のみが必要な場合、次の支援でインストールできる moviepy というPythonライブラリの助けを借りてPythonでそれを行うことができますコマンド-

pip install moviepy

さて、次のスクリプトを使用してmoviepyを正常にインストールした後、MP4をMP3に変換できます。

import moviepy.editor as mp
clip = mp.VideoFileClip(r"C:\Users\gaurav\Desktop\1234.mp4")
clip.audio.write_audiofile("movie_audio.mp3")

次のように出力を確認できます-

[MoviePy] Writing audio in movie_audio.mp3
100%|¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 674/674 [00:01<00:00,
476.30it/s]
[MoviePy] Done.

上記のスクリプトは、ローカルディレクトリにオーディオMP3ファイルを保存します。

Python Webスクレイピング-テキストの処理

前の章では、Webスクレイピングコンテンツの一部として取得したビデオや画像の処理方法を見てきました。 この章では、Pythonライブラリを使用してテキスト分析を扱い、これについて詳しく学習します。

前書き

Natural Language Tool Kit(NLTK)と呼ばれるPythonライブラリを使用して、テキスト分析を実行できます。 NLTKの概念に進む前に、テキスト分析とWebスクレイピングの関係を理解し​​ましょう。

テキスト内の単語を分析すると、どの単語が重要で、どの単語が異常で、どのようにグループ化されているかを知ることができます。 この分析により、Webスクレイピングのタスクが容易になります。

NLTKを使い始める

自然言語ツールキット(NLTK)は、特に英語などの自然言語のテキストで見つかった品詞を識別してタグ付けするために設計されたPythonライブラリのコレクションです。

NLTKのインストール

次のコマンドを使用して、PythonにNLTKをインストールできます-

pip install nltk

あなたがAnacondaを使用している場合、NLTKのcondaパッケージは、次のコマンドを使用して構築することができます-

conda install -c anaconda nltk

NLTKのデータをダウンロードする

NLTKをインストールした後、プリセットテキストリポジトリをダウンロードする必要があります。 しかし、テキストプリセットリポジトリをダウンロードする前に、次のように import コマンドの助けを借りてNLTKをインポートする必要があります-

mport nltk

今、次のコマンドの助けを借りてNLTKデータをダウンロードすることができます-

nltk.download()

NLTKの利用可能なすべてのパッケージのインストールには時間がかかりますが、すべてのパッケージをインストールすることを常にお勧めします。

その他の必要なパッケージのインストール

また、NLTKを使用して自然言語処理アプリケーションを構築するだけでなく、テキスト分析を行うために、 gensimpattern などの他のPythonパッケージも必要です。

*gensim* -多くのアプリケーションに役立つ堅牢なセマンティックモデリングライブラリ。 次のコマンドでインストールできます-
pip install gensim
*pattern* - *gensim* パッケージを適切に動作させるために使用します。 次のコマンドでインストールできます-
pip install pattern

トークン化

特定のテキストをトークンと呼ばれる小さな単位に分割するプロセスは、トークン化と呼ばれます。 これらのトークンは、単語、数字、または句読点にすることができます。 *単語のセグメンテーション*とも呼ばれます。

トークン化

NLTKモジュールは、トークン化のためのさまざまなパッケージを提供します。 要件に応じてこれらのパッケージを使用できます。 パッケージのいくつかはここで説明されています-

  • sent_tokenizeパッケージ*-このパッケージは、入力テキストを文に分割します。 次のコマンドを使用して、このパッケージをインポートできます-
from nltk.tokenize import sent_tokenize
  • word_tokenizeパッケージ*-このパッケージは、入力テキストを単語に分割します。 次のコマンドを使用して、このパッケージをインポートできます-
from nltk.tokenize import word_tokenize
  • WordPunctTokenizerパッケージ*-このパッケージは、入力テキストと句読点を単語に分割します。 次のコマンドを使用して、このパッケージをインポートできます-
from nltk.tokenize import WordPuncttokenizer

ステミング

どの言語にも、さまざまな形式の単語があります。 言語には、文法的な理由による多くのバリエーションが含まれます。 たとえば、民主主義民主、および*民主化*という言葉を考えてみましょう。 機械学習やWebスクレイピングプロジェクトでは、これらの異なる単語が同じ基本形式を持っていることを機械が理解することが重要です。 したがって、テキストの分析中に単語の基本形を抽出することが有用であると言えます。

これは、語尾を切り落とすことにより、語の基本形を抽出するヒューリスティックなプロセスとして定義されるステミングによって実現できます。

NLTKモジュールは、ステミング用のさまざまなパッケージを提供します。 要件に応じてこれらのパッケージを使用できます。 これらのパッケージの一部はここで説明されています-

  • PorterStemmerパッケージ*-このPythonステミングパッケージは、ポーターのアルゴリズムを使用して基本フォームを抽出します。 次のコマンドを使用して、このパッケージをインポートできます-
from nltk.stem.porter import PorterStemmer

たとえば、このステマーへの入力として「書き込み」という単語を指定すると、出力はステミング後の「書き込み」という単語になります。

  • LancasterStemmerパッケージ*-このPythonステミングパッケージは、ランカスターのアルゴリズムを使用して基本フォームを抽出します。 次のコマンドを使用して、このパッケージをインポートできます-
from nltk.stem.lancaster import LancasterStemmer

たとえば、このステマーへの入力として「書き込み」という単語を指定すると、出力はステミング後の「書き込み」という単語になります。

  • SnowballStemmerパッケージ*-このPythonステミングパッケージは、Snowballのアルゴリズムを使用して基本フォームを抽出します。 次のコマンドを使用して、このパッケージをインポートできます-
from nltk.stem.snowball import SnowballStemmer

たとえば、このステマーへの入力として「書き込み」という単語を指定すると、出力はステミング後の「書き込み」という単語になります。

補題

単語の基本形を抽出する他の方法は、通常語彙と形態素解析を使用して、語尾変化を除去することを目的とした、見出し語化によるものです。 補題化後の単語の基本形は、補題と呼ばれます。

NLTKモジュールは、次のlemmatizationパッケージを提供します-

  • WordNetLemmatizerパッケージ*-動詞として名詞として使用されているかどうかに応じて、単語の基本形を抽出します。 次のコマンドを使用して、このパッケージをインポートできます-
from nltk.stem import WordNetLemmatizer

チャンキング

データを小さなチャンクに分割することを意味するチャンクは、自然言語処理で、音声の一部や名詞句などの短い句を識別するための重要なプロセスの1つです。 チャンキングとは、トークンのラベル付けを行うことです。 チャンクプロセスを使用して、文の構造を取得できます。

この例では、NLTK Pythonモジュールを使用して名詞句のチャンクを実装します。 NPチャンキングは、文の中の名詞句チャンクを見つけるチャンキングのカテゴリです。

名詞句チャンキングを実装する手順

名詞句のチャンキングを実装するには、以下に示す手順に従う必要があります-

ステップ1-チャンク文法の定義

最初のステップでは、チャンクの文法を定義します。 それは私たちが従う必要のある規則から成ります。

ステップ2-チャンクパーサーの作成

次に、チャンクパーサーを作成します。 文法を解析し、出力を提供します。

ステップ3-出力

この最後のステップでは、出力はツリー形式で生成されます。

まず、次のようにNLTKパッケージをインポートする必要があります-

import nltk

次に、文を定義する必要があります。 ここで、DT:決定要因、VBP:動詞、JJ:形容詞、IN:前置詞、NN:名詞。

sentence = [("a", "DT"),("clever","JJ"),("fox","NN"),("was","VBP"),("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]

次に、正規表現の形式で文法を提供します。

grammar = "NP:{<DT>?<JJ>*<NN>}"

これで、次のコード行は、文法を解析するためのパーサーを定義します。

parser_chunking = nltk.RegexpParser(grammar)

これで、パーサーは文を解析します。

parser_chunking.parse(sentence)

次に、変数に出力を与えます。

Output = parser_chunking.parse(sentence)

次のコードの助けを借りて、以下のように出力をツリーの形で描くことができます。

output.draw()

フレーズチャンク

Bag of Word(BoW)モデルテキストの数値形式への抽出と変換

自然言語処理の有用なモデルであるBag of Word(BoW)は、基本的にテキストから特徴を抽出するために使用されます。 テキストから特徴を抽出した後、生データはMLアプリケーションで使用できないため、機械学習アルゴリズムのモデリングで使用できます。

BoWモデルの動作

最初に、モデルはドキュメント内のすべての単語から語彙を抽出します。 後で、ドキュメント用語マトリックスを使用して、モデルを構築します。 このように、BoWモデルはドキュメントを単語の袋としてのみ表し、順序または構造は破棄されます。

次の2つの文があると仮定します-

*Sentence1* -これは、Bag of Wordsモデルの例です。
*Sentence2* -Bag of Wordsモデルを使用して特徴を抽出できます。

今、これらの2つの文を検討することにより、次の14の異なる単語があります-

  • This
  • is
  • an
  • bag
  • of
  • ことば
  • モデル
  • we
  • can
  • エキス
  • 特徴
  • by
  • 使う

NLTKでBag of Wordsモデルを作成する

NLTKでBoWモデルを構築する次のPythonスクリプトを見てみましょう。

まず、次のパッケージをインポートします-

from sklearn.feature_extraction.text import CountVectorizer

次に、文のセットを定義します-

Sentences=['This is an example of Bag of Words model.', ' We can extract
   features by using Bag of Words model.']
   vector_count = CountVectorizer()
   features_text = vector_count.fit_transform(Sentences).todense()
   print(vector_count.vocabulary_)

出力

上記の2つの文に14の異なる単語があることを示しています-

{
   'this': 10, 'is': 7, 'an': 0, 'example': 4, 'of': 9,
   'bag': 1, 'words': 13, 'model': 8, 'we': 12, 'can': 3,
   'extract': 5, 'features': 6, 'by': 2, 'using':11
}

トピックモデリング:テキストデータのパターンの識別

一般に、ドキュメントはトピックにグループ化され、トピックモデリングは、特定のトピックに対応するテキスト内のパターンを識別する手法です。 つまり、トピックモデリングを使用して、特定のドキュメントセットの抽象的なテーマまたは隠された構造を明らかにします。

次のシナリオでトピックモデリングを使用できます-

テキスト分類

トピックモデリングは、各単語を個別に機能として使用するのではなく、類似の単語をグループ化するため、分類を改善できます。

レコメンダーシステム

類似性の尺度を使用して、推奨システムを構築できます。

トピックモデリングアルゴリズム

私たちは、次のアルゴリズムを使用してトピックモデリングを実装することができます-

  • Latent Dirichlet Allocation(LDA)*-トピックモデリングの実装に確率的グラフィカルモデルを使用する最も一般的なアルゴリズムの1つです。

潜在的意味解析(LDA)または潜在的意味インデキシング(LSI)-線形代数に基づいており、ドキュメント用語マトリックスでSVD(特異値分解)の概念を使用します。

  • Non-Negative Matrix Factorization(NMF)*-LDAと同様に線形代数にも基づいています。

上記のアルゴリズムには、次の要素があります-

  • トピック数:パラメータ
  • 文書-単語マトリックス:入力
  • WTM(Wordトピックマトリックス)&TDM(トピックドキュメントマトリックス):出力

Python Webスクレイピング-動的Webサイト

この章では、動的なWebサイトでWebスクレイピングを実行する方法と、詳細に関連する概念について学習します。

前書き

Webスクレイピングは複雑なタスクであり、Webサイトが動的な場合は複雑さが増します。 国連のWebアクセシビリティのグローバル監査によると、Webサイトの70%以上が本質的に動的であり、機能をJavaScriptに依存しています。

動的なWebサイトの例

動的なWebサイトの例を見て、なぜスクレイピングが難しいのかを知りましょう。 ここでは、http://example.webscraping.com/places/default/search [[[8]] 上記のWebページからデータをスクレイプしようとする次のPythonスクリプトの出力から判断できます-

import re
import urllib.request
response = urllib.request.urlopen('http://example.webscraping.com/places/default/search')
html = response.read()
text = html.decode()
re.findall('(.*?)

'、テキスト)

出力

[ ]

上記の出力は、スクレイパーの例では、検索しようとしている<div>要素が空であるため、情報の抽出に失敗したことを示しています。

動的なWebサイトからデータをスクレイピングするためのアプローチ

データがJavaScriptで動的にロードされるため、スクレイパーが動的なWebサイトから情報をスクレイピングできないことがわかりました。 そのような場合、動的なJavaScript依存Webサイトからデータをスクレイピングするために、次の2つの手法を使用できます-

  • JavaScriptのリバースエンジニアリング
  • JavaScriptのレンダリング

JavaScriptのリバースエンジニアリング

リバースエンジニアリングと呼ばれるプロセスは有用であり、Webページによってデータが動的にロードされる方法を理解できます。

これを行うには、指定されたURLの inspect element タブをクリックする必要があります。 次に、 NETWORK タブをクリックして、*。ajax *のパスを持つsearch.jsonを含む、そのWebページに対して行われたすべてのリクエストを検索します。 ブラウザやネットワークタブからAJAXデータにアクセスする代わりに、次のPythonスクリプトの助けを借りてそれを行うことができます-

import requests
url=requests.get('http://example.webscraping.com/ajax/search.json?page=0&page_size=10&search_term=a')
url.json()

上記のスクリプトにより、Python jsonメソッドを使用してJSONレスポンスにアクセスできます。 同様に、生の文字列応答をダウンロードし、pythonのjson.loadsメソッドを使用して、それもロードできます。 これは、次のPythonスクリプトの助けを借りて行っています。 基本的に、アルファベット「a」の文字を検索し、JSON応答の結果ページを反復処理することで、すべての国をスクレイピングします。

import requests
import string
PAGE_SIZE = 15
url = 'http://example.webscraping.com/ajax/' + 'search.json?page={}&page_size={}&search_term=a'
countries = set()
for letter in string.ascii_lowercase:
   print('Searching with %s' % letter)
   page = 0
   while True:
   response = requests.get(url.format(page, PAGE_SIZE, letter))
   data = response.json()
   print('adding %d records from the page %d' %(len(data.get('records')),page))
   for record in data.get('records'):countries.add(record['country'])
   page += 1
   if page >= data['num_pages']:
      break
   with open('countries.txt', 'w') as countries_file:
   countries_file.write('n'.join(sorted(countries)))

上記のスクリプトを実行した後、次の出力が得られ、レコードはcountrys.txtという名前のファイルに保存されます。

出力

Searching with a
adding 15 records from the page 0
adding 15 records from the page 1
...

JavaScriptのレンダリング

前のセクションでは、WebページでAPIがどのように機能し、それを使用して単一のリクエストで結果を取得する方法をリバースエンジニアリングしました。 ただし、リバースエンジニアリングを行いながら、次のような困難に直面する可能性があります-

  • ウェブサイトは非常に難しい場合があります。 たとえば、ウェブサイトがGoogle Web Toolkit(GWT)などの高度なブラウザツールで作成されている場合、結果のJSコードは機械生成され、理解およびリバースエンジニアリングが困難になります。
  • React.js のような一部の高レベルのフレームワークは、すでに複雑なJavaScriptロジックを抽象化することにより、リバースエンジニアリングを困難にします。

上記の問題の解決策は、HTMLを解析し、CSSフォーマットを適用し、JavaScriptを実行してWebページを表示するブラウザレンダリングエンジンを使用することです。

この例では、Java Scriptをレンダリングするために、使い慣れたPythonモジュールSeleniumを使用します。 次のPythonコードは、Seleniumを使用してWebページをレンダリングします-

まず、次のようにセレンからウェブドライバーをインポートする必要があります-

from selenium import webdriver

次に、要件に従ってダウンロードしたWebドライバーのパスを指定します-

path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path = path)

次に、Pythonスクリプトで制御されるWebブラウザーで開きたいURLを指定します。

driver.get('http://example.webscraping.com/search')

これで、選択する要素を設定するために検索ツールボックスのIDを使用できます。

driver.find_element_by_id('search_term').send_keys('.')

次に、次のように選択ボックスの内容を設定するためにJavaスクリプトを使用することができます-

js = "document.getElementById('page_size').options[1].text = '100';"
driver.execute_script(js)

次のコード行は、Webページで検索をクリックする準備ができていることを示しています-

driver.find_element_by_id('search').click()

次のコード行は、AJAXリクエストが完了するまで45秒間待機することを示しています。

driver.implicitly_wait(45)

今、国のリンクを選択するには、次のようにCSSセレクターを使用することができます-

links = driver.find_elements_by_css_selector('#results a')

これで、国のリストを作成するために各リンクのテキストを抽出できます-

countries = [link.text for link in links]
print(countries)
driver.close()

Python Web Scraping-フォームベースのウェブサイト

前の章では、動的なWebサイトのスクレイピングについて説明しました。 この章では、ユーザーベースの入力、つまりフォームベースのWebサイトで機能するWebサイトのスクレイピングを理解しましょう。

前書き

最近、WWW(World Wide Web)は、ユーザーが作成したコンテンツだけでなく、ソーシャルメディアに向かっています。 それでは、ログイン画面を超えるような情報にどのようにアクセスできるのかという疑問が生じます。 このために、フォームとログインを処理する必要があります。

前の章ではHTTP GETメソッドを使用して情報を要求しましたが、この章では、情報をWebサーバーにプッシュして保存および分析するHTTP POSTメソッドを使用します。

ログインフォームとの対話

インターネットでの作業中は、ログインフォームを何度も操作する必要があります。 非常に少数のHTMLフィールド、送信ボタン、アクションページのみを含むように非常に単純な場合もあれば、電子メールのような複雑な追加フィールドがあり、セキュリティ上の理由からcaptchaとともにメッセージを残す場合もあります。

このセクションでは、Pythonリクエストライブラリの助けを借りて、簡単な送信フォームを扱います。

まず、次のようにリクエストライブラリをインポートする必要があります-

import requests

次に、ログインフォームのフィールドに情報を提供する必要があります。

parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}

次のコード行では、フォームのアクションが発生するURLを提供する必要があります。

r = requests.post(“enter the URL”, data = parameters)
print(r.text)

スクリプトを実行すると、アクションが発生したページのコンテンツが返されます。

フォームで画像を送信する場合、requests.post()を使用すると非常に簡単になります。 あなたは次のPythonスクリプトの助けを借りてそれを理解することができます-

import requests
file = {‘Uploadfile’: open(’C:\Usres\desktop\123.png’,‘rb’)}
r = requests.post(“enter the URL”, files = file)
print(r.text)

WebサーバーからのCookieのロード

Cookieは、Web CookieまたはインターネットCookieと呼ばれることもありますが、Webサイトから送信される小さなデータであり、コンピューターはWebブラウザー内のファイルに保存します。

ログインフォームの処理のコンテキストでは、Cookieには2つのタイプがあります。 1つは前のセクションで扱ったもので、Webサイトに情報を送信できます。2つ目は、Webサイトにアクセスしている間ずっと永続的な「ログイン」状態を維持できるようにします。 2番目の種類のフォームでは、WebサイトはCookieを使用して、ログインしているユーザーとログインしていないユーザーを追跡します。

クッキーは何をしますか?

最近では、ほとんどのWebサイトが追跡にCookieを使用しています。 私たちは次の手順の助けを借りてクッキーの動作を理解することができます-

  • ステップ1 *-最初に、サイトはログイン資格情報を認証し、ブラウザのCookieに保存します。 このCookieには通常、サーバーが生成したトークン、タイムアウト、追跡情報が含まれています。
  • ステップ2 *-次に、Webサイトは認証の証明としてCookieを使用します。 この認証は、Webサイトにアクセスするたびに常に表示されます。

Cookieは、Webスクレイパーにとって非常に問題があります。WebスクレイパーがCookieを追跡しないと、送信されたフォームが送り返され、次のページでログインしていないように見えるためです。 以下に示すように、Python requests ライブラリを使用してCookieを追跡するのは非常に簡単です-

import requests
parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}
r = requests.post(“enter the URL”, data = parameters)

上記のコード行では、URLはログインフォームのプロセッサとして機能するページになります。

print(‘The cookie is:’)
print(r.cookies.get_dict())
print(r.text)

上記のスクリプトを実行した後、最後のリクエストの結果からクッキーを取得します。

Cookieには別の問題があり、Webサイトが警告なしにCookieを頻繁に変更することがあります。 このような状況は、次のように* requests.Session()*に対処することができます-

import requests
session = requests.Session()
parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}
r = session.post(“enter the URL”, data = parameters)

上記のコード行では、URLはログインフォームのプロセッサとして機能するページになります。

print(‘The cookie is:’)
print(r.cookies.get_dict())
print(r.text)

セッションありスクリプトとセッションなしスクリプトの違いを簡単に理解できることに注意してください。

Pythonでフォームを自動化する

このセクションでは、Mechanizeという名前のPythonモジュールを扱います。これにより、作業が削減され、フォームを埋めるプロセスが自動化されます。

機構モジュール

Mechanizeモジュールは、フォームとやり取りするための高レベルのインターフェイスを提供します。 使用を開始する前に、次のコマンドでインストールする必要があります-

pip install mechanize

Python 2.xでのみ機能することに注意してください。

この例では、電子メールとパスワードという2つのフィールドを持つログインフォームに入力するプロセスを自動化します-

import mechanize
brwsr = mechanize.Browser()
brwsr.open(Enter the URL of login)
brwsr.select_form(nr = 0)
brwsr['email'] = ‘Enter email’
brwsr['password'] = ‘Enter password’
response = brwsr.submit()
brwsr.submit()

上記のコードは非常に理解しやすいです。 最初に、mechanizeモジュールをインポートしました。 次に、Mechanizeブラウザオブジェクトが作成されました。 次に、ログインURLに移動し、フォームを選択しました。 その後、名前と値がブラウザオブジェクトに直接渡されます。

Python Webスクレイピング-CAPTCHAの処理

この章では、人間またはロボットのユーザーをテストするために使用されるCAPTCHAをWebスクレイピングおよび処理する方法を理解しましょう。

CAPTCHAとは何ですか?

CAPTCHAの完全な形式は、Computers and Humans Apartに伝えるための*完全に自動化されたパブリックチューリングテスト*です。これは、ユーザーが人間かどうかを判断するテストであることを明確に示唆しています。

CAPTCHAは歪んだ画像であり、通常はコンピュータープログラムで検出するのは簡単ではありませんが、人間はなんとかして理解することができます。 ほとんどのWebサイトはCAPTCHAを使用して、ボットの相互作用を防ぎます。

PythonでのCAPTCHAの読み込み

Webサイトで登録を行い、CAPTCHAにフォームがあるとします。CAPTCHAイメージを読み込む前に、フォームに必要な特定の情報を知る必要があります。 次のPythonスクリプトの助けを借りて、http://example.webscrapping.com [[[9]]]という名前のWebサイトの登録フォームのフォーム要件を理解できます。

import lxmll
import urllib.request as urllib2
import pprint
import http.cookiejar as cookielib
def form_parsing(html):
   tree = lxmll.fromstring(html)
   data = {}
   for e in tree.cssselect('form input'):
      if e.get('name'):
         data[e.get('name')] = e.get('value')
   return data
REGISTER_URL = '<a target="_blank" rel="nofollow"
   href="http://example.webscraping.com/user/register">http://example.webscraping.com/user/register'</a>
ckj = cookielib.CookieJar()
browser = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckj))
html = browser.open(
   '<a target="_blank" rel="nofollow"
      href="http://example.webscraping.com/places/default/user/register?_next">
      http://example.webscraping.com/places/default/user/register?_next</a> =/places/default/index'
).read()
form = form_parsing(html)
pprint.pprint(form)

上記のPythonスクリプトでは、最初にlxml pythonモジュールを使用してフォームを解析する関数を定義し、次にフォーム要件を次のように出力します-

{
   '_formkey': '5e306d73-5774-4146-a94e-3541f22c95ab',
   '_formname': 'register',
   '_next': '/places/default/index',
   'email': '',
   'first_name': '',
   'last_name': '',
   'password': '',
   'password_two': '',
   'recaptcha_response_field': None
}

上記の出力から、 recpatcha_response_field を除くすべての情報が理解可能で簡単であることを確認できます。 ここで、この複雑な情報をどのように処理し、CAPTCHAをダウンロードできるかという疑問が生じます。 これは、次のようにPillow Pythonライブラリを使用して実行できます。

Pillow Pythonパッケージ

Pillowは、画像を操作するための便利な機能を備えたPython Imageライブラリのフォークです。 次のコマンドの助けを借りてインストールすることができます-

pip install pillow

次の例では、CAPTCHAをロードするためにそれを使用します-

from io import BytesIO
import lxmll
from PIL import Image
def load_captcha(html):
   tree = lxmll.fromstring(html)
   img_data = tree.cssselect('div#recaptcha img')[0].get('src')
   img_data = img_data.partition(',')[-1]
   binary_img_data = img_data.decode('base64')
   file_like = BytesIO(binary_img_data)
   img = Image.open(file_like)
   return img

上記のpythonスクリプトは、 pillow pythonパッケージを使用し、CAPTCHAイメージをロードするための関数を定義しています。 登録フォームに関する情報を取得するために、前のスクリプトで定義されている* form_parser()*という名前の関数と共に使用する必要があります。 このスクリプトは、CAPTCHAイメージを有用な形式で保存し、さらに文字列として抽出できます。

OCR:Pythonを使用して画像からテキストを抽出する

CAPTCHAを有用な形式で読み込んだ後、画像からテキストを抽出するプロセスである光学式文字認識(OCR)を使用して、CAPTCHAを抽出できます。 この目的のために、オープンソースのTesseract OCRエンジンを使用します。 次のコマンドの助けを借りてインストールすることができます-

pip install pytesseract

ここで、次のようにPillow Python Packageを使用してCAPTCHAをロードした上記のPythonスクリプトを拡張します-

import pytesseract
img = get_captcha(html)
img.save('captcha_original.png')
gray = img.convert('L')
gray.save('captcha_gray.png')
bw = gray.point(lambda x: 0 if x < 1 else 255, '1')
bw.save('captcha_thresholded.png')

上記のPythonスクリプトは、白黒モードでCAPTCHAを読み取ります。これは、次のようにtesseractに簡単に渡すことができます-

pytesseract.image_to_string(bw)

上記のスクリプトを実行した後、出力として登録フォームのCAPTCHAを取得します。

Python Webスクレイピング-スクレーパーを使用したテスト

この章では、PythonでWebスクレーパーを使用してテストを実行する方法について説明します。

前書き

大規模なWebプロジェクトでは、Webサイトのバックエンドの自動テストが定期的に実行されますが、フロントエンドのテストは頻繁にスキップされます。 この背後にある主な理由は、ウェブサイトのプログラミングは、さまざまなマークアップ言語とプログラミング言語のネットのようなものだからです。 ある言語の単体テストを書くことはできますが、相互作用が別の言語で行われている場合は困難になります。 そのため、期待どおりにコードが実行されていることを確認するための一連のテストが必要です。

Pythonを使用したテスト

テストについて話すとき、それは単体テストを意味します。 Pythonでのテストに深く入る前に、ユニットテストについて知る必要があります。 以下は、単体テストの特徴の一部です-

  • コンポーネントの機能の少なくとも1つの側面は、各ユニットテストでテストされます。
  • 各ユニットテストは独立しており、独立して実行することもできます。
  • 単体テストは、他のテストの成功または失敗を妨げません。
  • 単体テストは任意の順序で実行でき、少なくとも1つのアサーションが含まれている必要があります。

Unittest-Pythonモジュール

ユニットテスト用のUnittestという名前のPythonモジュールは、すべての標準Pythonインストールに付属しています。 私たちはちょうどそれをインポートする必要があり、残りは以下を行うunittest.TestCaseクラスのタスクです-

  • SetUpおよびtearDown関数は、unittest.TestCaseクラスによって提供されます。 これらの関数は、各ユニットテストの前後に実行できます。
  • また、テストの成功または失敗を許可するアサートステートメントも提供します。
  • 単体テストとしてtest_で始まるすべての関数を実行します。

この例では、Webスクレイピングと unittest を組み合わせます。 ウィキペディアのページをテストして、文字列「Python」を検索します。 基本的に2つのテストを実行します。最初は、タイトルページが検索文字列と同じか、つまり「Python」かどうか、そして2番目のテストではページにコンテンツdivがあることを確認します。

最初に、必要なPythonモジュールをインポートします。 WebスクレイピングにはBeautifulSoupを使用し、テストにはもちろんunittestを使用しています。

from urllib.request import urlopen
from bs4 import BeautifulSoup
import unittest

ここで、unittest.TestCaseを拡張するクラスを定義する必要があります。 グローバルオブジェクトbsは、すべてのテスト間で共有されます。 unittestで指定された関数setUpClassはそれを達成します。 ここでは、タイトルページのテスト用とページコンテンツのテスト用の2つの関数を定義します。

class Test(unittest.TestCase):
   bs = None
   def setUpClass():
      url = '<a target="_blank" rel="nofollow" href="https://en.wikipedia.org/wiki/Python">https://en.wikipedia.org/wiki/Python'</a>
      Test.bs = BeautifulSoup(urlopen(url), 'html.parser')
   def test_titleText(self):
      pageTitle = Test.bs.find('h1').get_text()
      self.assertEqual('Python', pageTitle);
   def test_contentExists(self):
      content = Test.bs.find('div',{'id':'mw-content-text'})
      self.assertIsNotNone(content)
if __name__ == '__main__':
   unittest.main()

上記のスクリプトを実行した後、次の出力を取得します-

----------------------------------------------------------------------
Ran 2 tests in 2.773s

OK
An exception has occurred, use %tb to see the full traceback.

SystemExit: False

D:\ProgramData\lib\site-packages\IPython\core\interactiveshell.py:2870:
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

Seleniumを使用したテスト

テストにPython Seleniumを使用する方法について説明しましょう。 Seleniumテストとも呼ばれます。 Pythonの unittestSelenium には共通点はあまりありません。 Seleniumは、ブラウザのデザインが異なっていても、標準のPythonコマンドを異なるブラウザに送信することを知っています。 前の章ですでにSeleniumをインストールして使用したことを思い出してください。 ここでは、Seleniumでテストスクリプトを作成し、自動化に使用します。

次のPythonスクリプトの助けを借りて、Facebookログインページを自動化するためのテストスクリプトを作成しています。 選択した他のフォームとログインを自動化するために例を変更できますが、概念は同じです。

最初にウェブブラウザに接続するために、セレンモジュールからウェブドライバをインポートします-

from selenium import webdriver

次に、Seleniumモジュールからキーをインポートする必要があります。

from selenium.webdriver.common.keys import Keys

次に、Facebookアカウントにログインするためのユーザー名とパスワードを入力する必要があります

user = "[email protected]"
pwd = ""

次に、ChromeのWebドライバーへのパスを指定します。

path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path=path)
driver.get("http://www.facebook.com")

次に、assertキーワードを使用して条件を検証します。

assert "Facebook" in driver.title

次のコード行を使用して、値を電子メールセクションに送信します。 ここではIDで検索していますが、名前で* driver.find_element_by_name( "email")*として検索することで実行できます。

element = driver.find_element_by_id("email")
element.send_keys(user)

次のコード行を使用して、パスワードセクションに値を送信します。 ここではIDで検索していますが、名前で* driver.find_element_by_name( "pass")*として検索することで実行できます。

element = driver.find_element_by_id("pass")
element.send_keys(pwd)

電子メールとパスワードのフィールドに値を挿入した後、次のコード行を使用してEnter/Loginを押します。

element.send_keys(Keys.RETURN)

次に、ブラウザを閉じます。

driver.close()

上記のスクリプトを実行すると、Chrome Webブラウザーが開き、メールとパスワードが挿入され、ログインボタンをクリックしたことがわかります。

Facebookログイン

比較:unittestまたはSelenium

unittestとセレンの比較は困難です。なぜなら、大規模なテストスイートを使用する場合は、unitsの構文上の剛性が必要だからです。 一方、Webサイトの柔軟性をテストする場合は、Seleniumテストが最初の選択肢になります。 しかし、両方を組み合わせることができたらどうでしょう。 セレンをPython unittestにインポートして、両方の利点を活用できます。 Seleniumを使用してWebサイトに関する情報を取得し、unittestでその情報がテストに合格するかどうかを評価できます。

たとえば、次のように両方を組み合わせて、Facebookログインの自動化のために上記のPythonスクリプトを書き換えています-

import unittest
from selenium import webdriver

class InputFormsCheck(unittest.TestCase):
   def setUp(self):
      self.driver = webdriver.Chrome(r'C:\Users\gaurav\Desktop\chromedriver')
      def test_singleInputField(self):
      user = "[email protected]"
      pwd = ""
      pageUrl = "http://www.facebook.com"
      driver=self.driver
      driver.maximize_window()
      driver.get(pageUrl)
      assert "Facebook" in driver.title
      elem = driver.find_element_by_id("email")
      elem.send_keys(user)
      elem = driver.find_element_by_id("pass")
      elem.send_keys(pwd)
      elem.send_keys(Keys.RETURN)
   def tearDown(self):
      self.driver.close()
if __name__ == "__main__":
   unittest.main()