【发布时间】:2019-09-25 11:17:27
【问题描述】:
我正在使用Puppeteer 来抓取网页。我想解析页面中的 URL 等等。我知道我可以将功能移出page.evaluate,但这不是主要问题。问题是如何将任意脚本注入页面,以便可以在page.evaluate 中使用脚本中的变量/函数。
就我而言,我使用的是lil-uri。我基本上有这个:
var puppeteer = require('puppeteer')
var URL = require('lil-uri')
puppeteer.launch().then(browser => {
browser.newPage().then(page => {
page.goto('https://foo.com').catch(onerror).then(() => {
page.evaluate(fetchLinks).catch(onerror)
})
})
// })
})
function onerror(err) {
console.log('ERRR', err)
}
function fetchLinks() {
var linkEls = document.querySelectorAll('a')
var links = []
for (var i = 0, n = linkEls.length; i < n; i++) {
var el = linkEls[i]
// PARSE URL
var url = parseUrl(el.getAttribute('href'))
links.push(url)
}
return links
function parseUrl(href) {
// REF THE URL LIBRARY
var url = URL(href)
var url2 = url.path()
var query = []
var q = url.query()
if (Object.keys(q).length) {
// query.push(...)
}
if (query.length) {
url2 += '?' + query.join('&')
}
return url2
}
}
这不起作用,因为 require('lil-uri') 在 Node.js 脚本的范围内,而它实际上是在 page.evaluate 的上下文中使用的。
问题是,如何在页面中正确包含parseUrl和URL函数,以便在page.evaluate的上下文中使用它们。
此外,如您所见,我将parseUrl 函数放在 fetchLinks 函数中,这并不理想,因为我无法在页面上评估的其他函数之间重用它。我希望能够在page.evaluate 的上下文中做类似window.parseUrl = parseUrl 的事情,但我也不知道该怎么做。想知道是否可以展示如何做这两件事:
- 如何将本地外部脚本加载到 puppeteer 页面中。
- 如何将函数加载到 puppeteer 页面的窗口中。
【问题讨论】:
标签: javascript node.js web-crawler puppeteer