0
v-firecrawl/apps/playwright-service/main.py

46 lines
1.2 KiB
Python
Raw Normal View History

2024-04-25 13:31:28 -04:00
from fastapi import FastAPI
from playwright.async_api import async_playwright, Browser
2024-04-15 17:01:47 -04:00
from fastapi.responses import JSONResponse
from pydantic import BaseModel
2024-04-25 13:31:28 -04:00
2024-04-15 17:01:47 -04:00
app = FastAPI()
2024-04-15 17:01:47 -04:00
class UrlModel(BaseModel):
url: str
2024-05-09 21:00:58 -04:00
wait: int = None
2024-04-15 17:01:47 -04:00
2024-04-25 13:31:28 -04:00
browser: Browser = None
@app.on_event("startup")
async def startup_event():
global browser
playwright = await async_playwright().start()
browser = await playwright.chromium.launch()
2024-04-15 17:01:47 -04:00
2024-04-25 13:31:28 -04:00
@app.on_event("shutdown")
async def shutdown_event():
await browser.close()
2024-04-15 17:01:47 -04:00
2024-04-25 13:31:28 -04:00
@app.post("/html")
async def root(body: UrlModel):
context = await browser.new_context()
page = await context.new_page()
await page.goto(
body.url,
wait_until="load",
2024-05-22 13:45:43 -04:00
timeout=body.timeout if body.timeout else 15000,
)
2024-05-22 13:45:43 -04:00
# Wait != timeout. Wait is the time to wait after the page is loaded - useful in some cases were "load" / "networkidle" is not enough
if body.wait:
await page.wait_for_timeout(body.wait)
# await page.wait_for_selector("body", state="attached")
2024-04-25 13:31:28 -04:00
page_content = await page.content()
await context.close()
json_compatible_item_data = {"content": page_content}
return JSONResponse(content=json_compatible_item_data)