プログラミング | オジサンテクノロジー

Pythonによるスクレイピング

掲載日:2019/04/28

概要

Pythonで任意のWebサイトからデータを取得するスクレイピングの方法を紹介します。
今回は、すべての基本となる、ファイルのダウンロード方法について紹介します。

1. ファイルのダウンロード

初めに、全ての基本となるファイルをダウンロードする方法を紹介します。
巷の入門書などでは、「wgetを使えば良い。」という紹介を見かけたりしますが、 wgetをデフォルトで使えるのは、Linuxの環境です。
ここでは、windowsの環境でも使えるurllib及びrequestsを用いた方法を紹介します。

1-1. urllibのurlretrieve()関数を用いた方法

urlretrieve()関数を用いると、ファイルのダウンロードを行うことができます。
オジサンテクノロジーのRPAのページにおいてある画像ファイルをダウンロードするソースの例を以下に示します。
import urllib.request
import os

sUrl = "https://www.simple-reading.com/img/trans-patent.png"
sDirname = "download/"
sFilename = "save-trans-patent.png"

os.mkdir(sDirname)
urllib.request.urlretrieve(sUrl, sDirname + sFilename)
このソースを実行することで、downloadというディレクトリを新たに作成し、 その中に画像ファイルがダウンロードされて保存されます。

1-2. urllibのurlopen()関数を用いた方法

urlopen()関数を用いると、実行環境上のメモリにデータをダウンロードできます。
オジサンテクノロジーのRPAのページにおいてある画像ファイルをダウンロードするソースの例を以下に示します。
import urllib.request
import os

sUrl = "https://www.simple-reading.com/img/trans-patent.png"
sDirname = "download/"
sFilename = "save-trans-patent.png"

bDowndata = urllib.request.urlopen(sUrl).read()

os.mkdir(sDirname)
with open(sDirname + sFilename, 'wb') as file:
    file.write(bDowndata)
urlretrieve()を用いた場合と同様に、 このソースを実行することで、downloadというディレクトリを新たに作成し、 その中に画像ファイルがダウンロードされて保存されます。

ファイルの保存に手間がかかりますが、 例えばSQLiteなどのデータベースに画像を保存する場合などはurlopen()を使うと便利です。

それ以外に。。。というよりこちらがメインですが、 HTMLをダウンロードして情報をスクレイピングする場合には、ファイルを保存するだけではダメなので、 urlopen()を使用します。

1-3.requestsのget()関数を用いた方法

requestsのget()関数を用いると、より直観的にデータをダウンロードできます。
get()を使う場合、urlopen()と同じく、メモリ上にダウンロードされるため、 ファイルの保存にはもうひと手間必要になりますが、HTMLをダウンロードするスクレイピングには適しています。
特に、getやpostといった、HTTP命令を直観的に使えるため、非常に使いやすいです。

オジサンテクノロジーのRPAのページにおいてある画像ファイルをダウンロードするソースの例を以下に示します。
import requests
import os

sUrl = "https://www.simple-reading.com/img/trans-patent.png"
sDirname = "download/"
sFilename = "save-trans-patent.png"

bDowndata = requests.get(sUrl)

os.mkdir(sDirname)
with open(sDirname + sFilename, 'wb') as file:
    file.write(bDowndata.content)
urlopen()を用いた場合とほぼ同じですが、requestsをimportし、requestsを使用してデータを取得しています。
urllib.requestとrequestsは名前が非常に似ているため、混同しやすいですが別のパッケージです。
特に、requestsは標準では含まれていないため、使用する場合は下記のコマンドをコマンドプロンプトに打ち込み、 パッケージをインストールする必要があります。
pip install requests
好みが色々とあると思いますが、とりあえず動かしたいだけの場合は、urllibを使用しておけば良いと思います。

2. まとめ

今回述べてきたクローリングとスクレイピングについて一度整理します。
クローリングとスクレイピング。混同しても大した問題はありませんが、処理は独立して行った方が良いです。

・クローリング:サイトのデータを取得する作業
特定のサイトの内部。もしくは、複数のサイトのurlに次々とアクセスし、HTMLをダウンロードしていきます。
アクセスするurlは、あらかじめリストにしてある場合だけでなく、 アクセスしたurlからリンクをたどる形でも行わられます。

・スクレイピング:クローリングしたデータから、自分が欲しい情報を抜き出す作業
クローリングを行うことで、簡単に大量のデータは入手することができます。
しかし、ただ大量にあるデータはインターネット上に存在したままのデータとなんら変わりがありません。
欲しい情報、必要な情報を抜き出し、表やグラフにまとめることで、 初めて、情報処理が完了したと言えます。
データをまとめるための処理としては、cssセレクタによるデータの抽出や機械学習によるデータ処理などがあります。