• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

VPS serwer - problem z puppeteer-em

0 głosów
1,312 wizyt
pytanie zadane 3 listopada 2021 w JavaScript przez Maxxxii Obywatel (1,310 p.)
Cześć,
Aby używać puppeteera przy używaniu discord bot-a zakupiłem vps serwer. Zainstalowałem tam wszystkie potrzebne aplikacje i odpaliłem skrypt bota. Lecz puppeteer niezczytuje w ogóle treści strony. Brak jakiegokolwiek błędu. Co może być problemem?
1
komentarz 3 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)
Pokażesz kod Puppeteera? Może próbuje odpalić przeglądarkę z GUI, a takowej nie masz na VPS?
komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)

W dokumentacji puppeteera jest napisane z tego co patrzyłem, że uruchamia sie on domyślnie w trybie headless.

Kod:

const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto(`https://ils-frequency-lookup.com/${bigAirport}`);
        const content = await page.content();
        await browser.close();
        //console.log(content);
        const dom = new JSDOM(`${content}`);
        const nodeList = dom.window.document.querySelectorAll("div.runway");

całość oczywiście w funkcji asynchronicznej

komentarz 4 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)

Hmm, próbowałeś owinąć cały kod w try..catch? Używasz await, ale nigdzie nie łapiesz ewentualnych wyjątków, więc może w catch pokaże się jakiś błąd.

komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)
try, catch w asyncu czy poza? czy bez znaczenia?
komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)

spróbowałem obu sposobów, lecz rezultat był taki sam. Konsola wypisała: "odczytana" i później pustka.

Kod wygląda teraz tak:

//tu jest jeszcze if gdy wiadomość zaczyna się od !ils
console.log("odczytana")
try {
   (async () => {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto(`https://ils-frequency-lookup.com/${bigAirport}`);
        const content = await page.content();
        await browser.close();
        //console.log(content);
        const dom = new JSDOM(`${content}`);
        const nodeList = dom.window.document.querySelectorAll("div.runway");
   })();}
catch(error){
   console.error(error);
}

 

komentarz 4 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)

try..catch wewnątrz funkcji asynchronicznej

//tu jest jeszcze if gdy wiadomość zaczyna się od !ils
console.log("odczytana")

(async () => {
  try {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto(`https://ils-frequency-lookup.com/${bigAirport}`);
        const content = await page.content();
        await browser.close();
        //console.log(content);
        const dom = new JSDOM(`${content}`);
        const nodeList = dom.window.document.querySelectorAll("div.runway");
   } catch (error) {
       console.error('error:', error);
   }
})();

 

komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)
efekt jest taki sam jak w mojej poprzedniej wiadomości
komentarz 4 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)

A jak wstawisz console.log przed i po pierwszej linii w try, to logują się oba?

(async () => {
  try {
    console.log('0');
    const browser = await puppeteer.launch();
    console.log('1');

    // reszta kodu...
})();

Którą wersję Node masz zainstalowaną na tym VPS (możesz to sprawdzić komendą node -v)?

komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)
nie wypisuje się ani 0 ani 1. wersja node: 17.0.1. czy możliwym jest że serwer pomija kod w funkcji asynchronicznej? wszystkie komendy bez tej funkcji działają
komentarz 4 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)

Hmm, na końcu linii z console.log('odczytana') brakuje średnika, co może być przyczyną problemu, bo JS próbuje wywołać funkcję na wartości undefined (taką zwraca console.log), chociaż to powinno rzucać błędem... Dodaj średnik na końcu tej linii, albo przed funkcją asynchroniczną:

console.log("odczytana") // <-- tutaj średnik
 
/* albo tutaj średnik */ (async () => {

 

komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)
jakoś musiałem go usunąć wstawiając kod tutaj. w pliku na serwerze jest średnik
komentarz 4 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)

I, mimo obecności średnika, kod w funkcji asynchronicznej się nie wykonuje (nie ma logów 0 ani 1)?

