【发布时间】:2023-04-01 17:38:02
【问题描述】:
我正在尝试从动态加载的页面中删除数据。为此,我正在使用无头浏览器 puppeteer
Puppeteer 可以看作代码中的headlessBrowserClient。
主要挑战是在收到所需数据后立即优雅地关闭浏览器。但是,如果您在 evaluateCustomCode 执行完成之前关闭它 - evaluateCustomCode 进度将会丢失。
evaluateCustomCode 是一个可以像在 Chrome 开发工具中运行一样调用的函数。
为了控制 puppeteer API 的网络请求和异步流程 - 我使用了封装了上述所有逻辑的异步生成器。
问题是我觉得代码有异味,但我找不到更好的解决方案。
想法?
module.exports = function buildClient (headlessBrowserClient) {
const getPageContent = async (pageUrl, evaluateCustomCode) => {
const request = sendRequest(pageUrl)
const { value: page } = await request.next()
if (page) {
const pageContent = await page.evaluate(evaluateCustomCode)
request.next()
return pageContent
}
}
async function * sendRequest (url) {
const browser = await headlessBrowserClient.launch()
const page = await browser.newPage()
const state = {
req: { url },
}
try {
await page.goto(url)
yield page
} catch (error) {
throw new APIError(error, state)
} finally {
yield browser.close()
}
}
return {
getPageContent,
}
}
【问题讨论】:
标签: javascript node.js web-scraping puppeteer headless-browser