LoginSignup
5
1

More than 5 years have passed since last update.

Datalabで簡易webクローリングし、GoogleCloudStorage(GCS)にアップロードする方法

Last updated at Posted at 2018-10-10

はじめに

GCP Cloud Datalab(Python3)で、requestsライブラリを利用してcsvを特定サイトから取得し、取得したデータをGoogle Cloud Storage(GCS)に格納するコードを説明します。

こんなユーザが対象です。

  • ローカルでJupyterNotebookを使っていたが、クラウドでいつでもどこからでも利用したい
  • WEBのデータ(csv)を簡単に取得してGCSへアップロードしたい

環境

  • Cloud Datalab(Python3)

Cloud Datalabとは

「データの探索、分析、可視化と機械学習のための使いやすいインタラクティブなツール」で、実態はGCE上にあるJupyterNotebookです。ネットに繋がればいつでもどこからでもJupyterを利用可能なので大変便利です。

複数ユーザで共有したいNotebookがある場合は、--no-user-checkingオプションを入れて、connectすればOK。(詳細な起動方法は他サイトを参照)

Datalab起動方法(複数ユーザ同時接続)
datalab connect --no-user-checking <VM名>

Datalab上でのPythonコード詳細

まず、必要なライブラリ読み込みます。

import requests
import sys
import google.datalab.storage as storage

適宜、変数を定義します。

## バケットの定義、適宜変更
bucket_name = '<bucket name>' // バケット名
bucket_path = 'gs://' + bucket_name //バケットのPATH
bucket_dir = '<bucket directory>/' //GCSの保存先フォルダ名
access_url = 'https://<replace to site>/sample.csv' //ダウンロードしたいサイトのcsv
upload_filename = 'sample_upload.csv'

対象のURLからrequestsを利用して、ファイルを取得。response.contentにコンテンツが格納されます。typeはbytes。

## URLからダウンロードする  
def download(url):
  data = ""
  response = requests.get(url)
  #print(type(response.content))
  ## <class 'bytes'>

  if response.status_code == 200:
    data = response.content
    return data
  else:
    print('download error')
    exit()
    return data

GCSにアップロードする関数は以下です。main関数(後述)で、
bucketインスタンスを作成しておき、コンテンツタイプを指定(必須)して、
write_streamにてアップロードします。参考サイトによると、uploadと、write_streamの二つが、datalabのstorageモジュールで利用可能なアップロード関数ですが、テキストコンテンツの場合は、write_streamを利用するようです。

## GCSにアップロードする
def upload_gcs(bucket, uploadObject, data):
  upload_object = bucket.object(uploadObject)
  upload_object.write_stream(data,content_type='text/csv')

mainは、以下です。決め打ちでアップロード時のファイル名を、sample_upload.csvにしていますが、利用環境に合わせ適宜、変更してください。

if __name__ == "__main__":

  ## アクセスする先のURL
  url = access_url

  ## バケットインスタンスの作成
  bucket = storage.Bucket(bucket_name)

  ## URLにGETアクセスした結果のコンテンツを取得
  data = download(url)
  if data != "":
    ## 正常に取得できたら、指定したGCS(かつ、uploadフォルダ配下)へアップロード。ファイル名も指定。
    upload_gcs(bucket, bucket_dir + upload_filename, data)
    print('Success!')
  else:
    print('not Success!')

参考サイト

*https://googledatalab.github.io/pydatalab/google.datalab.storage.html
*この記事に触発されて記事を書きました。→エンジニアは全員技術記事を書くことを習慣化した方がいいぞ

おわりに

エラー処理などは、簡単に記載しましたが、基本的な部分はこれで分かると思います。
アクセスするURLを変更・繰り返しをすることで複数サイトクローリングも、もちろんできます。

Datalabは、インターネットアクセスさえあればいつでも、どのPC環境でも利用できますし、もっと活用していきたいと思います。実際には複数ファイルをWebクロール、スクレイピングしてBigQueryへ入れてみましたので、別記事でまとめようと思います。

5
1
3

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
5
1