Вставьте новую пару значений ключа внутрь и массива объектов, но значение создается axios.get

Итак, я работал над скребком. Все было хорошо, пока я не попробовал очистить данные для отдельной ссылки.

А теперь поясню: у меня есть скребок, который собирает данные о квартирах. Теперь первый url — это страница, на которой расположены статьи (нужно получить примерно 29-30). Теперь на этой странице у меня нет информации о квадратных метрах, поэтому мне нужно запустить еще один парсер для каждой ссылки, которая была очищена, и очистить квадратные метры оттуда.

Вот код, который у меня есть:

const axios = require('axios');
const cheerio = require('cheerio');

const url = `https://www.olx.ba/pretraga?vrsta=samoprodaja&kategorija=23&sort_order=desc&kanton=9&sacijenom=sacijenom&stranica=2`;
axios.get(url).then((response) => {
  const articles = [];
  const $ = cheerio.load(response.data);

  $('div[id="rezultatipretrage"] > div')
    .not('div[class="listitem artikal obicniArtikal  i index"]')
    .not('div[class="obicniArtikal"]')
    .each((index, element) => {
      $('span[class="prekrizenacijena"]').remove();
      const getLink = $(element).find('div[class="naslov"] > a').attr('href');
      const getDescription = $(element)
        .find('div[class="naslov"] > a > p')
        .text();
      const getPrice = $(element)
        .find('div[class="datum"] > span')
        .text()
        .replace(/\.| ?KM$/g, '')
        .replace(' ', '');
      const getPicture = $(element)
        .find('div[class="slika"] > img')
        .attr('src');

      articles[index] = {
        id: getLink.substring(27, 35),
        link: getLink,
        description: getDescription,
        price: getPrice,
        picture: getPicture,
      };
    });

  articles.map((item, index) => {
    axios.get(item.link).then((response) => {
      const $ = cheerio.load(response.data);
      const sqa = $('div[class="df2  "]').first().text();
    });
  });

  console.log(articles);
});

Теперь первая часть кода нравится как должна, я борюсь со второй частью.

Теперь я отображаю articles, потому что там для каждой ссылки мне нужно загрузить ее в axios функцию и получить данные о квадратных метрах.

Таким образом, моим желаемым результатом были бы обновленные статьи: со старыми объектами и ключевыми значениями внутри, но с ключевым sqm и значением очищенных sqaure meter.

Есть идеи, как этого добиться? Спасибо!

См. также:  Функция Typescript, принимающая общий параметр и массив строк
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Community

    Вы можете просто добавить информацию о квадратных метрах к текущему _1 _ / _ 2_, примерно так:

    const articlePromises = Promise.all(articles.map((item) => {
                return axios.get(item.link).then((response) => {
                    const $ = cheerio.load(response.data);
                    const sqa = $('div[class="df2  "]').first().text();
                    item.sqm = sqa;
                });
            }));
    
    articlePromises.then(() => {
        console.log(articles);    
    });
    

    Обратите внимание, что вам нужно дождаться разрешения всех сопоставленных обещаний, прежде чем регистрировать полученные статьи. Также обратите внимание, что с помощью async/await вы можете переписать свой код, чтобы он был немного чище, см. https://javascript.info/async-await.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: