0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。

#アリババクラウドにCentOSインスタンスを設定する
このチュートリアルでは、CentOSを実行しているAlibaba Cloudインスタンスの起動に慣れている必要があります。ECSインスタンスの設定方法がわからない場合は、このチュートリアルをチェックしてください。すでに購入している場合は、このチュートリアルをチェックして、それに応じてサーバーを設定してください。

私はこのレッスンのために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 を試してみましょう。これで、特定のウェブサイトからのきちんとフォーマットされたソースコードが.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モジュールを使って、人間が読みやすいようにテキストをフォーマットすることができます。

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?