Ich baue einen Web-Crawler, der mehr als 200 Seiten abdecken wird. Der aktuelle Code, den ich habe, läuft über einer externen JSON-Datei, die ich aus einem Dutzend Sites aufgebaut habe. Beispiel:NightmareJS - Web Crawler muss über JSON-Daten iterieren
[
{
"company": "My Company",
"url": "http://example.com/jobs/",
"query": "div.job-listings>dt a",
"link": "div.job-listings>dt a"
},
{
"company": "Another Company",
"url": "http://anothercompany.com/careers/",
"query": ".clearfix~ .col-sm-6+ .col-sm-6 a , .col-sm-6:nth-child(4) a",
"link": ".clearfix~ .col-sm-6+ .col-sm-6 a , .col-sm-6:nth-child(4) a"
}
]
Als ich async versuchte .each es alle ursprünglichen Objekte an der Spitze der Funktion des Alptraums Instanz anmelden würde, bevor dann error Nothing responds to "goto"
zurückkehren zu betreten. Dann versuchte ich async .eachSeries, die das richtige Ergebnis ausgibt, aber nach der ersten Iteration stoppt.
var async = require ('async');
var data = require('./input.json')
var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: false })
function crawl(data, cb) {
console.log(data) // When async.each will iterate all items then error
var nightmare = new Nightmare()
nightmare
.goto(data.url) // go to JSON specified url
.wait(data.query) // wait until CSS selector loads
.evaluate(function (data) {
positionsArr = []
obj = {}
obj.company = data.company
query = document.querySelectorAll(data.query)
link = document.querySelectorAll(data.link)
/* Set query and link equal to all elements with selector
itearte through appending text (innerText) from each element
with job url to obj*/
var i;
for (i = 0; i < query.length; i++) {
positionsObj = {}
positionsObj.title = query[i].innerText.trim()
// if each position has individual page
if (data.link !== null) {
positionsObj.url = link[i].href
} else {
positionsObj.url = data.url
}
positionsArr.push(positionsObj)
}
obj.positions = positionsArr
return obj
}, data)
.end()
.then(function (obj) {
console.log(obj)
console.log('done')
})
.catch(function (error) {
console.error('error', error);
});
}
async.eachSeries(data, crawl, function (err){
console.log('done!');
})
Wie kann ich diese Arbeit haben, ohne für jede eine eigene Datei schreiben zu müssen? Oder gibt es eine bessere Möglichkeit, diese Anzahl von Websites zu crawlen?