RapGenius 发布了这篇文章,介绍了他们如何使用 Ruby 库 Typhoeus 通过并行化 Heroku 上的工作人员测功机上的抓取任务来检查指向它们的所有 170k url。
我一直在从事一个涉及抓取(获取源代码)150 万个 URL 的项目,并且我一直在努力加快速度。为了更适应 Python,我设法使用 redis 和 python 多处理创建了一个在我的桌面上并行运行的刮板。我感到困惑的是如何修改它以在 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中的workers执行这样的抓取任务:
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 查询都很慢(需要几分钟)。将结果存储在临时表中,然后合并两个表是否更好?
我不应该使用哪些技术?例如,我看到 Celery 和 Twisted 都被提及为适合此类事情的候选人。我对任何一个都不熟悉,但我已经将两者都视为外围谷歌搜索中的建议替代方案。