【问题标题】:How to scrape web with the subpage in parallel?如何与子页面并行抓取网页?
【发布时间】:2017-06-30 13:15:11
【问题描述】:

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

这是顺序

  1. 抓取第一页以查找多个 URL
  2. 转到每个网址,找到几个网址
  3. 转到另一层网址,从表格中读取内容

我可以找到许多教如何执行第 1 步的 URL。但再往下看,我找不到任何好的示例。此外,我尝试了 X-ray,但效果不佳,因为我的 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 应该按顺序运行。有什么方法可以并行抓取页面吗?

感谢您的帮助

【问题讨论】:

  • 对我来说这看起来像是一个递归函数。您可以通过将 URL 推送到堆栈并在 while 循环中使用它们直到堆栈为空来模拟它。
  • @LaurIvan 我已经更新了我的问题,感谢您的宝贵时间。希望此更改可以帮助您了解我面临的问题。谢谢。

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


【解决方案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 传递给它。然后你观察完成的承诺,并用返回的数据做你想做的事。

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 2021-12-02
    • 2021-03-10
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 2017-01-16
    • 2020-06-18
    相关资源
    最近更新 更多