Запрос js узла Получение ETIMEDOUT 'ip address' - PullRequest
0 голосов
/ 30 июня 2019

Это то, что я делаю в коде

Я читаю текстовый файл с 3500 ссылками, затем читаю каждую ссылку, фильтрую нужную и выполняю запрос, чтобы получить код состояния, ссылку и заголовок страницы (используя cheerio). после зацикливания 100-й или 200-й ссылки я получаю «подключить ETIMEDOUT 40 ...: 443». ссылки выглядят хорошо. Что тут происходит? веб-сервер выводит меня из себя, думая, что это 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.");
      });
    })
  }
});

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Поместите попытку с тех пор, как вы используете async, чтобы увидеть, помогает ли это с ошибкой памяти, которую вы получаете, вероятно, хорошая практика в любом случае

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)
0 голосов
/ 01 июля 2019

С некоторыми предложениями из комментариев я замедлил процесс с помощью асинхронной структуры readline, а также с помощью axios для большей поддержки обещаний

Вот пример того, как я исправил проблему «IP-адреса» ETIMEDOUT, сейчас у меня проблема с памятью, но первоначальная проблема решена, я думаю

async function processLineByLine() {
  const rl = readline.createInterface({
    input: fs.createReadStream('C:/Users/T440/Documents/crawl/links.txt'),
    crlfDelay: Infinity
  });

  for await (const line of rl) {
    if (line.startsWith('https://www.example.com')) {
      var encodeLink = encodeURI(line);
    
      const response =  await axios.get(encodeLink).catch((err)=>{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...