我有一个抓取功能,它接受一个 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
在渲染调用旁边。
我所知道的:
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 上运行时同步运行,所以这让我相信它可能很难在异步调用中运行?