RapGeniusは、Ruby ライブラリ Typhoeus を使用して、Heroku 上のワーカー dyno 全体でスクレイピング タスクを並列化することにより、それらを指す 17 万個の URL すべてをチェックする方法について、この記事を投稿しました。
私は、150 万の URL のスクレイピング (ソースの取得) を含むプロジェクトに取り組んでおり、それを高速化しようとしています。Python に慣れてきたので、redis と python multiprocessing を使用して、デスクトップ全体で並列化するスクレーパーを作成することができました。私が混乱しているのは、Herokuで動作するように変更する方法です。
これが私のプログラムが今どのように設計されているかです:
1) 初期化スクリプトが実行され、事前にすべての URL が Redis キューに保存されます
2) 次のようなすべてのプロセスを開始するスクリプト run_workers.py が実行されます。
workers = []
q = get_redis_queue(name)
for i in xrange(num_workers):
p = multiprocessing.Process(target=worker.scraper_worker, args=(i, q))
p.start()
workers.append(p)
for w in workers:
w.join()
3) 次のようなスクレイピング タスクを実行する worker.py 内のワーカー:
def scraper_worker(worker_id, queue):
#consumes URL from redis queue, visits using python requests
#stores result into MySQL
現在のプログラム構造を Heroku に直接移植できますか? Procfile には何を入れますか? 私の最初の推測は
scrape: python init_scrape.py
init_scrape.py は最初にキューを初期化し、次にワーカーを実行します。しかし、実際にクラウド上で python タスクを配布した経験がないので、コストのかかるミスは避けたいと思っています。
これをローカルで実行すると、結果をデータベース (URL ごとに 150 万行あり、キャッシュを保存するための空きスペースがある) に直接保存すると、各 UPDATE クエリが遅くなることがわかりました (数分かかります)。結果を一時テーブルに保存し、後で 2 つのテーブルをマージする方がよいでしょうか?
私が使用していない、使用すべきテクノロジーは何ですか? たとえば、Celery と Twisted の両方がこの種の適切な候補として言及されているのを見てきました。私はどちらにも慣れていませんが、周辺のグーグルで両方を提案された代替案として見てきました。