Jesteś pewien, że na serwerze ta funkcja asynchroniczna ma na końcu nawiasy wywołujące - takie, jakie IIFE powinno mieć? 

komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)

pełny kod tej komendy:

else if(msg.content.startsWith(config.ils)){  
    console.log("odczytana");  
    const ilsInfo = [];
    const airport = msg.content.substr(config.rwy.length)
    const bigAirport = airport.toUpperCase();
    if(bigAirport.length != 4){
      msg.channel.send("Please type correct ICAO");
    }
    else{
      uzycia.caseCount++;
      fs.writeFileSync('./usesNumber.json', JSON.stringify(uzycia));
      
      (async () => {
        try{
        console.log("0");
        const browser = await puppeteer.launch();
        console.log("1");
        const page = await browser.newPage();
        await page.goto(`https://ils-frequency-lookup.com/${bigAirport}`);
        const content = await page.content();
        await browser.close();
        //console.log(content);
        const dom = new JSDOM(`${content}`);
        const nodeList = dom.window.document.querySelectorAll("div.runway");
        for(let i = 0; i < nodeList.length; i++){
          let info = nodeList[i];
          ilsInfo.push(info.textContent);
        }
        if(uzycia.caseCount % 10 == 0){
          const ilsSupportEmbed = new MessageEmbed()
            .setColor(config.embedColor)
            .setAuthor(config.embedAuthor)
            .setTitle(`${config.embedIlsTitle}${bigAirport}`)
            .setDescription(`**${ilsInfo.join(`\n`)}${config.embedSupportInfo}**`)
            .setFooter(config.embedFooter)
            msg.channel.send({embeds: [ilsSupportEmbed] })
        }
        else{
          const ilsEmbed = new MessageEmbed()
            .setColor(config.embedColor)
            .setAuthor(config.embedAuthor)
            .setTitle(`${config.embedIlsTitle}${bigAirport}`)
            .setDescription(`**Runways: \n${ilsInfo.join(`\n`)}**`)
            .setFooter(config.embedFooter)
          msg.channel.send({embeds: [ilsEmbed] })
        }
        
        console.log(nodeList.join);}
        catch(error){
          console.error("error:", error);
        }
        
      })();
      
    }

widok po wpisaniu komendy:

komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)
poprawka. wypisują się 0 i 1. zaimplementowałem plik ze złego miejsca na serwer
komentarz 4 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)

Wstaw jeszcze console.log do 12 linii (między fs.writeFileSync a funkcję async) - czy to się wykona?

poprawka. wypisują się 0 i 1. zaimplementowałem plik ze złego miejsca na serwer

Czyli problem rozwiązany?

komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)
niestety nie. puppeteer nadal nie zczytuje danych ze strony
komentarz 4 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)

A czy ta funkcja asynchroniczna w ogóle się uruchamia? Użyj debuggera lub wstaw console.log w każdej linii i sprawdź, co tam się dzieje; może w którymś momencie pojawia się np. jakaś pusta wartość?

komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)
 (async () => {
        console.log("0");
        try{
        console.log("1");
        const browser = await puppeteer.launch();
        console.log("2");
        const page = await browser.newPage();
        console.log("3");
        await page.goto(`https://ils-frequency-lookup.com/${bigAirport}`);
        console.log("4");
        const content = await page.content();
        console.log("5");
        await browser.close();
        console.log("6");
        console.log(content);
        console.log("7");
        const dom = new JSDOM(`${content}`);
        console.log("8");
        const nodeList = dom.window.document.querySelectorAll("div.runway");
        console.log("9");
        for(let i = 0; i < nodeList.length; i++){
          let info = nodeList[i];
          ilsInfo.push(info.textContent);
        }
        if(uzycia.caseCount % 10 == 0){
          const ilsSupportEmbed = new MessageEmbed()
            .setColor(config.embedColor)
            .setAuthor(config.embedAuthor)
            .setTitle(`${config.embedIlsTitle}${bigAirport}`)
            .setDescription(`**${ilsInfo.join(`\n`)}${config.embedSupportInfo}**`)
            .setFooter(config.embedFooter)
            msg.channel.send({embeds: [ilsSupportEmbed] })
        }
        else{
          const ilsEmbed = new MessageEmbed()
            .setColor(config.embedColor)
            .setAuthor(config.embedAuthor)
            .setTitle(`${config.embedIlsTitle}${bigAirport}`)
            .setDescription(`**Runways: \n${ilsInfo.join(`\n`)}**`)
            .setFooter(config.embedFooter)
          msg.channel.send({embeds: [ilsEmbed] })
        }
        
        //console.log(nodeList.join);
        }
        catch(error){
          console.error("error:", error);
        }
        
      })();

