मैं Node और Cheerio के साथ एक वेब स्क्रैपर का निर्माण कर रहा हूं, और एक निश्चित वेबसाइट के लिए मुझे निम्न त्रुटि मिल रही है (यह केवल इस एक वेबसाइट पर होती है, कोई अन्य नहीं जिसे मैं परिमार्जन करने की कोशिश करता हूं।
यह हर बार एक अलग स्थान पर होता है, इसलिए कभी-कभी यह url x
त्रुटि को फेंक देता है, अन्य समय url x
ठीक है और यह पूरी तरह से एक अलग यूआरएल है:
Error!: Error: socket hang up using [insert random URL, it's different every time]
Error: socket hang up
at createHangUpError (http.js:1445:15)
at Socket.socketOnEnd [as onend] (http.js:1541:23)
at Socket.g (events.js:175:14)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:910:16
at process._tickCallback (node.js:415:13)
यह डिबग करने के लिए बहुत मुश्किल है, मैं वास्तव में नहीं जानता कि कहां से शुरू करना है। शुरू करने के लिए, क्या है एक सॉकेट त्रुटि लटका? क्या यह 404 त्रुटि या समान है? या इसका मतलब सिर्फ इतना है कि सर्वर ने कनेक्शन से इनकार कर दिया है?
मुझे इसका कहीं भी स्पष्टीकरण नहीं मिल रहा है!
संपादित करें: यहां कोड का एक नमूना है जो (कभी-कभी) रिटर्निंग त्रुटियां हैं:
function scrapeNexts(url, oncomplete) {
request(url, function(err, resp, body) {
if (err) {
console.log("Uh-oh, ScrapeNexts Error!: " + err + " using " + url);
errors.nexts.push(url);
}
$ = cheerio.load(body);
// do stuff with the '$' cheerio content here
});
}
कनेक्शन को बंद करने के लिए कोई प्रत्यक्ष कॉल नहीं है, लेकिन मैं उपयोग कर रहा हूं Node Request
जो (जहां तक मैं बता सकता हूं) का उपयोग करता है http.get
इसलिए यह आवश्यक नहीं है, मुझे गलत होने पर सही करें!
EDIT 2: यहां कोड का एक वास्तविक, इन-उपयोग बिट है जो त्रुटियों का कारण बन रहा है। prodURL
और अन्य चर ज्यादातर jquery चयनकर्ता हैं जो पहले परिभाषित किए गए हैं। यह async
नोड के लिए पुस्तकालय का उपयोग करता है ।
function scrapeNexts(url, oncomplete) {
request(url, function (err, resp, body) {
if (err) {
console.log("Uh-oh, ScrapeNexts Error!: " + err + " using " + url);
errors.nexts.push(url);
}
async.series([
function (callback) {
$ = cheerio.load(body);
callback();
},
function (callback) {
$(prodURL).each(function () {
var theHref = $(this).attr('href');
urls.push(baseURL + theHref);
});
var next = $(next_select).first().attr('href');
oncomplete(next);
}
]);
});
}
request
सेवा का उपयोग कर रहा हूं , विशेष http.request
अनुरोध नहीं (मुझे लगता है, मैं नोड के लिए बहुत नया हूं!)। यह एक है: github.com/mikeal/request ऐसा लगता है कि यह अनुरोध को स्वचालित रूप से पूरा करता है, नहीं? संपादित करें: डॉक्स के अनुसार, http method, defaults to GET
इसलिए यह मुद्दा नहीं है।
cheerio.load
अतुल्यकालिक है। इससे पहले कि आप $ के साथ सामान करना शुरू न करें।
hang up
मतलब है ; पुराने जमाने के टेलीफोन को लटकाने से उत्पन्न हुआ।
end
टाइमआउट अवधि के भीतर कनेक्शन ईवेंट नहीं भेजता है । यदि आपकोhttp.request
(नहींhttp.get
) के माध्यम से चीयरियो के लिए अनुरोध मिल रहा है ।request.end()
अनुरोध भेजने के लिए आपको कॉल करना होगा।