这很奇怪,有一段时间我以为我犯了一个非常愚蠢的错误,引发了这个错误。但是在网上查找后,我发现其他一些用户也遇到了类似的问题。
import puppeteer from 'puppeteer'
import cheerio from 'cheerio'
(async () => {
const browser = await puppeteer.launch({
waitUntil: 'load',
ignoreHTTPSErrors: true,
args: ['--disable-setuid-sandbox', '--no-sandbox'],
headless: true
})
const page = await browser.newPage()
await page.setJavaScriptEnabled(false)
await page.goto(`https://sc.olx.com.br/florianopolis-e-regiao/autos-e-pecas/carros-vans-e-utilitarios`)
const html = await page.evaluate(() => document.querySelector('#vehicle_brand_vb').innerHTML)
await browser.close()
const $ = cheerio.load(html)
const options = $('option')
console.log( Object.values(options)
.map( option => option.attribs )
.filter( val => val && val.title && val.value ))
})()
上面的代码正常工作,它基本上读取select
组件的选项并将其打印为json数组。
import puppeteer from 'puppeteer'
import cheerio from 'cheerio'
(async () => {
const browser = await puppeteer.launch({
waitUntil: 'load',
ignoreHTTPSErrors: true,
args: ['--disable-setuid-sandbox', '--no-sandbox'],
headless: true
})
const selector = '#vehicle_brand_vb'
const page = await browser.newPage()
await page.setJavaScriptEnabled(false)
await page.goto(`https://sc.olx.com.br/florianopolis-e-regiao/autos-e-pecas/carros-vans-e-utilitarios`)
const html = await page.evaluate(() => document.querySelector(selector).innerHTML)
await browser.close()
const $ = cheerio.load(html)
const options = $('option')
console.log( Object.values(options)
.map( option => option.attribs )
.filter( val => val && val.title && val.value ))
})()
在上述修改后的版本中,querySelector
被提取到局部变量selector
,但是如果我尝试运行它,则会得到:
(node:3569) UnhandledPromiseRejectionWarning: Error: Evaluation failed: ReferenceError: selector is not defined
at __puppeteer_evaluation_script__:2:39
at ExecutionContext.evaluateHandle (/Volumes/safezone/oriumtech/node_modules/puppeteer/lib/ExecutionContext.js:106:13)
在google上搜索后,最接近我发现的地方是this issue,其中用户遇到babel + puppeteer的问题(我不知道这与它有什么关系,因为代码会被罚款,只会在运行时引发错误。
如果有人有想法,请告诉我。