Tôi đang xây dựng một trình quét web với Node và Cheerio và đối với một trang web nhất định tôi đang gặp phải lỗi sau (nó chỉ xảy ra trên một trang web này, không có trang nào khác mà tôi cố gắng cạo.
Nó xảy ra ở một vị trí khác nhau mỗi lần, vì vậy đôi khi nó url xgây ra lỗi, lần khác url xlà tốt và đó là một url hoàn toàn khác:
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)
Điều này rất khó để gỡ lỗi, tôi thực sự không biết bắt đầu từ đâu. Để bắt đầu, những gì LÀ một ổ cắm ngắt kết nối lỗi? Đó có phải là lỗi 404 hay tương tự không? Hay nó chỉ có nghĩa là máy chủ từ chối kết nối?
Tôi không thể tìm thấy một lời giải thích về điều này bất cứ nơi nào!
EDIT: Đây là một mẫu mã (đôi khi) trả về lỗi:
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
});
}
Không có cuộc gọi trực tiếp để đóng kết nối, nhưng tôi đang sử dụng Node Request(theo như tôi có thể nói) sử dụng http.getvì vậy điều này là không bắt buộc, hãy sửa tôi nếu tôi sai!
EDIT 2: Đây là một đoạn mã đang sử dụng thực tế đang gây ra lỗi. prodURLvà các biến khác chủ yếu là các bộ chọn jquery được xác định trước đó. Cái này sử dụng asyncthư viện cho Node.
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);
}
]);
});
}
requestdịch vụ nút , không phải là một http.requestyêu cầu cụ thể (tôi nghĩ, tôi rất mới với nút!). Đây là một: github.com/mikeal/request Điều này có vẻ như nó hoàn thành yêu cầu tự động, phải không? EDIT: Theo các tài liệu, http method, defaults to GETvì vậy đó không phải là vấn đề.
cheerio.loadkhông đồng bộ. Vì vậy, nó có thể không hoàn thành trước khi bạn bắt đầu làm công cụ với $.
hang up có nghĩa là kết thúc một cuộc trò chuyện điện tử bằng cách cắt kết nối ; bắt nguồn từ việc treo điện thoại kiểu cũ.
endsự kiện kết nối trong khoảng thời gian chờ. Nếu bạn nhận được yêu cầu cho cổ vũ thông quahttp.request(khônghttp.get). Bạn phải gọirequest.end()để hoàn thành việc gửi yêu cầu.