Pyppeteer AsyncHTMLSession 在 Ubuntu + Django + Celery 上异步运行时从不返回 Arender

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

我有一个抓取功能,它接受一个 URL 并使用 AsyncHTMLSession 从网站上抓取生成的内容——我正在访问的网站是大量的 JS,所以这是必要的。

我还在记录到数据库的函数中添加了异步调试行,因为这使得检查代码状态变得更加容易。

import pyppeteer
import requests
from celery import shared_task
from requests_html import AsyncHTMLSession

async def load_page_helper(url: str):   # THE ASYNC PAGE LOADER

    set_state_async.delay("load_page_helper 1")

    session = AsyncHTMLSession()

    set_state_async.delay("load_page_helper 2")

    browser = await pyppeteer.launch({
        'ignoreHTTPSErrors': True,
        'headless': True,
        'handleSIGINT': False,
        'handleSIGTERM': False,
        'handleSIGHUP': False
    })

    set_state_async.delay("load_page_helper 3")

    session._browser = browser

    resp = await session.get(url)

    set_state_async.delay("load_page_helper 4 - should time out by 100 seconds")

    await resp.html.arender(timeout=100)

    set_state_async.delay("load_page_helper 5")

    await session.close()

    set_state_async.delay("load_page_helper 6")

    return resp

@shared_task
def set_state_async(state):    # FUNCTION FOR ASYNC DB LOGGING
    db.set_state(state)

@shared_task
def scrape_data_async():    # AN EXAMPLE OF HOW THE FUNCTION IS CALLED ASYNC (1/2)
    base_link = "example.com"

scrape_data_async.delay()   # AN EXAMPLE OF HOW THE FUNCTION IS CALLED ASYNC (2/2)

我使用一个 URL 运行了这段代码 3 次,该 URL 可以使用来自我的 Ubuntu 服务器的 traceroute ping 通。 DB 的结果输出如下所示:

# TEST 1
2023-04-14 21:44:24.031933 - load_page_helper 1
2023-04-14 21:44:24.570362 - load_page_helper 3
2023-04-14 21:44:25.799122 - load_page_helper 4 - should time out by 100 seconds

# TEST 2
2023-04-14 21:46:37.121347 - load_page_helper 2
2023-04-14 21:46:37.838199 - load_page_helper 3
2023-04-14 21:46:39.214201 - load_page_helper 4 - should time out by 100 seconds

# TEST 3
2023-04-14 21:49:03.778309 - load_page_helper 2
2023-04-14 21:49:04.622361 - load_page_helper 3
2023-04-14 21:49:06.194292 - load_page_helper 4 - should time out by 100 seconds

如您所见,有时某些消息不会始终如一地打印出来,但它总是挂在同一个地方,

load_page_helper 4
在渲染调用旁边。


我所知道的:

  • Chromium 及其所有依赖项都已安装。
  • Celery 配置正确,否则数据库将无法登录。无论如何,其他芹菜任务在我的服务器上运行良好。
  • 据我所知,该网站可以从服务器访问,使用 traceroute 进行验证。
  • 该网站接受抓取 - 我正在尝试访问我在 Windows 上成功完成的 Ubuntu 上的同一个站点。
  • 浏览器成功启动 - 当同步运行时,
    2023-04-14 17:48:42,587 INFO pyppeteer.launcher Browser listening on: ws://127.0.0.1:34137/devtools/browser/80d7f76c-aee8-4b15-9fa7-42298ef7eb2c
    在请求崩溃之前输出到日志(见下文)。无论如何,它仍然需要超过 20 秒才能崩溃,这已经足够让之前的渲染工作了。

我也不认为我可以同步运行它,因为 CloudFlare 检测到超时并用 502 拍打请求,这似乎也停止了线程的执行。

我环顾四周,找不到解决为什么它没有运行的方法。 它在 Windows 上运行时同步运行,所以这让我相信它可能很难在异步调用中运行?

python django asynchronous python-requests-html pyppeteer
© www.soinside.com 2019 - 2024. All rights reserved.