使用芹菜抓取网站



目前,我的结构是Flask, Redis, RabbitMQ and Celery.在我的抓取中,我正在使用requestsBeautifulSoup. 我的烧瓶在 apache 和 wsgi 上运行。这是在生产中。与app.run(threaded=True)

我有 25 个 API,其中 10 个用于抓取标头等 URL,其余的则是对该 URL 使用第三方 API。

我正在使用 chord 来处理我的 API 并使用requests从 API 获取数据。

对于我的和弦头,我有 3 个工人,而在我的回调中我只有 1 个。 我遇到了ConnectTimeoutErrorMaxRetryError的瓶颈问题。当我阅读一些线程时,它说要为每个进程执行超时,因为出现此错误意味着您正在使远程服务器过载。

问题是由于我使用的是和弦,因此使用时间睡眠是没有意义的,因为 25 个 API 调用将同时运行。有人遇到过这种情况吗?还是我做错了?

我读到的线程似乎在说将请求更改为 pycurl 或使用 Scrapy。但我不认为是这种情况,因为ConnectTimeoutError是关于我的主机重载特定的 URL 服务器。

我的和弦过程:

callback = create_document.s(url, company_logo, api_list)
header = [api_request.s(key) for key in api_list.keys()]
result = chord(header)(callback)

在api_request中使用任务请求。

如果要限制同时运行的抓取次数,可以创建一个排队任务,该任务检查是否正在运行另一个任务,该任务与要运行的任务共享相同的属性。 如果任务正在运行,您可以告诉它休眠几秒钟,然后再次检查。 当它看到一个未运行时,您可以将要运行的任务排队。 这将允许您在异步任务中处于睡眠状态。如果只有一定数量在运行,您甚至可以计算任务并运行更多。 有了这个,您可以一次运行 5 个,看看它是否足够节流,然后在看到一个完成时排队另一个等。

::编辑::

芹菜检查的文档

相关内容

  • 没有找到相关文章

最新更新