ku mojemu zdziwieniu wypisuje się 0,1,2. tak jakby "await browser.newPage()" powodowało wysypanie się skryptu

komentarz 4 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)

Na pewno nie loguje się błąd złapany w catch?

Spróbuj obsłużyć promis z browser.newPage() w ten sposób:

const page = await browser
  .newPage()
  .then(
     (p) => {
       console.log('p:', p);
       return p;
     },
     (e) => {
        console.error('e:', e);
        throw e;
     }
  )

 

komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)

jednak coś złapał 

ps. przepraszam że w formie screena ale chyba nie ma możliwości kopiowania treści konsoli

komentarz 4 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)

Czyli złapał timeout po 30 sekundach. Z tego co widzę na screenie, to pokazują się logi "0", "1", ale już nie "2", czyli przywiesiło się na puppeteer.launch() a nie na browser.newPage()? Może Puppeteer mieć problem z samym uruchomieniem przeglądarki - może kwestia uprawnień do uruchomienia przeglądarki na systemie zainstalowanym na VPS (jaki tam w ogóle jest system operacyjny i co to za VPS?)? W logu nie widać szczegółów tego błędu. Możesz ustawić większy timeout w opcjach.

komentarz 4 listopada 2021 przez Maxxxii Obywatel (1,310 p.)

przepraszam. kolejny raz zła wersja pliku była na serwerze. Wygląda to tak

 

jest to bez zaproponowanego promis do browser.newPage()

czy spróbować z zaproponowanym przez Ciebie promis?

edit: nie wystąpił też żaden time-out albo iny error

komentarz 4 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)

Czyli kod zatrzymuje się na browser.newPage()? Próbowałeś tego, o czym pisałem tutaj?

komentarz 5 listopada 2021 przez Maxxxii Obywatel (1,310 p.)
wykonałem to teraz. efekt taki sam: wypisanie 0,1,2 bez żadnego error-a
komentarz 5 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)
Czy możesz ten cały kod udostępnić np. na GitHub (usuń ewentualne dane wrażliwe), żeby można to było przetestować? I, czy ten sam problem pojawia się również, gdy uruchamiasz to lokalnie, czy to dzieje się tylko na VPS?
komentarz 5 listopada 2021 przez Maxxxii Obywatel (1,310 p.)
mogę go udostępnić, problem pojawia się tylko na VPS. jakbyś mógł podać mi swoją nazwę na github-ie, zrobiłbym prywatne repozytorium

edit: zanalazłem Twoją nazwę na profilu. już Cię dodałem
komentarz 5 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)
Link z zaproszeniem do repo zwraca błąd 404. Ale hmm, jeśli ten problem występuje tylko na VPS, to ja tego lokalnie nie sprawdzę. W ogóle, co to jest za VPS i z jakim systemem operacyjnym? Googlowałeś, czy ten problem z Puppeteerem może być znany na tym środowisku? Dziwi mnie, że kod na VPS nie rzuca błędem, a lokalnie występuje timeout.
komentarz 5 listopada 2021 przez Maxxxii Obywatel (1,310 p.)
VPS jeżeli chodzi o dystrybutora: nazwa.pl

