【问题标题】:Scraping with NodeJS使用 NodeJS 进行抓取
【发布时间】:2019-02-09 06:06:45
【问题描述】:

我需要从循环中的 url 中提取链接,所以基本上我需要再次执行该函数,但我不知道如何使用 nodejs 进行此操作。

var request = require('request');
var cheerio = require('cheerio');
var searchTerm = 'baloncesto';
var url = 'http://mismarcadores.com/' + searchTerm;

request(url , function(err,resp,body){
    $ = cheerio.load(body);
    links = $('a');
    $(links).each(function(i,link){
        console.log(url+$(link).attr('href'));
    }
   )
})

我的问题是关于如何从这个数组中提取链接,因为这个代码可以正常工作(这个代码在控制台中显示链接)但我需要抓取这些链接。

结果将抓取每个内部的 url。

【问题讨论】:

标签: javascript node.js cheerio requestjs


【解决方案1】:
var request = require('request');
var cheerio = require('cheerio');
var searchTerm = 'baloncesto';
var url = 'http://mismarcadores.com/' + searchTerm;
request(url , function(err,resp,body){
    $ = cheerio.load(body)
    var allLinks = []
    links = $('a');
    $(links).each(function(i,link){
        console.log(url+$(link).attr('href'))
        var currentLink = url+$(link).attr('href')
        allLinks.push(currentLink)
        if (i == links.length-1){
          useLinks(allLinks)
        }
    }
   )
})

function useLinks(allLinks){
  console.log(allLinks)
}

如果您询问如何从从 Cheerio 收到的链接中提取 url,那么您已经在这样做了。如果您想在请求完成后在其他地方使用它们(例如再次抓取),则将它们存储在一个数组中,并在遍历最后一个链接后调用一个函数来使用该数组。

【讨论】:

    【解决方案2】:

    它应该看起来像这样:

    let links = $('a').get().map(a => $(a).attr('href'))
    

    【讨论】:

      【解决方案3】:

      我分享我的解决方案就像问题一样,但有不同的变化。

      我不提取所有链接,只提取我通过 url 传递的链接。

      var express = require('express');
      var fs      = require('fs');
      var request = require('request');
      var cheerio = require('cheerio');
      var app     = express();
      var searchTerm = 'baloncesto';
      var url = 'http://mismarcadores.com/' + searchTerm;
      var arr2 = [];
      app.get('/webscrape', function(req, res,body){  
          request(url , function(err,resp,body){
              var array2 = [];
              var array3 = [];
              $ = cheerio.load(body);
              links = $('a'); //jquery get all hyperlinks
              $(links).each(function(i, link){
                  if($(link).attr('href').includes("baloncesto")){
                      array2.push($(link).attr('href'));
                  }
              }); 
              const uniqueLinks = new Set([...array2]);   
              uniqueLinks.forEach((d) => {    
              const row = []; // a new array for each row of data
                  row.push(d);
                  array3.push(row.join()); // by default, join() uses a ','
              }); 
              fs.writeFile('raaga_output.json', JSON.stringify(array3, null, 4), function(err){
                  console.log('File successfully written! - Check your project directory for the raaga_output.json file');
              })      
              res.send('File successfully written! - Check your project directory for the raaga_output.json file');   
          })
      })
      app.listen('3000')
      console.log('Web Scrape happens on port 3000');
      exports = module.exports = app;
      

      每个人都可以毫无问题地使用它。

      【讨论】:

        猜你喜欢
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多