【问题标题】:Why is my array overwriting instead of making it one array with objects inside?为什么我的数组被覆盖而不是使其成为一个包含对象的数组?
【发布时间】:2021-05-18 10:53:44
【问题描述】:

我一直在研究爬虫功能。

现在从这个组件获取数据:

const cheerio = require('cheerio');
const axios = require('axios');
const parsing = require('./parseData');

exports.olxScraper = () => {
  const url =
    'https://www.olx.ba/pretraga?vrsta=samoprodaja&kategorija=23&sort_order=desc&kanton=9&sacijenom=sacijenom&stranica=1';

  const getRawData = async () => {
    try {
      await axios.get(url).then((res) => {
        const $ = cheerio.load(res.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');
            parsing.parseData(getLink, getDescription, getPrice, getPicture);
          });
      });
    } catch (error) {
      console.log(error);
    }
  };
  getRawData();
};

exports.santScraper = () => {
  const url = `https://www.sant.ba/pretraga/prodaja-1/tip-2/cijena_min-20000/stranica-1`;

  const getRawData = async () => {
    try {
      await axios.get(url).then((response) => {
        const $ = cheerio.load(response.data);

        $('div[class="col-xxs-12 col-xss-6 col-xs-6 col-sm-6 col-lg-4"]').each(
          (index, element) => {
            const getLink = $(element).find('a[class="re-image"]').attr('href');
            const getDescription = $(element).find('a[class="title"]').text();
            const getPrice = $(element)
              .find('div[class="prices"] > h3[class="price"]')
              .text()
              .replace(/\.| ?KM$/g, '')
              .replace(',', '.');
            const getPicture = $(element).find('img').attr('data-original');
            
            parsing.parseData(getLink, getDescription, getPrice, getPicture);
          }
        );
      });
    } catch (error) {
      console.log(console.log(error));
    }
  };
  getRawData();
};

this.olxScraper();
this.santScraper();

如此抓取后发送到 parseData 组件,如下所示:

exports.parseData = (getLink, getDescription, getPrice, getPicture) => {
  const apartments = [];
  let apartment = {
    link: getLink,
    descr: getDescription,
    price: getPrice,
    picture: getPicture,
  };
  apartments.push(apartment);
  console.log(apartments);
};

输出是这样的:

