Я использую 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.
Что почтальон делает правильно, что другие инструменты делают неправильно?
Буду признателен за любую помощь!