首页 > 解决方案 > 为.pdf链接抓取网页并将所有匹配的链接写入nodeJS中的文本文件

问题描述

我是一个有抱负的开发者。作为我的项目之一,我正在学习如何进行网络抓取。这里的目标是为任何 PDF 链接抓取给定的网页,并将这些链接保存到 NodeJS 中的文本文件中。使用给定的代码,我成功地在控制台记录了所有匹配的链接,但我只将一个文件写入我的文本文件。有人可以引导我走向正确的方向吗?

const puppeteer = require("puppeteer");
const fs = require("fs/promises");

let myNewURL =
  "https://www.renault.co.il/cars/Zoe/index.html?fbclid=IwAR1RtxbC_U2fImp9_KXJuQ869h5Wv77fyZVj8uBOU86rU90wb2L_NfrNppc";

async function scrapeSite(url) {
  console.log("firing");
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto(url);

  //this gives back an actual array, not a node list
  const linkCollection = await page.$$eval("a", (links) => {
    return links.map((link) => {
      return link.href;
    });
  });

  for (const link of linkCollection) {
    if (link.includes(".pdf")) {
      console.log(link);
      await fs.writeFile("pdfLinks.txt", link);
    }
  }

  await browser.close();
}

scrapeSite(myNewURL);

标签: javascriptnode.jsweb-scraping

解决方案


fs.writeFile每次调用都会覆盖原始文件。试试fs.appendFile吧。我还在\n末尾添加了一个换行符 ( ),因此链接位于单独的行上:

for (const link of linkCollection) {
  if (link.includes(".pdf")) {
    console.log(link);
    await fs.appendFile("pdfLinks.txt", link + '\n');
  }
}

或者,您可以先将链接收集到一个数组中,然后将它们全部写在一起:

const pdfLinks = [];

for (const link of linkCollection) {
  if (link.includes(".pdf")) {
    console.log(link);
    pdfLinks.push(link);
  }
}

const output = pdfLinks.join('\n')
await fs.writeFile("pdfLinks.txt", output);

推荐阅读