[
  {
    link: 'https://www.sant.ba/nekretnine/nekretnina-3467-dvosoban-stan-sa-liftom-u-samom-centru-grada-63-m2',
    descr: ' dvosoban stan sa liftom u samom centru grada , 63 m2 ',
    price: '199000.00',
    picture: 'https://www.sant.ba/thumb.php?file=photos/3467/3467_1_1563271355.jpg&maxw=273&maxh=205'
  }
]
[
  {
    link: 'https://www.sant.ba/nekretnine/nekretnina-3689-troiposoban-stan-u-naselju-sunca',
    descr: ' Troiposoban stan u naselju Sunca ',
    price: '360000.00',
    picture: 'https://www.sant.ba/thumb.php?file=photos/3689/3689_1_1612344465.jpg&maxw=273&maxh=205'
  }
]
[
  {
    link: 'https://www.sant.ba/nekretnine/nekretnina-3677-trosoban-renoviran-stan-u-naselju-dolac-malta-73-m2',
    descr: ' trosoban, renoviran stan u naselju Dolac malta, 73 m2 ',
    price: '150000.00',
    picture: 'https://www.sant.ba/thumb.php?file=photos/3677/3677_1_1608550332.jpg&maxw=273&maxh=205'
  }
]
[
  {
    link: 'https://www.sant.ba/nekretnine/nekretnina-3537-cetverosoban-stan-u-novogradnji-sa-prelijepim-pogledom-na-grad-118-38-m2',
    descr: ' Četverosoban stan u novogradnji sa prelijepim pogledom na grad, 118,38 m2 ',
    price: '538090.37',
    picture: 'https://www.sant.ba/thumb.php?file=photos/3537/3537_1_1573217155.jpg&maxw=273&maxh=205'
  }
]
[
  {
    link: 'https://www.sant.ba/nekretnine/nekretnina-3536-trosoban-stan-u-novogradnji-sa-prelijepim-pogledom-na-grad-105-34-m2',
    descr: ' Trosoban stan u novogradnji sa prelijepim pogledom na grad, 105,34 m2 ',
    price: '478817.70',
    picture: 'https://www.sant.ba/thumb.php?file=photos/3536/3536_2_1573216638.jpg&maxw=273&maxh=205'
  }
]
[
  {
    link: 'https://www.sant.ba/nekretnine/nekretnina-3535-luksuzni-cetverosoban-stan-na-cobaniji-117-43m2',
    descr: ' Luksuzni četverosoban stan na Čobaniji,117,43m2 ',
    price: '533772.19',
    picture: 'https://www.sant.ba/thumb.php?file=photos/3535/3535_13_1573215220.jpg&maxw=273&maxh=205'
  }
]
[
  {
    link: 'https://www.sant.ba/nekretnine/nekretnina-3534-trosoban-stan-u-novogradnji-90-m2',
    descr: ' trosoban stan u novogradnji, 90 m2 ',
    price: '376923.46',
    picture: 'https://www.sant.ba/thumb.php?file=photos/3534/3534_8_1573214216.jpg&maxw=273&maxh=205'
  }
]
[
  {
    link: 'https://www.sant.ba/nekretnine/nekretnina-3524-dvosoban-stan-u-naselju-bjelave-55-m2',
    descr: ' dvosoban stan u naselju Bjelave ,55 m2 ',
    price: '150000.00',
    picture: 'https://www.sant.ba/thumb.php?file=photos/3524/3524_1_1571224667.jpg&maxw=273&maxh=205'
  }
]
[
  {
    link: 'https://www.sant.ba/nekretnine/nekretnina-3665-novogradnja-dvosoban-stan-skenderija-72-66-m2',
    descr: ' novogradnja, dvosoban stan,Skenderija, 72,66 m2 ',
    price: '290640.00',
    picture: 'https://www.sant.ba/thumb.php?file=photos/3665/3665_1_1606393537.jpg&maxw=273&maxh=205'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/40528561/my-space-stan-stari-grad-renoviran-namjesten-50m2/',
    descr: 'MY SPACE/ Stan/ Stari Grad/ RENOVIRAN/ NAMJESTEN/ 50m2',
    price: '195000',
    picture: 'https://s9.pik.ba/galerija/2020-11/14/12/slika-1070163-5fafc62c13a67-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/39513168/cetverosoban-stan-u-novogradnji-malta-complex/',
    descr: 'Četverosoban stan u novogradnji "Malta Complex"',
    price: '166354',
    picture: 'https://s9.pik.ba/galerija/2020-08/25/12/slika-2044886-5f44e95ad18a8-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41817042/my-space-stan-cengic-vila-gradacacka-48-m2/',
    descr: 'MY SPACE/ Stan/ Cengic Vila/ Gradacacka/ 48 m2',
    price: '120000',
    picture: 'https://s9.pik.ba/galerija/2021-02/15/02/slika-1070163-602a78b066043-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41816059/adaptiran-trosoban-stan-2-sprat-dolac-malta-socijalno/',
    descr: 'Adaptiran trosoban stan / 2. sprat / Dolac Malta / Socijalno',
    price: '139000',
    picture: 'https://s9.pik.ba/galerija/2021-02/15/01/slika-1424529-602a69c8c218f-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41042243/renovirana-garsonjera-na-skenderiji-prodaja/',
    descr: 'Renovirana garsonjera na Skenderiji, prodaja!',
    price: '110000',
    picture: 'https://s9.pik.ba/galerija/2020-12/22/09/slika-115390-5fe1aee8796d0-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/34234631/cetverosoban-stan-3b-novogradnja-vrtovi-riverine-ilidza/',
    descr: 'Četverosoban stan-3B-NOVOGRADNJA/VRTOVI RIVERINE/ILIDŽA',
    price: '156692',
    picture: 'https://s9.pik.ba/galerija/2021-01/27/01/slika-1269653-6011595b4e941-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41776858/my-space-stan-dolac-malta-paromlinska-55-m2/',
    descr: 'MY SPACE/ Stan/ Dolac malta/ Paromlinska/ 55 m2',
    price: '139000',
    picture: 'https://s9.pik.ba/galerija/2021-02/12/03/slika-1070163-602697ad1561f-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/40854733/prostor-prodaje-dvosoban-stan-alipasino-polje/',
    descr: 'PROSTOR prodaje: Dvosoban stan, Alipašino Polje',
    price: '104500',
    picture: 'https://s9.pik.ba/galerija/2020-12/08/05/slika-48261-5fcfaf984084d-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/39192105/stan-102-m2-dva-balkona-sa-kuhinjom-stup/',
    descr: 'Stan 102 m2 Dva balkona, sa kuhinjom Stup',
    price: '230000',
    picture: 'https://s5.pik.ba/galerija/2019-06/11/11/slika-925242-5cff6dd8594b0-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41136078/prostor-prodaje-dvosoban-stan-blizu-bascarsije/',
    descr: 'PROSTOR prodaje: Dvosoban stan blizu Baščaršije',
    price: '153000',
    picture: 'https://s9.pik.ba/galerija/2020-12/29/03/slika-48261-5feb3ec26181a-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/40102853/my-space-lux-stan-hrasno-bosmal-155-m2/',
    descr: 'MY SPACE/ LUX Stan/ Hrasno/ Bosmal/ 155 m2',
    price: '619000',
    picture: 'https://s9.pik.ba/galerija/2020-10/12/03/slika-1070163-5f8460248bc5a-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41712867/my-space-stan-centar-mejtas-buka-95-m2/',
    descr: 'MY SPACE/ Stan/ Centar/ MEJTAS/ Buka/ 95 m2',
    price: '300000',
    picture: 'https://s9.pik.ba/galerija/2021-02/08/01/slika-1070163-60213553ae220-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/32083654/prodaja-stanova-novogradnja-vrtovi-riverine-ilidza/',
    descr: 'PRODAJA STANOVA-NOVOGRADNJA/VRTOVI RIVERINE/ILIDŽA',
    price: '75284',
    picture: 'https://s9.pik.ba/galerija/2020-08/26/11/slika-1269653-5f4627de84c78-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/34059753/cetverosoban-stan-3a-novogradnja-vrtovi-riverine-ilidza/',
    descr: 'Četverosoban stan-3A-NOVOGRADNJA/VRTOVI RIVERINE/ILIDŽA',
    price: '162776',
    picture: 'https://s9.pik.ba/galerija/2020-08/26/11/slika-1269653-5f4626b70c55d-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/40667077/stan-sarajevo-stari-grad-bistrik-detaljni-opis/',
    descr: 'Stan Sarajevo - Stari Grad - Bistrik Detaljni opis',
    price: '207000',
    picture: 'https://s5.pik.ba/galerija/2019-08/13/07/slika-295630-5d52fa9a44bda-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41815741/my-space-stan-ilidza-grand-centar-54m2/',
    descr: 'MY SPACE/ Stan/ Ilidza/ Grand centar/ 54m2',
    price: '135000',
    picture: 'https://s9.pik.ba/galerija/2021-02/15/01/slika-1070163-602a65e1dde3a-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/40980442/prodaje-se-dvosoban-stan-kosevo/',
    descr: 'PRODAJE SE dvosoban stan- Koševo',
    price: '230000',
    picture: 'https://s9.pik.ba/galerija/2020-12/17/03/slika-154243-5fdb6eaea9094-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/34878314/prodaje-se-stan-na-stupu-ul-pijacna/',
    descr: 'PRODAJE SE stan na Stupu -ul. Pijačna',
    price: '92000',
    picture: 'https://s5.pik.ba/galerija/2019-08/19/04/slika-154243-5d5ab3f0bf95e-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41676279/on-time-prodaje-marijin-dvor-stan-86-m2/',
    descr: 'ON TIME prodaje: Marijin Dvor, Stan, 86 m2',
    price: '387000',
    picture: 'https://s9.pik.ba/galerija/2021-02/05/09/slika-2438228-601daa8830fb3-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/40870310/prostor-prodaje-garsonjera-30m2-tibra-nedzarici/',
    descr: 'PROSTOR prodaje: Garsonjera 30m2, Tibra Nedžarići',
    price: '64500',
    picture: 'https://s9.pik.ba/galerija/2020-12/09/06/slika-48261-5fd10627a5706-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41516526/prostor-prodaje-dvoetazni-stan-aerodromsko-naselje/',
    descr: 'PROSTOR prodaje: Dvoetažni stan, Aerodromsko naselje',
    price: '195000',
    picture: 'https://s9.pik.ba/galerija/2021-01/26/05/slika-48261-601044ea62fb1-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/38022587/dvosoban-stan-stup-tibra-49-m2/',
    descr: 'Dvosoban stan Stup Tibra 49 m2',
    price: '97000',
    picture: 'https://s5.pik.ba/galerija/2020-05/06/02/slika-1718896-5eb2b0e7d94e4-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41733041/trosoban-stan-nova-otoka-novogradnja-60m/',
    descr: 'Trosoban stan Nova Otoka/Novogradnja/60m²',
    price: '175000',
    picture: 'https://s9.pik.ba/galerija/2021-02/09/06/slika-1718896-6022bfc8254f1-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41714425/dvosoban-namjesten-stan-otoka-miljacka-novogradnja/',
    descr: 'Dvosoban namjesten stan Otoka/Miljacka/ Novogradnja',
    price: '142000',
    picture: 'https://s5.pik.ba/galerija/2020-05/09/04/slika-1718896-5eb6bcb7f0397-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41732985/trosoban-stan-nova-otoka-novogradnja-74m/',
    descr: 'Trosoban stan Nova Otoka/Novogradnja/ 74m²',
    price: '218000',
    picture: 'https://s9.pik.ba/galerija/2021-02/09/06/slika-1718896-6022c1db4b5f9-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41440791/prostor-prodajetrosoban-stan-sa-balkonom-i-lodjom-stup/',
    descr: 'PROSTOR prodaje:Trosoban stan sa balkonom i lođom, Stup',
    price: '126500',
    picture: 'https://s9.pik.ba/galerija/2021-01/21/04/slika-48261-6009983ee116c-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/40039060/novogradnja-buca-potok-dvosoban-stan-47-60m2popust-3/',
    descr: 'NOVOGRADNJA BUĆA POTOK! Dvosoban stan 47,60m2!Popust 3%',
    price: '119000',
    picture: 'https://s9.pik.ba/galerija/2020-10/22/05/slika-48261-5f91a08c623ce-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/41449900/novogradnja-stup-funkcionalan-trosoban-stan-48m2/',
    descr: 'NOVOGRADNJA Stup: Funkcionalan trosoban stan, 48m2',
    price: '103849',
    picture: 'https://s9.pik.ba/galerija/2021-01/22/10/slika-48261-600a9b8c3b3f1-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/39714781/novogradnja-buca-potok-dvosoban-stan-62-35-m2/',
    descr: 'NOVOGRADNJA BUĆA POTOK! Dvosoban stan 62,35 m2!',
    price: '149546',
    picture: 'https://s9.pik.ba/galerija/2020-10/22/05/slika-48261-5f91ab463dc5e-thumb.jpg'
  }
]
[
  {
    link: 'https://www.olx.ba/artikal/40743429/novogradnja-stup-komforan-dvosoban-stan-56m2-sarajevo/',
    descr: 'NOVOGRADNJA Stup: Komforan dvosoban stan 56m2, Sarajevo',
    price: '124051',
    picture: 'https://s9.pik.ba/galerija/2020-11/30/05/slika-48261-5fc51924c75f9-thumb.jpg'
  }
]

