Я использую 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
, что не идеально, потому что я не могу повторно использовать ее между другими функциями, которые я оцениваю на странице.Я хотел бы иметь возможность сделать что-то вроде window.parseUrl = parseUrl
в контексте page.evaluate
, но я тоже не был уверен, как это сделать.Хотите знать, можно ли показать, как сделать эти две вещи:
- Как загрузить локальный внешний скрипт на страницу кукловода.
- Как загрузить функции в окно страницы кукловода.