异步抓取+Django

问题描述 投票:0回答:1

我正在尝试创建一个应用程序,通过异步抓取工具向用户显示信息。刮刀必须独立、连续工作。用户在访问网站所需页面时,必须自动订阅独立工作的抓取工具的流程。

例如:刮刀使用

while True
进行工作。它收集、处理和发送处理后的数据。用户已访问该站点,并且应该能够看到抓取工具在上次迭代期间提供的数据。当爬虫再次收集、处理并返回数据时,用户的数据应该自动更新,如此循环。

不幸的是,由于保密原因,我无法向您展示项目代码。

接下来我将描述我发现并尝试应用的方法。所有这些都在某种程度上与 Django Channels 以及多进程和线程相关。

以下哪种方法最正确?如何正确连接刮刀?也许我错过了一些其他方法,我不知道。

  1. 多处理、管道。建议创建一个单独的脚本进程(在我的例子中是异步抓取器)并使用 Pipe 将此数据传递给另一个脚本(在我的例子中是 Django View)。

  2. 网络套接字。创建 WS 流并连接到它。

  3. 上海证券交易所。在我看来,这个选项是最正确的,因为我不需要像网络套接字那样的双向连接。我只需要在更新服务器上的信息时更新客户端上的信息。在寻找实现 SSE 的方法时,我遇到了 daphne 模块。根据网站上的简短指南,我连接了模块并且它可以工作,但仅使用网站本身的示例。要点是创建一个单独的函数,其中一些数据在无限循环中生成并传输给用户。每个新用户都是服务器上的一个单独的线程。我无法在此周期中将我的抓取工具作为第三方模块启动。它会抛出错误RuntimeError: asyncio.run()无法从正在运行的事件循环中调用。这是带有指南的网站的链接。那里很简短。 https://www.photondesigner.com/articles/server-sent-events-daphne?ref-yt-server-sent-events-daphne

以下哪种方法最正确?如何正确连接解析器?也许我错过了一些其他方法,我不知道。

python django asynchronous django-channels
1个回答
0
投票

解决问题比我想象的要容易。

我们采用Redis数据库,单独运行scraper脚本并将数据写入数据库。在另一个脚本中,我们从数据库获取数据。

我不知道这有多“正确”,但目前就是这样。

最初,我尝试根据用户 Sagun Devkota 的建议使用通道和 celery 来实现此功能。

© www.soinside.com 2019 - 2024. All rights reserved.