如何与子页面并行废弃网页?

时间:2017-06-30 13:15:12

标签: node.js web-scraping cheerio x-ray

我看到很多网络抓取教程,但我找不到会使用子页面废弃网页的模式。

这是序列

  1. 报废第一页以查找多个网址
  2. 转到每个网址,找到多个网址
  3. 转到另一层网址,阅读表格中的内容
  4. 我可以找到许多教导如何执行步骤1的URL。但是进一步下来我找不到任何好的例子。另外我尝试了X射线,但它不能很好地工作,因为我的URL是父项的一部分。

    以下是一些示例代码:

    var request = require('request');
    var cheerio = require('cheerio');
    
    var url = 'https://news.ycombinator.com';
    
    request(url, function (error, response, html) {
        if (!error && response.statusCode == 200) {
            var $ = cheerio.load(html);
            $('span.comhead').each(function(i, element){
                // Obtain the URL of the news
                var a = $(this).prev();
                var subUrl = a.attr('href');
    
                // Go to that news and obtain the title
                request(subUrl, function (error, response, html) {
                    if (!error && response.statusCode == 200) {
                        var $ = cheerio.load(html);
                        var title = $("title").text();
                        console.log(title);
                    }
                });
            });
        }
    });
    

    但是cheerios each应该按顺序运行。有什么方法可以并行废弃页面吗?

    感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您可以使用X射线轻松完成此操作。例如,见下面的代码:

var Xray = require('x-ray');
var x = Xray();
var baseUrl = 'https://news.ycombinator.com'; // set base url
x(baseUrl, { // scrape base url
    title1: x('a', [{links1:'@href'}]) // store links in array
})(function(err, obj1) { // pass array to next fx
    obj1.forEach(function(links.link) {
        // assuming links.link stores '/sample-link-to-crawl-83792',
        x(baseUrl+links.link, { // append base url to link and crawl
            title2: x('a', [{links2:'@href'}])
        })(function(err, obj2){
            obj2.forEach(function(links2.link) { // for each link in obj2
                console.log(link) // should print link to console
            });
        });
    });
});

您可以像这样继续,或者只是创建一个返回承诺的函数,并随时将扫描的URL传递给它。然后,您将查看已完成的承诺,并使用返回的数据执行您想要的操作。