现在这不是我预期的输出。我期望对象数组不是带有单个对象的数组,并且数组会不断地重写自己。

如何使它成为一个包含对象的数组?还有为什么会这样?谢谢!

编辑 这是我在一个答案的帮助下设法做到的: parseData 组件

const apartments = [];
exports.parseData = (getLink, getDescription, getPrice, getPicture) => {
  let apartment = {
    link: getLink,
    descr: getDescription,
    price: getPrice,
    picture: getPicture,
  };
  apartments.push(apartment);
  console.log(apartments.length);
};

现在长度输出是这样的:1 2 3 4 5 etc. LastOne 我希望长度只是数组长度的最后一个数字。所以再次,它正在重写数组,直到最后一个对象被推入数组。

【问题讨论】:

  • 看起来const apartments = []; 将在每次调用时重新定义apartments

标签: javascript node.js arrays object


【解决方案1】:

这里的问题是,当您调用此方法 'parseData()' 时,会创建新的 "apartments" 数组,并且您将每次推入数组中在创建新数组时调用函数,因此您没有得到对象数组。

解决方案: 如果你想要对象数组,你必须在“parseData()”中声明你的数组。

你也可以这样做。

公寓.push({ 链接:getLink, 描述:获取描述, 价格:获取价格, 图片:获取图片, });

【讨论】:

  • 是的,这行得通 - 有点。我已将 const apartments=[] 移到 parseData 组件之外。现在如果我console.log(apartments),在parseData之外,我得到[]。在 parseData console.log(apartments.length) 我得到 1 2 3 4 5 ......最后一个。我期望 aparatments 的长度只是最后一个数字。 (它仍然在覆盖自己)
  • 在哪里打印 console.log(apartments)?我的意思是在哪个文件中?
  • 在解析数据中。我马上更新代码
  • 还是一样的输出。
  • 当你在 parseData() "console.log(apartments)" 之外写下这一行时你会得到什么输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2017-03-24
  • 2021-07-16
  • 2013-01-31
相关资源
最近更新 更多