web scraping数据抓取时出现ReferenceError: Terminal A未定义怎么解决
问题根因
你的报错由两个核心代码问题共同触发:
- 变量作用域错误:你用
const声明的terminalA/terminalB/terminalCD三个变量,仅在$('.terminal-left').each()的回调函数作用域内有效,作用域外部无法访问这些变量 - 异步执行逻辑错误:
request是异步网络请求,你把writeStream.write()写在请求回调的外部,代码执行时会先运行写入操作,此时网络请求还没有返回结果,变量完全没有被赋值
另外你还存在一个隐藏逻辑漏洞:三个终端的取值代码完全一致,都是取同一个.terminal-percentage节点的文本,最终三个变量的取值会完全重复,无法拿到三个航站楼的不同数据。
修复后的完整代码
const fs = require('fs'); const request = require('request'); const cheerio = require('cheerio'); // 提前初始化写入流 const writeStream = fs.createWriteStream('terminal_parking.csv'); // 写入表头 writeStream.write(`Terminal A,Terminal B,Terminal C/D \n`); var minutes = 1, timerInerval = minutes * 60 * 1000; function TerminalOccupancyData() { request('https://www.laguardiaairport.com/to-from-airport/parking', (error, response, html) => { // 无报错且请求成功时执行解析逻辑 if (!error && response.statusCode == 200) { const $ = cheerio.load(html); // 将变量声明提到each方法外部,作用域覆盖整个请求回调 let terminalA, terminalB, terminalCD; // 根据下标匹配不同航站楼的取值 $('.terminal-left').each((index, el) => { const percent = $(el).find('.terminal-percentage').text().replace(/% Full/, ''); if(index === 0) terminalA = percent; if(index === 1) terminalB = percent; if(index === 2) terminalCD = percent; }); console.log('\nTerminal Data scraped ... \n'); // 写入操作移到请求回调内部,保证拿到数据后再执行写入 writeStream.write(`${terminalA},${terminalB},${terminalCD} \n`); } }); } setInterval(TerminalOccupancyData, timerInerval);
内容的提问来源于stack exchange,提问作者kingkwaku
相关产品推荐
相关产品推荐

