使用JavaScript与Node.js+Puppeteer进行基本的Web爬取

打开凤凰新闻,查看更多高清图片

在这篇文章中,我们将学习使用浏览器自动化和JavaScript来抓取网页。我们将使用puppeteer。

Puppeteer是一个节点库API,可让我们控制无头Chrome。无头Chrome是一种无需实际运行Chrome即可运行Chrome浏览器的方法。

如何进行

通常,网页抓取分为两个部分:“通过发出HTTP请求来获取数据” 和 “通过解析HTML DOM提取重要数据”

库和工具

“Puppeteer” 和 “Nodejs”

我们要抓的内容

我们将通过该网站提供Scrape Book的价格和书名。这是一家专门成立的书店,旨在帮助人们练习scraping。

设定

我们的设置非常简单。只需创建一个文件夹并安装puppeteer。要创建文件夹并安装库,请键入以下命令。我假设您已经安装了Node.js。

现在,使用您喜欢的任何名称在该文件夹中创建文件。我使用的名称是scraping.js

准备Food

现在,在scraping.js中插入以下样板代码

让我们逐行浏览此示例。第1行:我们需要之前安装的Puppeteer依赖项;线路3-7:这是我们的主要功能scrape。此功能将保存我们所有的自动化代码;第9行:在这里, 我们正在调用我们的scrape()函数(运行该函数)。

需要注意的重要一点是我们的scrape()功能是一个async功能,并利用了ES 2017的新async/await功能。由于此函数是异步的,因此在调用该函数时会返回一个Promise。当async函数最终返回一个值时,Promise将会解析(或Reject如果有错误)。

由于我们使用的是async函数,因此我们可以使用await表达式,该表达式将暂停函数执行并等待Promise解析完成后再继续操作。随着本教程的继续,它将变得更加清晰。

我们可以通过向scrape函数添加一行代码来测试以上代码。试试看:

现在node scrape.js在控制台中运行。test退出!完美,我们返回的值正在记录到控制台。现在我们可以开始填写我们的scrape功能了。

步骤1:设定

我们要做的第一件事是创建浏览器的实例。打开一个新页面,然后导航到一个URL。我们的操作方法如下:

让我们逐行将其分解:首先,我们创建浏览器并将headless模式设置为false。这使我们可以准确地观察发生了什么:

然后,我们在浏览器中创建一个新页面:

接下来,我们转到books.toscrape.comURL:

(可选)我添加了1000几毫秒的延迟。尽管通常没有必要,但这将确保页面上的所有内容都加载:

最后,完成所有操作后,我们将关闭浏览器并返回

设置完成。现在,让我们开始scrape!

步骤2:scrape

现在您可能对我们将要抓到的东西有了一个想法。我们将抓取一本书的书名及其价格。

查看Puppeteer API,我们可以找到允许我们从页面中获取HTML的方法。为了检索这些值,我们将使用page.evaluate()方法。这种方法允许我们使用内置的DOM选择器,例如querySelector()。

我们要做的第一件事是创建page.evaluate()函数并将返回的值保存到名为result:

在我们的功能范围内,我们可以选择所需的元素。我们将使用Google Developers工具再次解决这个问题。右键单击标题,然后选择检查:

正如您将在Elements面板中看到的那样,标题只是一个h1元素。现在,我们可以使用以下代码选择此元素:

由于我们希望文本包含在此元素中,因此需要添加插件.innerText。最终代码如下所示:

同样,我们可以通过右键单击并检查元素来选择价格:

如您所见,我们的价格为price_color。我们可以使用此类选择元素及其内部文本。这是代码:

现在我们有了所需的文本,可以将其返回到一个对象中:

太棒了!现在,我们选择标题和价格,将其保存到对象中,然后将该对象的值返回到result变量中。放在一起的样子是这样的:

剩下要做的唯一一件事就是返回我们的代码,result以便可以将其记录到console:return结果中。这是您的最终代码应如下所示:

现在,您可以通过在控制台中键入以下内容来运行Node文件:

如果没什么问题,您应该在屏幕上看到所选书籍的标题和价格。

使其完美

现在,对于初学者来说,从首页本身上爬取所有的书名会更加困难。但是,这为您提供了练习新爬取技能的绝好机会!

提示:这项挑战与上一个示例之间的主要区别在于需要遍历大量结果。您可以按照以下方法设置代码来做到这一点:

最后

在本文中,我们了解了如何使用N odejs&Puppeteer抓取数据,不管网站的类型如何我们都可以进行爬取想要的资源。