【问题标题】:Creating file and saving to a variable NodeJS创建文件并保存到变量 NodeJS
【发布时间】:2018-07-02 23:27:29
【问题描述】:

我正在使用 Puppeteer 来抓取网站。我的目标是能够在响应中发送屏幕截图和 html 文件。

我的代码将显示我的路由接收一个 url 作为参数,将其传递给我的爬虫函数,通过 Puppeteer 执行正确的操作,并将屏幕截图和(当前)html 作为字符串返回。我需要将该 html 字符串转换为 HTML 文件,而不保存它,只在内存中。

路由文件:

const crawler = require('./../puppeteer/crawler.js');


module.exports = function(app) {
  app.get('/crawl/screenshot/:url', (req, res) => {
    const url = req.params.url;
    crawler.pageScreenshot(url, function(screenshot) {
      let buffer = new Buffer(screenshot);
      let myScreenshot = buffer.toString('base64');
      // res.contentType('image/png');
      res.send(myScreenshot);
    });
  });
  app.get('/crawl/html/:url', (req, res) => {
    const url = req.params.url;
    crawler.pageHTML(url, function(html) {
      console.log(typeof html);
      let buffer = Buffer.from(html).toString('base64');
      // res.contentType('text/html');
      res.send(buffer);
    });
  });
  app.get('/crawl/screenshot_and_html/:url', (req, res) => {
    const url = req.params.url;
    crawler.pageScreenshotAndHTML(url, function(screenshot,html) {
      let buffedScreen = Buffer.from(screenshot).toString('base64');
      let buffedHtml = Buffer.from(html).toString('base64');
      let obj = JSON.stringify({'screenshot': buffedScreen, 'html': buffedHtml});
      res.contentType('application/json');
      res.send(obj);
    });
  });
};

爬虫文件:

const puppeteer = require('puppeteer');

async function pageScreenshot(url, cb) {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url);
  let screenshot = await page.screenshot({fullPage: true});
  await browser.close();
  cb(screenshot);
}
async function pageHTML(url, cb) {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url);
  let html = await page.content();
  await browser.close();
  cb(html);
}
async function pageScreenshotAndHTML(url,cb) {
  // this encoding doesn't work
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url);
  let screenshot = await page.screenshot({fullPage: true});
  let html = await page.content();
  await browser.close();
  cb(screenshot,html);
}
module.exports = {
  pageScreenshot: pageScreenshot,
  pageHTML: pageHTML,
  pageScreenshotAndHTML: pageScreenshotAndHTML
}

同样,我的变量 html(在我的爬虫文件中)当前是一个 html 字符串。我需要该变量是一个 HTML 文件,其中包含我从 puppeteer 获得的 html,而不仅仅是一个字符串。我想这样做而不在本地保存/写入文件,然后必须删除该文件。

谢谢!

【问题讨论】:

  • “HTML 文件变量”是什么意思?一个 DOM 变量?如果要将 html 字符串包装到 jQuery 对象中,可以使用 cheerio 包。 const $ = cheerio.load('your_html_string');.
  • @hoangdv 不,我没有前端,这都是服务器端。您可以在我的第二段代码中看到爬虫文件:let html = await page.content();。这将获取页面的整个 HTML 并将其保存到我的变量“html”中。然而,那时它只是一个字符串。而我需要以 html 文件的形式获取页面的 html,而不是字符串。
  • cheerio 是一个在服务器端工作的包。我不知道你想要什么,如果你从 html 文件中读取 html,它也会返回一个字符串,如果你想保存第一个 puppeteer 的 html 数据以在下一个用户的请求中使用,只保留你的 html字符串并使用另一个 DOM 访问包而不是 puppeteer
  • Whereas I need to get the html of the page in form of an html file, not a string 将此字符串保存到磁盘,您将获得一个文件。但后来你说你不想保存它。我们无法理解您所说的“文件”是什么意思。

标签: javascript node.js file express puppeteer


【解决方案1】:

我最初的想法和问题是我想发回 2 个项目 - 一个编码的 png 文件和一个编码的 html 文件。这最终将由不同的应用程序接收。然后在解码时,我以为他们会在编码之前解码成上面Node应用程序中的文件。但是现在我看到即使将 png 本身发送回,接收应用程序仍然必须从字符串格式转换图像。所以我最初的想法和问题不再有效,因为在接收应用程序中,我必须负责翻译我收到的内容,无论它是如何发送的。我的代码保持不变,它响应 base64 编码的 png 和字符串(html)。我负责在调用的应用程序中将它们从 base64 解码的字符串格式转换为正确的格式(在本例中为 PNG 和 HTML)。很抱歉造成混乱!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多