আমি নোড এবং চেরিওর সাথে একটি ওয়েব স্ক্র্যাপার তৈরি করছি এবং একটি নির্দিষ্ট ওয়েবসাইটের জন্য আমি নিম্নলিখিত ত্রুটিটি পাচ্ছি (এটি কেবলমাত্র এই একটি ওয়েবসাইটে ঘটে থাকে, অন্য কেউ যাতে আমি স্ক্র্যাপ করার চেষ্টা করি না।
এটি প্রতিবার ভিন্ন স্থানে ঘটে থাকে, তাই কখনও কখনও এটি 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)
এটি ডিবাগ করা খুব জটিল, আমি জানি না কোথা থেকে শুরু করব। আরম্ভ করার জন্য, কি IS একটি সকেট ত্রুটি লটকান? এটি কি 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তাই এটির প্রয়োজন নেই, আমি ভুল হলে আমাকে সংশোধন করুন!
সম্পাদনা 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অ্যাসিক্রোনাস। সুতরাং আপনি with দিয়ে স্টাফ করা শুরু করার আগে এটি শেষ নাও হতে পারে $
hang upঅর্থ সংযোগ কেটে একটি বৈদ্যুতিন কথোপকথন শেষ করা ; পুরানো ফ্যাশন টেলিফোন হ্যাং থেকে উদ্ভূত।
endসময়সীমার মধ্যে সংযোগ ইভেন্ট প্রেরণ করে না । যদি আপনি চিরিওর জন্য অনুরোধটি পেয়ে থাকেনhttp.request(নাhttp.get)।request.end()অনুরোধ পাঠানো শেষ করতে আপনাকে কল করতে হবে।