java抓取网页内容( 网页抓取意味着流程(Web抓取自动化)的简要信息表)
优采云 发布时间: 2021-10-14 12:03java抓取网页内容(
网页抓取意味着流程(Web抓取自动化)的简要信息表)
使用 Node.js 进行网页内容抓取(Web Scraping)
介绍
根据定义,网络抓取意味着从网页中获取有用的信息。该过程应该消除手动浏览页面的需要,自动化,并允许您感兴趣的信息的程序化采集和分类
Node.js 是一个很好的网络爬虫工具。它允许使用 npm 提供的开源模块在几行代码中实现网页抓取
使用Node.js进行网页内容抓取(Web Scraping)的主要步骤
正如我们所定义的,网络抓取只不过是自动手动浏览和从您首选的网络浏览器中的特定 网站 采集信息
这个过程包括三个主要步骤:
根据应用的需要,第一步和最后一步通常基本相同。但是,理解 HTML 内容需要为每个要爬取的 网站 编写特定的代码
警告
根据您对这些技术和技术的使用,您的应用程序可能正在执行非法操作
在某些情况下,您需要小心:
手动抓取网页的算法方法示例
例如,我们会找到本站豆豆网的部分列表页
首先,让我们定义我们的任务和期望的结果:
使用“.CSV”文件来存储收录 文章 的地址、标题和日期。这些专栏将简要描述每个文章
以下是我们如何手动执行此操作:
多次重复这些步骤将得到这个搜索列表页面的简要信息表
使用 Web Scraping 自动化流程(Web Scraping)
为了自动化这个过程,我们应该以编程方式遵循相同的步骤
设置开发环境
我们将使用 Node.js 和 npm 来开发这个示例项目。因此,请确保您的机器上安装了这些工具,让我们首先在您选择的空目录中运行以下命令,然后创建一个收录我们代码的空 index.js 页面:
$ npm init
下一步是从 npm 安装所需的模块
从上面描述的手动算法可以看出,我们需要一些东西来获取HTML源代码,解析内容并理解它,然后将JavaScript对象数组写入“.CSV”文件:
$ npm install --save request request-promise cheerio objects-to-csv
在终端中执行上一行将在 node_modules 目录中安装所需的模块并将它们作为依赖项保存在 package.json 文件中
检索信息
所有准备工作完成后,使用编辑器编辑 index.js 并根据需要导入我们刚刚安装的模块:
const rp = require('request-promise');
const otcsv = require('objects-to-csv');
const cheerio = require('cheerio');
在手动算法中完成这一步会为我们提供一个链接,我们将把它分成两部分并添加到模块导入代码后面的 index.js 中:
const baseURL = 'https://fullsmilespace.cn';
const searchURL = '?s=IT';
根据图中得到这两个变量的值:
然后,我们应该编写一个函数,该函数将在任务描述中返回表示 文章 的 JavaScript 对象数组
为了能够将手动算法转换为代码,我们必须首先使用网络浏览器的检查器工具进行一些手动工作
我们需要找到收录我们感兴趣的信息的特定 HTML 元素。在我们的示例中,可以在以下元素中找到 文章 链接:
如何将iPhone X/8/7/6s/6/5s/5/4s/SE等备份到iTunes/iCloud/PC/Mac
它是一个 h2 嵌套的 tag 标签,带有类 entry-title,其中收录 文章 链接,以及一个 href 属性,其中收录指向各种 文章 页面的链接。这两种方法将来都会对我们有用
链接到文章页面后,我们需要找到剩下的两部分数据:title和date,分别位于class entry-title标签和class entry-date标签下
请注意,要获取标题和日期,我们需要将值存储在标签中
当我们尝试实现其编程时,让我们看看手动算法会是什么样子:
下面是这个算法在实现时的样子:
const getCompanies = async () => {
const html = await rp(baseURL + searchURL);
const businessMap = cheerio('.entry-title a', html).map(async (i, e) => {
const link = e.attribs.href;
const innerHtml = await rp(link);
const title = cheerio('.entry-title', innerHtml).text();
const date = cheerio('.entry-date', innerHtml).text();
return {
link,
title,
date
}
}).get();
return Promise.all(businessMap);
};
它遵循我们之前设置的规则并返回一个 Promise,它解析为一组 JavaScript 对象:
{ link: 'https://fullsmilespace.cn/?p=75',
title: '如何在WordPress中添加关键字keywords和元描述meta descriptions',
date: '2019年1月15日' }
{ link: 'https://fullsmilespace.cn/?p=209',
title: '如何将iPhone X/8/7/6s/6/5s/5/4s/SE等备份到iTunes/iCloud/PC/Mac',
date: '2019年1月18日' }
{ link: 'https://fullsmilespace.cn/?p=197',
title: '解决App Store下载“超过150MB”的应用需无线局域网来下载的限制',
date: '2019年1月17日' }
{ link: 'https://fullsmilespace.cn/?p=192',
title: '2019年的页面搜索引擎优化|2019年页面SEO优化',
date: '2019年1月16日' }
{ link: 'https://fullsmilespace.cn/?p=95',
title: '美化WordPress网站的最佳插件推荐|WordPress网站美化插件汇总',
date: '2019年1月15日' }
{ link: 'https://fullsmilespace.cn/?p=254',
title: 'Node.js初学者指南 | 初识Node.js详细过程',
date: '2019年1月21日' }
承诺
如果你不熟悉现代 JavaScript 中异步编程的核心概念,这里是 Promises 的简要介绍
Promise 是一种特殊类型,用作值的占位符。它可能处于几种状态:
如果你不是太详细,你应该只知道返回一个promise的函数并没有返回实际值。为了访问 Promise 的结果或解析值,您应该编写另一个函数,该函数应该传递到 then 块中,并期望 Promise 的值被解析。如果在 Promise 等待期间发生任何错误,它会过渡到拒绝状态,并且可以在 catch 块中处理错误
数据存储和整理工作
现在我们已经从网页中提取了所有必要的数据并拥有一个干净的 JavaScript 对象数组,我们可以准备任务定义所需的文件“.CSV”:
getCompanies()
.then(result => {
const transformed = new otcsv(result);
return transformed.toDisk('./output.csv');
})
.then(() => console.log('成功完成简单页面内容抓取!'));
getCompanies 函数返回一个承诺,该承诺解析为准备写入 CSV 文件的对象数组,这是在第一个 then 块中完成的。当CSV文件成功写入文件系统后,第二个解析器会解析完成任务
通过将此代码添加到 index.js 文件并运行它:
node index.js
我们应该在我们的工作目录中得到一个 output.csv 文件。csv文件表示的表格收录3列——文章链接、标题、日期,每行描述一篇文章文章
综上所述
本质上,网页抓取就是浏览网页,根据任务获取有用的信息,并将其存储在某个地方,所有这些都是通过编程来完成的。为了能够通过代码实现这一点,你应该首先使用浏览器的inspector工具或者通过分析目标网页的原创HTML内容来手动完成这个过程
Node.js 提供了可靠且简单的工具,使网页抓取成为一项简单的任务,与手动处理链接相比,可以节省大量时间
尽管将所有日常任务自动化似乎很诱人,但在制作这些工具时要小心,因为如果您不完全理解源网站 的术语或网络爬虫产生的流量,它们很容易违反法律