Beautiful Soup 4を使ってPythonで基本的なヘッドレスウェブスクレイピング「ボット」を書く 

この記事では、CentOS 7を使用したAlibaba Cloud Elastic Compute Service (ECS)上で、Beautiful Soup 4を使用してPythonで基本的なヘッドレスウェブスクレイピング "ボット "を作っていきます。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/headless-web-scraping-in-python-with-beautiful-soup-4_593881)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#アリババクラウドにCentOSインスタンスを設定する
[このチュートリアル](https://www.alibabacloud.com/blog/3-ways-to-set-up-a-linux-server-on-alibaba-cloud_572384?spm=a2c65.11461447.0.0.45066ff9tJ0LR6)では、CentOSを実行しているAlibaba Cloudインスタンスの起動に慣れている必要があります。ECSインスタンスの設定方法がわからない場合は、このチュートリアルをチェックしてください。すでに購入している場合は、[このチュートリアル](https://www.alibabacloud.com/blog/how-to-set-up-your-first-centos-7-server-on-alibaba-cloud_593743?spm=a2c65.11461447.0.0.45066ff90S594T)をチェックして、それに応じてサーバーを設定してください。

私はこのレッスンのためにCentOSのインスタンスをデプロイしました。このプロジェクトのためには、肥大化していない方が良いでしょう。このプロジェクトではGUI(Graphical User Interface)を使用しないので、基本的なターミナルのコマンドラインの知識があることをお勧めします。

#ターミナルのコマンドラインからPython 3、PIP3、Nanoをインストール
特定のインスタンスのすべてをアップデートするのは、常に良いアイデアです。まず、すべてのパッケージを最新のバージョンにアップデートしましょう。

```
sudo yum update
```

基本的なウェブスクレイピング "bot "にPythonを使う予定です。私はこの言語の比較的シンプルさやモジュールの多様性にも感心しています。特に、RequestsとBeautiful Soup 4モジュールを使用します。

通常はPython3がデフォルトでインストールされていますが、そうでない場合はPython3とPipをインストールします。まずはIUS（Inline with Upstream Stableの略）をインストールします。IUS はコミュニティプロジェクトで、Red Hat パッケージマネージャ (RPM) パッケージを提供しています。続いて、python36uとpipをインストールしていきます。

```
sudo yum install https://centos7.iuscommunity.org/ius-release.rpm
sudo yum install python36u
sudo yum install python36u-pip
```

Pipは、Pythonパッケージインデックスにあるようなソフトウェアパッケージをインストールして管理するためのパッケージ管理システムです。Pip は easy_install の代替です。

過去にpython36u-pipではなくpipのインストールで頭を悩ませたことがあるので、pipのインストールはPython2.7用、python36u-pipはPython3用であることに注意してください。

Nanoは基本的なテキストエディタで、このようなアプリケーションでは重宝します。それではNanoをインストールしてみましょう。

```
sudo yum install nano
```

#Pipを使ってPythonパッケージをインストールする
次に、今日使用するPythonパッケージであるRequestsとBeautiful Soup4をインストールする必要があります。

これらは PIP を通してインストールします。

```
pip36u install requests
pip36u install beautifulsoup4
```

Requests は、Requests .get メソッドを使ってウェブページに移動できるようにする Python モジュールです。

Requests を使うと、Python スクリプトを使ってプログラム的に HTTP/1.1 リクエストを送信することができます。URL にクエリ文字列を手動で追加したり、POST データをフォームエンコードしたりする必要はありません。Keep-alive と HTTP 接続プーリングは 100% 自動で行われます。今日はRequests .getメソッドを中心にWebページのソースを取得していきます。

Beautiful Soupは、HTMLやXMLファイルからデータを取り出すためのPythonライブラリです。お気に入りのパーサーと連携して、ナビゲート、検索、解析ツリーの変更などを簡単に行うことができます。

Beautiful Soup 4 を Python の標準の html.parer と一緒に使用して、Requests で取得する Web ページ ソースからのデータを解析して整理します。このチュートリアルでは、私たちはより人間の読みやすい方法で私たちのデータを整理するために美しいスープ「prettify」メソッドを使用します。

Python_apps というフォルダを作成します。そして、現在の作業ディレクトリをPython_appsに変更します。

```
mkdir Python_apps
cd Python_apps
```

#Pythonでヘッドレススクレイピングボットを書く
さて、いよいよお楽しみです。Pythonヘッドレススクレーパーボットを書くことができます。我々は、URLに移動し、ページのソースを取得するために要求を使用しています。その後、Beautiful Soup 4を使用して、HTMLソースを解析して半可読形式にします。これを行った後、解析したデータをインスタンス上のローカルファイルに保存します。それでは、作業に取り掛かりましょう。

ページソースを取得するために Requests を使用し、データを可読状態にフォーマットするために BeautifulSoup4 を使用します。そして、open() と write() の Python メソッドを使用して、ページデータをローカルのハードドライブに保存します。さあ、行ってみましょう。

Nano またはお好みのテキストエディタをターミナルで開き、"bot.py "という名前の新しいファイルを作成します。私は Nano が基本的なテキスト編集機能に完全に適していると感じています。

まず、インポートを追加します。

```
############################################################ IMPORTS
import requests
from bs4 import BeautifulSoup
```

以下のコードでは、いくつかのグローバル変数を定義しています。

1、ユーザーの URL 入力
2、入力されたURLを取得するRequests.getメソッド
3、テキストデータを変数に保存するRequests.textメソッド

```
####### REQUESTS TO GET PAGE : BS4 TO PARSE DATA
#GLOBAL VARS
####### URL FOR SITE TO SCRAPE
url = input("WHAT URL WOULD YOU LIKE TO SCRAPE? ")
####### REQUEST GET METHOD for URL
r = requests.get("http://" + url)
####### DATA FROM REQUESTS.GET
data = r.text
```

さて、グローバル変数 "data" を BS4 オブジェクトに変換して、BS4 の prettify メソッドでフォーマットしてみましょう。

```
####### MAKE DATA VAR BS4 OBJECT
source = BeautifulSoup(data, "html.parser")
####### USE BS4 PRETTIFY METHOD ON SOURCE VAR NEW VAR PRETTY_SOURCE
pretty_source = source.prettify()
```

これらの変数をローカルファイルと同様にターミナルで出力してみましょう。これは、実際にローカルファイルに書き込む前に、どのようなデータがローカルファイルに書き込まれるかを示してくれます。

```
print(source)
```

最初に大きなテキストの塊でソースを取得します。これは人間が解読するのは非常に難しいので、フォーマットの手助けをBeautiful Soupに頼ることにします。そこで、Prettifyメソッドを呼び出して、データをより良く整理してみましょう。これで人間の読みやすさが格段に良くなります。そして、BS4のprettify()メソッドの後にソースを出力します。

```
print(pretty_source)
```

コードを実行した後、この時点で端末には、入力されたページのHTMLソースのプレティファイドされたフォーマットが表示されているはずです。

さて、そのファイルをAlibaba Cloud ECSインスタンス上のローカルハードドライブに保存してみましょう。そのためには、まず書き込みモードでファイルを開く必要があります。

これを行うために、open()メソッドの第2引数に文字列 "w "を渡す。

```
####### OPEN SOURCE IN WRITE MODE WITH "W" TO VAR LOCAL_FILE
####### MAKE A NEW FILE
local_file = open(url.strip("https://" + "http://") + "_scrapped.txt" , "w")
####### WRITE THE VAR PRETTY_SOUP TO FILE
local_file.write(pretty_source)
### GET RID OF ENCODING ISSUES ##########################################
#local_file.write(pretty_source.encode('utf-8'))
####### CLOSE FILE
local_file.close()
```

上記のコードブロックでは、先ほど入力したURLに"_scrapped.txt "を連結した名前のファイルを作成してオープンする変数を作成しています。openメソッドの第一引数はローカルディスク上のファイル名です。ファイル名から "HTTPS://"と "HTTP://"を取り除いています。これを取り除かないと、ファイル名は無効になります。第二引数は、この場合の書き込みの許可です。

そして、.writeメソッドに引数として "pretty_source "変数を渡して、変数 "local_file "に書き込みます。ローカルファイルに正しく印刷するために、テキストをUTF-8でエンコードする必要がある場合は、コメントアウトした行を使用します。そして、ローカルのテキストファイルを閉じます。

コードを実行してどうなるか見てみましょう。



```
python3.6  bot.py
```

スクラップするURLを入力するように言われます。[https://www.wikipedia.org](https://www.wikipedia.org./?spm=a2c65.11461447.0.0.45066ff9L05CqJ) を試してみましょう。これで、特定のウェブサイトからのきちんとフォーマットされたソースコードが.txtファイルとしてローカルの作業ディレクトリに保存されました。

このプロジェクトの最終的なコードは以下のようになります。

```
print("*" * 30 )
print("""
# 
# SCRIPT TO SCRAPE AND PARSE DATA FROM
# A USER INPUTTED URL. THEN SAVE THE PARSED
# DATA TO THE LOCAL HARD DRIVE.
""")
print("*" * 30 )

############################################################ IMPORTS
import requests
from bs4 import BeautifulSoup

####### REQUESTS TO GET PAGE : BS4 TO PARSE DATA
#GLOBAL VARS
####### URL FOR SITE TO SCRAPE
url = input("ENTER URL TO SCRAPE")

####### REQUEST GET METHOD for URL
r = requests.get(url)

####### DATA FROM REQUESTS.GET
data = r.text

####### MAKE DATA VAR BS4 OBJECT 
source = BeautifulSoup(data, "html.parser")


####### USE BS4 PRETTIFY METHOD ON SOURCE VAR NEW VAR PRETTY_SOURCE
pretty_source = source.prettify()

print(source)

print(pretty_source)

####### OPEN SOURCE IN WRITE MODE WITH "W" TO VAR LOCAL_FILE
####### MAKE A NEW FILE
local_file = open(url.strip("https://" + "http://") + "_scrapped.txt" , "w")
####### WRITE THE VAR PRETTY_SOUP TO FILE
local_file.write(pretty_source)
#local_file.write(pretty_source.decode('utf-8','ignore'))
#local_file.write(pretty_source.encode('utf-8')
####### CLOSE FILE
local_file.close()
```

#概要
CentOS 7を搭載したAlibaba Cloud Elastic Compute Service (ECS)インスタンス上に、Beautiful Soup 4を使ってPythonで基本的なヘッドレスWebスクレイピング「ボット」を構築する方法を学びました。Requestsを使って特定のウェブページのソースコードを取得し、Beautiful soup 4を使ってデータを解析し、最後にスクレイピングしたウェブページのソースコードをインスタンス上のローカルテキストファイルに保存しました。Beautiful soup 4モジュールを使って、人間が読みやすいようにテキストをフォーマットすることができます。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*