ナード戦隊データマン

データサイエンスを用いて悪と戦うぞ

Scrapy Cloudのデータをmongodbへ自動的に格納

Scrapy Cloudとは、scrapyやportiaをscrapinghubのクラウド上で実行・監視するサービスです。スクレイピングをやっていると、スクレイピングのプロフェッショナル集団が作り上げたシステム"scrapinghub"が如何に便利で優れているか思い知らされます。

今回は、Scrapy CloudのジョブをScrapy Cloud APIを使って監視し、終了したジョブのアイテムを自動的にmongodbへ格納するモジュールを作成します。

手順

  1. ジョブリストを取得。
  2. ジョブリストの中でDBに格納していない&実行完了しているIDを取得。
  3. 取得したID名でコレクションを作成。
  4. 取得したIDのスクレイピング済みアイテムをjsonで取得。
  5. jsonデータを作成したコレクションにbulk insertする。

※ これらの手順をモジュール化・スクリプト化し、cronから実行できるようにすると自動化できる。

 コード

import logging
import pymongo
import requests

log = logging.getLogger("jobwatcher")


def watch_job(token, project):
    headers = {'Accept': 'application/json'}
    url_template = "https://{}:@app.scrapinghub.com/api/jobs/list.json?project={}"
    r = requests.get(url_template.format(token, project), headers=headers)
    return eval(r.content)


def download_data(token, job_id):
    headers = {'Accept': 'application/json'}
    r = requests.get("https://{}:@storage.scrapinghub.com/items/{}".format(token, job_id), headers=headers)
    return eval(r.content)


def insert_scrapinghub(token, db, project):
    col_names = db.collection_names()
    inserted_ids = []
    for job in watch_job(token, project)['jobs']:
        if job['id'] in col_names or job['state'] != "finished":
            continue
        else:
            try:
                db.create_collection(job['id'])
                col = db[job['id']]
                data = download_data(token, job['id'])
                col.insert_many(data)
                inserted_ids.append(job['id'])
            except Exception as e:
                log.exception("insert_scrapinghub: fail")
                log.exception(e)
        log.info("{} inserted.".format(job['id']))
    return inserted_ids


if __name__ == "__main__":
    import sys
    token = "YOUR SCRAPINGHUB TOKEN"
    client = pymongo.MongoClient("mongodb://localhost:27017/")
    db = client["scrapinghub"]
    project_id = sys.argv[1]
    insert_scrapinghub(token, db, project_id)

参考

[0] https://doc.scrapinghub.com/scrapy-cloud.html