website-builde / lib /playwright-crawler.ts
Daviddolor's picture
Single-process Chromium, fixed visual-polish prompt, Docker config for HF Space
ec675f2
Raw
History Blame Contribute Delete
2.18 kB
import { chromium } from "playwright";
export async function crawlWithBrowser(url: string) {
if (!url.startsWith("http")) {
url = "https://" + url;
}
console.log("Browser crawling:", url);
const browser = await chromium.launch({
executablePath:
"/usr/bin/chromium",
headless: true,
args: [
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-dev-shm-usage",
"--disable-gpu"
]
});
const page =
await browser.newPage({
viewport:{
width:1440,
height:900
}
});
await page.goto(url, {
waitUntil: "commit",
timeout: 60000
})
await page.waitForTimeout(3000)
const data =
await page.evaluate(()=>{
const styles =
[...document.styleSheets]
.map(sheet=>{
try{
return [...sheet.cssRules]
.map(r=>r.cssText)
.join("\n");
}catch{
return "";
}
})
.join("\n");
const getStyles =
[...document.querySelectorAll("*")]
.map(el=>{
const s =
getComputedStyle(el);
return {
color:s.color,
background:s.backgroundColor,
font:s.fontFamily,
radius:s.borderRadius,
margin:s.margin,
padding:s.padding
};
});
return {
title:
document.title,
html:
document.documentElement.outerHTML
.slice(0,10000),
images:
[...document.images]
.map(i=>({
src:i.src,
alt:i.alt
})),
links:
[...document.links]
.map(a=>a.href),
headings:
[...document.querySelectorAll(
"h1,h2,h3"
)]
.map(x=>x.textContent?.trim()),
buttons:
[...document.querySelectorAll(
"button,a"
)]
.map(x=>x.textContent?.trim())
.filter(Boolean),
css:styles,
computedStyles:getStyles,
text:
document.body.innerText
.replace(/\s+/g," ")
.slice(0,5000)
};
});
await browser.close();
return {
url,
...data
};
}