Puppeteer js возвращает только заголовок html, а полный html можно увидеть в инструментах разработчика chrome - PullRequest
0 голосов
/ 05 ноября 2019

Я использую puppeteer js в моем приложении node js, чтобы удалить сайт с текстами песен, с URL-адресом, указывающим на результаты запроса (через URL-запрос), например:

https://shironet.mako.co.il/search?q=fire

В этом примере термин запроса - «огонь».

Проблема в том, что я считаю, что этот веб-сайт построен с использованием некоторой структуры spa, потому что независимо от того, как я пытаюсь получить HTML, я получаютолько заголовок, который заполнен некоторыми сжатыми функциями js, и пустое тело html.

Когда я проверяю страницу в моих devtools, я вижу обычный HTML.

Это код утилизации:

'use strict'
const pup = require('puppeteer'),
    cherrio = require('cheerio'),
    baseUrl = 'https://shironet.mako.co.il/search?q=';

async function findInitialData(songName){
    if(!songName){
        return 'no song name to scrap'
    }
    console.log(`start findInitialData with songName: ${songName}`)

    console.time('initial-scrap')
    pup.launch({
        headless: true
    }).then(
        async browser =>{
            let final = []
            const page = await browser.newPage()
            console.log(`there is a page`)

            await page.goto(`${baseUrl}/${songName}`),{waitUntil:'networkidle2'}
            await page.waitFor(10 * 1000);
            const html = await page.content()
            console.log(`html: `,html)

            const $ = cherrio.load(html)
            $('a.search_link_name_big').each((index,val)=>{
                console.log(`val: `,val)

                let text =  $(value).text().replace(/[\n\t]/gi, '')
                let link = $(value).attr('href')
                if(index%2==1){
                    obj = {}
                    obj["singer"]=text
                    final.push(obj)
                }
                else{
                    obj['link']= link
                    obj['song'] = text
                }
                console.log(`final: `,final)
                browser.close()
                setTimeout(() => {
                    console.timeEnd('initial-scrap')
                    return final
                }, 3000);

            })
        }
    )
} 

module.exports = {findInitialData}

когда я использую опцию headless: false, я вижу в devtools, что тело пустое (а заголовок заполнен теми же функциями) и страница вообще не загружается.

Вот некоторые ответы, которые я получаю, как без головы, так и без головы:

<html><head><meta charset="utf-8"><script>function i700(){}i700.F20=function (){return typeof i700.O20.p60==='function'?i700.O20.p60.apply(i700.O20,arguments):i700.O20.p60;};i700.X70=function (){return typeof i700.v70.p60==='function'?i700.v70.p60.apply(i700.v70,arguments):i700.v70.p60;};i700.Z20=function (){return typeof i700.O20.P20==='function'?i700.O20.P20.apply(i700.O20,arguments):i700.O20.P20;};i700.Q60=function (){return typeof i700.Y60.P20==='function'?
...
;winsocks();</script></head><body></body></html>

Некоторые HTML-коды, показанные в devtools:

    <tbody><tr>
        <td class="global_main_shadow" align="center">
            <table width="1020" cellspacing="0" cellpadding="0" border="0">
                <tbody><tr>
                    <td width="20" valign="top" align="left">

                <img src="/jsp/images/global_bg_right.gif" width="20" height="556"></td>
...


</tbody>

Что я делаюне так?

Потому что без какого-либо тела часть приветствияпроисходит сбой, и функция не работает.

Я видел некоторые ответы, исправляющие подобные проблемы здесь и в Google, но для них page.waitFor и добавление waitUntil networkidle2 решили это, но не для меня.

РЕДАКТИРОВАТЬ:

Я пытался отправить запросы на один и тот же URL, используя такие инструменты, как axios и бессонница, и они получили пустой ответ тела.

Когда я использовал почтальон, я получил правильныйHTML.

Что почтальон делает правильно, что другие инструменты делают неправильно?

Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 05 ноября 2019
const fetch = require("node-fetch");

(async () => {
  const url = "https://shironet.mako.co.il/search?q=fire";
  const result = await fetch(url);
  const response = await result.text();
  console.log(response);
})();

Это работало на моей машине.

enter image description here

enter image description here

...