jeżeli chodzi o wirtualizacje: KVM

system: ubuntu 20.04

mała poprawka: lokalnie działa bez żadnego błędu, timeout-a też nie ma

nic nie googlowałem, zaraz to zrobię

ps. spróbuję jeszcze raz wysłać zaproszenie do repo
komentarz 5 listopada 2021 przez ScriptyChris Mędrzec (190,170 p.)

mała poprawka: lokalnie działa bez żadnego błędu, timeout-a też nie ma

A jesteś pewien, że na VPS masz kod z try..catch plus obsługę promisa, o której pisałem tutaj i że na pewno w konsoli nie ma żadnych błędów?

komentarz 5 listopada 2021 przez Maxxxii Obywatel (1,310 p.)

kod świeżo pobrany z serwera:

else{
      uzycia.caseCount++;
      fs.writeFileSync('./usesNumber.json', JSON.stringify(uzycia));
      
      (async () => {
        console.log("0");
        try{
        console.log("1");
        const browser = await puppeteer.launch();
        console.log("2");
        const page = await browser
          .newPage()
          .then(
            (p) => {
              console.log('p:', p);
              return p;
            },
            (e) => {
               console.error('e:', e);
               throw e;
            }
         )
        console.log("3");
        await page.goto(`https://ils-frequency-lookup.com/${bigAirport}`);
        console.log("4");
        const content = await page.content();
        console.log("5");
        await browser.close();
        console.log("6");
        console.log(content);
        console.log("7");
        const dom = new JSDOM(`${content}`);
        console.log("8");
        const nodeList = dom.window.document.querySelectorAll("div.runway");
        console.log("9");
        for(let i = 0; i < nodeList.length; i++){
          let info = nodeList[i];
          ilsInfo.push(info.textContent);
        }
        if(uzycia.caseCount % 10 == 0){
          const ilsSupportEmbed = new MessageEmbed()
            .setColor(config.embedColor)
            .setAuthor(config.embedAuthor)
            .setTitle(`${config.embedIlsTitle}${bigAirport}`)                     
            .setDescription(`**${ilsInfo.join(`\n`)}${config.embedSupportInfo}**`)
            .setFooter(config.embedFooter)
            msg.channel.send({embeds: [ilsSupportEmbed] })
        }
        else{
          const ilsEmbed = new MessageEmbed()
            .setColor(config.embedColor)
            .setAuthor(config.embedAuthor)
            .setTitle(`${config.embedIlsTitle}${bigAirport}`)
            .setDescription(`**Runways: \n${ilsInfo.join(`\n`)}**`)
            .setFooter(config.embedFooter)
          msg.channel.send({embeds: [ilsEmbed] })
        }
        
        //console.log(nodeList.join);
        }
        catch(error){
          console.error("error:", error);
        }
        
      })();
      
    }

świeża odpowiedź z serwera:

odczytana
0
1
2

odczekałem około 5 min w razie wypadku timeouta, lecz nic takiego nie wystąpiło

w googlu znalazłem to:

https://github.com/puppeteer/puppeteer/issues/4039

i to:

https://stackoverflow.com/questions/68058458/puppeteer-newpage-freezes-never-resolves-nor-rejects-ubuntu-server

jeden nie rozwiązany, drugi niby rozwiązany ale ktoś napisał że nie pomogło. Chyba muszę spróbować podanych tam rozwiązań

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
1 odpowiedź 1,826 wizyt
pytanie zadane 25 października 2018 w Sieci komputerowe, internet przez niezalogowany
0 głosów
0 odpowiedzi 284 wizyt
pytanie zadane 22 sierpnia 2018 w Python przez kuba802802 Początkujący (380 p.)
0 głosów
0 odpowiedzi 199 wizyt
pytanie zadane 9 października 2021 w JavaScript przez Maxxxii Obywatel (1,310 p.)

93,775 zapytań

142,731 odpowiedzi

323,383 komentarzy

63,379 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...