使用Node.js和Puppeteer进行网络抓取的教程

151 阅读2分钟

网络抓取的简短入门教程

网络抓取是指下载一个网页并从中提取某种信息的任务。

我最近做了一个小项目,用Arduino板连接了一个LCD显示屏。使用Johnny-Five,它可以让我们用Node.js对Arduino进行编程,我想获取在山顶测量的温度,并在Arduino板上显示出来。

我使用Puppeteer来完成搜刮的任务。Puppeteer是一个由Google建立的伟大工具。它是一个Node库,我们可以用它来控制一个无头的Chrome实例。

这意味着我们基本上是在使用Chrome,但以编程的方式。

Puppeteer有很多实际用途,包括自动化测试、制作屏幕截图、创建单页应用程序的服务器端渲染版本等等。

首先用以下方式安装它

在一个Node.js文件中,要求它。

const puppeteer = require('puppeteer');

然后我们可以使用launch() 方法来创建一个浏览器实例。

(async () => {
  const browser = await puppeteer.launch()
})()

我们使用await ,因此我们必须把这个方法调用包装成一个异步函数,并立即调用

接下来我们可以在browser 对象上使用newPage() 方法来获得page 对象。

(async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
})()

接下来我们调用page 对象上的goto() 方法来加载该页面。

(async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto('https://website.com')
})()

最后,我们可以通过调用pageevaluate() 方法来获得页面内容。这个方法需要一个回调函数,我们可以在其中添加所需的代码来检索我们需要的页面元素。该函数是在页面的上下文中执行的,所以我们可以访问document 和所有的浏览器API。我们返回一个新对象,这将是我们evaluate() 方法调用的结果。

我们可以使用选择器API并从页面中检索数据。

(async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto('https://website.com')

	const result = await page.evaluate(() => {
  	//...
	})
})()

让我们来谈谈我遇到的特殊问题。这是一个承载气象站的页面,位于3315米的山顶上: http://www.meteocentrale.ch/it/europa/svizzera/meteo-corvatsch/details/S067910/

我想得到这个-9°C 。使用浏览器检查器,我可以看到它有一个column-4 类。这不是一个理想的类名,因为它没有意义,而且如果他们决定增加一个新的栏目,它可能会改变,但这就是我们得到的东西。

这就是到现在为止的完整代码。

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto('http://www.meteocentrale.ch/it/europa/svizzera/meteo-corvatsch/details/S067910/')

	const result = await page.evaluate(() => {
 	  let temperature = document.querySelector('.column-4').innerText
    return {
	    temperature
	  }
  })

  console.log(result)

  browser.close()
})()

如果我们运行这段代码,result ,将有这个值。

或者现在的温度是多少。