使用 node.js 创建你自己的网络爬虫,并以 JSON 格式获取数据






4.56/5 (10投票s)
使用 node.js 创建你自己的网络爬虫
使用 node.js 创建你自己的网络爬虫
想制作你自己的爬虫来抓取任何网站的数据,并以 JSON 格式返回,以便你可以随时随地使用它吗?如果是,那么你来对地方了。
在本技巧中,我将指导你如何使用 node.js 抓取任何网站,以获取所需的数据,并以 JSON 格式获取数据,例如,可以用来制作任何可以从互联网上实时运行数据的应用程序。
在本技巧中,我将使用 Windows 10 x64 和 VS 2015,并将从一个新闻网站上抓取数据,即。
- 首先,设置 IDE,前往 https://node.org.cn/en/download/ 并下载 node.js 的预构建安装程序。对我来说,它将是 Windows 64 位安装程序。
- 安装后,打开你的 Visual Studio 并创建一个新项目:模板 > JavaScript > Node.js > 基本 Node.js Express 4 应用程序。
- 现在我需要在 *npm* 文件夹中添加两个包,即 “
Request
” 和 “Cheerio
”。 - 并通过右键单击卸载 “jade”,因为我们现在不需要它了,我必须将我的 json 托管到 Azure 云服务,所以 jade 会抛出一个异常。如果想要在应用程序中直接使用 json,或使用其他服务进行托管,则无需卸载 jade。
- 现在转到 app.js 并注释掉第 14 行和第 15 行,因为我们不使用 “Views”。
- 还要注释掉 “
app.use('/', routes);
”。 - 将
app.use('/users', users);
更改为app.use('/', users);
。 - 现在转到 *users.js*,因为我们现在将在这里做主要的事情。首先,添加文件 “*cheerio*” 和 “*request*”。
- 创建一个变量来保存链接的 url。
var url = "http://www.thenews.com.pk/CitySubIndex.aspx?ID=14";
- 修改
router.get()
函数如下router.get ('/', function (req, res) { request (url, function (error, response, body) { if (!error && response.statusCode === 200) { var data = scrapeDataFromHtml(body); res.send(data); } return console.log(error); }); });
- 这里是主要且困难的部分。现在,我们必须编写抓取我们网站的主要逻辑。你必须根据你的网站和你想要获取的数据来定制你的函数。让我们在浏览器中打开该网站,并开发其逻辑。
- 我想抓取以下数据:新闻标题、新闻描述和打开新闻详细信息的链接。这些数据是动态变化的,我想获取最新的数据。
- 为了获取这些数据,我必须研究它的 DOM,这样我才能编写它的 jQuery 来轻松获取它。
- 我制作了一个 DOM 树,以便我可以轻松地编写逻辑来遍历它。
- 红色文字是我必须在循环中到达的节点,才能访问网站上的数据。
- 我将编写一个名为
scrapedatafromthtml
的函数,如下所示var scrapeDataFromHtml = function (html) { var data = {}; var $ = cheerio.load(html); var j = 1; $('div.DetailPageIndexBelowContainer').each(function () { var a = $(this); var fullNewsLink = a.children().children().attr("href"); var headline = a.children().first().text().trim(); var description = a.children().children().children().last().text(); var metadata = { headline: headline, description: description, fullNewsLink : fullNewsLink }; data[j] = metadata; j++; }); return data; };
- 该函数将使用类 ‘
.DetailPageIndexBelowContainer
’ 到达 ‘div
’,并将迭代其 DOM 以获取 ‘fullNewsLink
’、‘headline
’ 和 ‘description
’。然后,它将这些值添加到名为 ‘metadata
’ 的数组中。我还有另一个名为 ‘data
’ 的数组,并且每次迭代都会从 metadata 中获取这些值,以便最终可以返回我的 ‘data
’ 数组作为 JSON。如果只想从网站获取一件东西,则无需循环或创建其他数组。 你可以直接通过遍历它来访问它们并返回单个数组。 - 现在运行它并检查输出。
- 是的!它运行完美,并以 JSON 格式返回所需的数据。
- 附注:如果我用作示例的站点删除了页面,更改了布局,更改了 css 文件或其名称等,那么我们将无法获得所需的结果。为此,你必须编写新的逻辑。但我已经解释了逻辑以及如何遍历任何网站的 DOM 树。