Как я могу добиться многократного соскоба страницы с топором ios и cheerio - PullRequest
1 голос
/ 31 января 2020

Здравствуйте, я использую топор ios с cheerio для очистки некоторых данных. Я хочу очистить несколько страниц, структура URL похожа на example.com/?page=1.Как я могу очистить каждую страницу со счетчиком?

axios({
    method: "get",
    url:
      "https://example.com/?page=",
    headers: {
      "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
    }
  }).then(res => {

1 Ответ

0 голосов
/ 14 февраля 2020

Я считаю, что есть несколько способов достижения этого решения, но в основном вам нужно выполнить все axios и проанализировать все из них с помощью Cheerio программно.

Если вы знаете, сколько страниц вы хотите очистить

Вы можете создать простые for l oop и pu sh все функции axios в массиве один за другим с созданными URL-адресами. Затем вы можете вызвать их с помощью Promise.all

const promises = [];

for(let page = 0; page <= 5; page ++){
     promises.push(
          axios({method: "get",url:`https://example.com?page=${page}`})
          .then(res => {
              // Parse your result with Cheerio or whatever you like
          })
     );
}

// You can pass the responses on this resolve if you want.
Promise.all(promises).then(...)

Если вы очищаете страницу списка, а общее число страниц неизвестно

Затем вы можете создать асинхронную / рекурсивную функцию для отправки запроса. с axios и условно повторять. Таким образом, вы также можете уменьшить максимальное использование памяти при сравнении с решением ниже. И это будет медленнее, потому что запросы не будут параллельными.

// The function below is kind-of pseudo code so don't try to copy/paste it :) 
const dispatchRequest = (page) => {
     const response = axios({url: `https://example.com?page=${page}`});
     // Ex: You can parse the response here with Cheerio and check if pagination is not disable
     if(something){
          return dispatchRequest(page+1);
     }
     else{
         return response;
     }

}

Решения, приведенные выше, конечно, имеют свои недостатки. Если вы заблокированы целевым веб-сайтом или ваш запрос не выполнен, у вас нет шансов повторить тот же запрос или повернуть прокси, чтобы обойти безопасность целевых веб-сайтов.

Я бы предложил вам внедрить queue и поместить все функции отправки запросов туда. Таким образом вы можете обнаруживать сбои / проблемы и снова ставить ошибочные запросы в очередь. Вы также можете реализовать оба вышеупомянутых решения с поддержкой queue. Вы можете запустить его параллельно и намного лучше управлять своей памятью / процессором.

Также вы можете использовать SDK. Я видел, что есть несколько чистящих SDK, которые предоставляют вам весь этот набор инструментов, так что вы не будете изобретать велосипед заново.

...