这就是我在代码中所做的
我正在阅读一个包含3500个链接的文本文件,然后阅读每个链接,过滤我想要的链接,并请求获取状态代码,链接和页面标题(使用cheerio)。在绕过第100或200个链接后,我得到“ connect ETIMEDOUT 40 ...:443”。链接看起来不错。这里发生了什么?是Web服务器让我以为它是DDOS吗?我正在为我工作的公司这样做,这显然不是目的。如果您想使用大量链接进行测试,我会使用https://hackertarget.com/extract-links/获取链接,然后将其放在文本文件中。
这是我的代码
var request = require('request');
var cheerio = require('cheerio');
var URL = require('url-parse');
var axios = require('axios');
const fs = require('fs');
const readline = require('readline');
var main = [];
var linkdata = [];
const rl = readline.createInterface({
input: fs.createReadStream('C:/Users/Jay/Documents/Javascript/crawl/links.txt'),
crlfDelay: Infinity
});
rl.on('line', (link) => {
if (link.startsWith('https://www.example.com')) {
var encodeLink = encodeURI(link)
request(encodeURI(encodeLink), function (error, response, body) {
console.log("Link: ",encodeLink)
if (error) {
console.log("Error:Request " + error);
}
// Check status code (200 is HTTP OK)
if (response.statusCode === 200) {
// Parse the document body
var $ = cheerio.load(body);
var Status_200 = {
"status Code": response.statusCode,
"Page title:": $('title').text(),
"Original Link": encodeLink,
}
main.push(Status_200)
}
if (response.statusCode === 302 || response.statusCode === 404 || response.statusCode === 500) {
// Parse the document body
var Status_Errors = {
"status Code": response.statusCode,
"Page title:": $('title').text(),
"Original Link": encodeLink,
}
main.push(Status_Errors)
}
//console.log(JSON.stringify(main))
fs.writeFile("C:/Users/Jay/Documents/Javascript/crawl/output.json", JSON.stringify(main), (err) => {
if (err) console.log(err);
console.log("Successfully Written to File.");
});
})
}
});
答案 0 :(得分:1)
请尝试一下,因为使用异步来查看是否有助于解决您遇到的内存错误,无论如何可能都是好的做法
try {
const body = response.data;
if (response.status === 200) {
//do ur thing
}
if (response.status === 302 || response.status === 404 || response.status === 500) {
// Parse the document body
//do ur thing
}
fs.writeFile("C:/Users/T440/Documents/crawl/output.json", JSON.stringify(main), (err) => {
if (err) console.log(err);
console.log("Successfully Written to File.");
});
} catch (error) {
//catch them erros
}
main.push(Status_ErrorsCatch)
答案 1 :(得分:0)
根据评论中的一些建议,我通过readline异步迭代器结构以及使用axios来实现更友好的承诺而减慢了该过程
这里是我如何解决ETIMEDOUT'ip address'问题的示例,我现在有内存问题,但是我认为原来的问题已解决
\r