Как использовать цикл для запроса URL, очистки данных, получения нового URL с этой страницы и перехода на следующую страницу X раз - PullRequest
0 голосов
/ 06 мая 2019

Я ищу:

  1. Открыть известный URL (www.source.com/1 below)
  2. очистить все URL на этой странице (e.g. www.urllookingfor.com/1 to .../10) и войти в консоль
  3. очиститьновый URL (e.g. www.source.com/2) с этой страницы
  4. загрузите следующую страницу и повторите процесс X количество раз

Представьте себе список из 50 дивидендов URL-адресов на 5 страницах, где вам нужнонажмите кнопку next, чтобы перейти на страницу.

Первые два шага работают нормально, но я думаю, что проблема в том, что nextLink не обновляется до повторного запуска цикла.По сути, происходит то, что четвертый шаг повторяется с исходным URL, а не с «новым» URL.Вышеуказанные шаги выполняются в цикле if.

Я пытался использовать setTimeout, async ... await, так как я думаю, что проблема в том, что у него нет времени для загрузки 'Новый URL до завершения следующей функции, но это не сработало.

Если я добавлю console.log(URL) в функцию if, будет напечатан исходный URL.Но когда я добавляю console.log вне цикла if, он печатает обновленный URL, что заставляет меня думать, что nextLink не обновляется до окончания цикла if.

Я также пытался повторять функции снова и снова (по сути, повторяющийся оператор if), но это также, по-видимому, не обновляет «nextLink» до запуска следующей функции, что противоречит вышеприведенному.

let nextLink = www.source.com/1

//this pulls source page and scrapes required URLs
const getDatafromPage = () => {
    request(nextLink, (error, response, html) => {
        if((!error) && (response.statusCode == 200)) 
        {
            let $ = cheerio.load(html);

            $('.class1').each((i, el) => {
                let link = $(el).find('.class2').attr('href');
                console.log(`${link});
            })
        }
    })
}

//this gets the next URL
const getNextLink = () => {
    request(nextLink, (error, response, html) => {
        if((!error) && (response.statusCode == 200)) 
        {        
            let $ = cheerio.load(html);
            nextLink = $('.class3').attr('href');
        }
    })
}

for (let i = 0; i <= 4; i++) {
    getDatafromPage();

    getNextLink();
}

console.log(nextLink)

Ожидаемые результаты (все 50 URL-адресов со страниц и заканчиваются регистрацией последнего исходного URL-адреса)

 www.urllookingfor.com/1
 ...
 www.urllookingfor.com/50
 www.source.com/5

Фактические результаты (повторяет первую страницу, но затем регистрирует следующую страницу в конце):

 www.urllookingfor.com/1
 ...
 www.urllookingfor.com/10
 www.urllookingfor.com/1
 ...
 www.urllookingfor.com/10
 www.source.com/2

1 Ответ

0 голосов
/ 07 мая 2019

Вот более или менее то, на что это могло бы быть похоже, когда я делаю это:

const doPage = async ($) => {
  // do stuff here
}

;(async function(){
  let response = await request(url)
  let $ = cheerio.load(response)
  await doPage($)
  let a
  // keep following next links
  while(a = $('[rel=next]')[0]){
    url = new URL($(a).attr('href'), url).href 
    response = await request(url)
    $ = cheerio.load(response)
    await doPage($)
  }
})()
...