65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (10投票s)

2015 年 12 月 6 日

CPOL

3分钟阅读

viewsIcon

31100

使用 node.js 创建你自己的网络爬虫

使用 node.js 创建你自己的网络爬虫

想制作你自己的爬虫来抓取任何网站的数据,并以 JSON 格式返回,以便你可以随时随地使用它吗?如果是,那么你来对地方了。

在本技巧中,我将指导你如何使用 node.js 抓取任何网站,以获取所需的数据,并以 JSON 格式获取数据,例如,可以用来制作任何可以从互联网上实时运行数据的应用程序。

在本技巧中,我将使用 Windows 10 x64 和 VS 2015,并将从一个新闻网站上抓取数据,即。

Result

  • 首先,设置 IDE,前往 https://node.org.cn/en/download/ 并下载 node.js 的预构建安装程序。对我来说,它将是 Windows 64 位安装程序。

    Node.js

  • 安装后,打开你的 Visual Studio 并创建一个新项目:模板 > JavaScript > Node.js > 基本 Node.js Express 4 应用程序。

  • 现在我需要在 *npm* 文件夹中添加两个包,即 “Request” 和 “Cheerio”。

  • 并通过右键单击卸载 “jade”,因为我们现在不需要它了,我必须将我的 json 托管到 Azure 云服务,所以 jade 会抛出一个异常。如果想要在应用程序中直接使用 json,或使用其他服务进行托管,则无需卸载 jade。
  • 现在转到 app.js 并注释掉第 14 行和第 15 行,因为我们不使用 “Views”。

    Commenting

  • 还要注释掉 “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);
        });
    });

  • 这里是主要且困难的部分。现在,我们必须编写抓取我们网站的主要逻辑。你必须根据你的网站和你想要获取的数据来定制你的函数。让我们在浏览器中打开该网站,并开发其逻辑。

    Website

  • 我想抓取以下数据:新闻标题、新闻描述和打开新闻详细信息的链接。这些数据是动态变化的,我想获取最新的数据。

    Website

  • 为了获取这些数据,我必须研究它的 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 树。
© . All rights reserved.