2013-12-13 1 views
1

Во-первых, вот мой код, как я прогрессировал до сих пор:node.js + cheerio scrape: Передача массива URL-адресов для загрузки?

var http = require("http"); 

// Utility function that downloads a URL and invokes 
// callback with the data. 
function download(url, callback) { 
    http.get(url, function(res) { 
    var data = ""; 
    res.on('data', function (chunk) { 
     data += chunk; 
    }); 
    res.on("end", function() { 
     callback(data); 
    }); 
    }).on("error", function() { 
    callback(null); 
    }); 
} 

var cheerio = require("cheerio"); 

var url = "http://www.bloglovin.com/en/blogs/1/2/all"; 
var myArray = []; 
var a = 0; 

var getLinks = function(){download(url, function(data) { 
    if (data) { 
    // console.log(data); 
    var $ = cheerio.load(data); 
    $(".content").each(function(i, e) { 
     var blogName = $(e).find(".blog-name").text(); 
     var followLink = $(e).find("a").attr("href"); 
     var blogSite = $(e).find(".description").text(); 

     myArray[a] = [a]; 
     myArray[a]["blogName"] = blogName; 
     myArray[a]["followLink"] = "http://www.bloglovin.com"+followLink; 
     myArray[a]["blogSite"] = blogSite; 

     a++; 

     console.log(myArray); 

    }); 
    } 
}); 
} 

getLinks(); 

Как вы можете видеть, followLinks сцепляется к followUrl, из которых я хотел бы пройти через 'url' загрузки, так что эффективно I- 'будет очищать каждую страницу, используя те же правила CSS, которые будут добавлены в многомерный массив для соответствующего блоггера.

Как я могу это сделать?

+0

Два вызовов включить 'http' модуль? Удалите один из них – sachinjain024

+0

, что было ошибкой при вставке! – user3015175

ответ

0

Вы определили a = 0; Так

myArray[a] = [a]; // => myArray[0] = [0]; myArray[0] becomes an array with 0 as only member in it 

Все эти заявления выдаст ошибку, так как массив может иметь только целое число в качестве ключей.

myArray[a]["blogName"] = blogName; 
myArray[a]["followLink"] = "http://www.bloglovin.com"+followLink; 
myArray[a]["blogSite"] = blogSite; 

Вместо этого попробуйте:

var obj = { 
    index: a, 
    blogName: blogName, 
    followLink: "http://www.bloglovin.com" + followLink, 
    blogSite: blogSite 
} 

myArray.push(obj); 
console.log(myArray); 
0

Внутри вашего цикла, просто создать объект со свойствами, вы царапать затем нажать этот объект на массиве.

var blogInfo = { 
    blogName: blogName, 
    followLink: "http://www.bloglovin.com"+followLink; 
    blogSite: blogSite 
}; 
myArray.push(blogInfo); 
+0

это выглядит великолепно. Итак, как я мог использовать URL-адреса в followLink для очистки каждой отдельной страницы? – user3015175

1

я сделать что-то подобное в одном из моих очищающих рабочих мест, но я использую async.js библиотеки для выполнения. Обратите внимание, что я также использую модуль request и cheerio.js в своих выскабливаниях. Я извлекаю и очищаю строки данных с одной веб-страницы, но подозреваю, что вы можете сделать что-то похожее на выборку URL-адресов и запросить/очистить их таким же образом.

Я также признаю, что это довольно базовое кодирование, безусловно, может быть оптимизировано с небольшим количеством рефакторинга. Надеюсь, что это дает вам некоторые идеи по крайней мере ...

Во-первых, я использую запрос на выборку страницу и вызвать мой синтаксического анализа функции -

var url = 'http://www.target-website.com'; 
function(lastCallback) { 
    request(url, function(err, resp, body) { 
     if(!err) { parsePage(err, resp, body, lastCallback); } 
      else { console.log('web request error:' + resp.statusCode); } 
    } 
} 

Далее в моей parsePage функции, я загрузить веб-сайт в Cheerio , принести HTML каждой строки данных в массив, нажмите мою parseRow функцию и каждый HTML-сегмент в другой массив, и использовать async.parallel для обработки каждой итерации -

var rows = []; 
function parsePage(err, resp, body, callback1) { 
    var $ = cheerio.load(body); 
    $('div#targetTable tr').each(function(i, elem) { 
     rows.push($(this).html()); 
    }); 

    var scrRows = []; 
    rows.forEach(function(row) { 
     scrRows.push(function(callback2) { 
      parseRow(err, resp, row); 
      callback2(); 
    }); 

    async.parallel(scrRows, function() { 
     callback1(); 
    }); 
}