Как узнать количество страниц, используя Puppeteer? - PullRequest
0 голосов
/ 14 ноября 2018

Я начинающий ползать, используя Кукольника. Мне удалось сканировать приведенный ниже сайт. Ниже приведен код для извлечения конкретного названия продукта из торгового центра.

const express = require('express');
const puppeteer = require('puppeteer');
const app = express();

(async () => {

    const width = 1600, height = 1040;

    const option = { headless: true, slowMo: true, args: [`--window-size=${width},${height}`] };

    const browser = await puppeteer.launch(option);
    const page = await browser.newPage();
    const vp = {width: width, height: height};
    await page.setViewport(vp);

    const navigationPromise = page.waitForNavigation();

    // 네이버 스토어팜
    await page.goto('https://shopping.naver.com/home/p/index.nhn');
    await navigationPromise;
    await page.waitFor(2000);

    const textBoxId = 'co_srh_input';
    await page.type('.' + textBoxId, '양말', {delay: 100});
    await page.keyboard.press('Enter');

    await page.waitFor(5000);
    await page.waitForSelector('ul.goods_list');
    await page.addScriptTag({url: 'https://code.jquery.com/jquery-3.2.1.min.js'});

    const result = await page.evaluate(() => {

        const data = [];

        $('ul.goods_list > li._itemSection').each(function () {

            const title = $.trim($(this).find('div.info > a.tit').text());
            const price = $(this).find('div.info > .price .num').text();
            const image = $(this).find('div.img_area img').attr('src');

            data.push({ title, price, image })

        });

        return data;

    });

    console.log(result);
    await browser.close();

})();

app.listen(3000, () => console.log("Express!!!"));

У меня есть вопрос. Если я хочу получить информацию с количества страниц, что мне делать? например (1 страница, 2 страницы, 3 страницы ....)

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Это сложный вопрос из-за того, сколько страниц по умолчанию отображается на этом сайте.Но потерпите меня: я покажу вам, чего вы можете достичь, по крайней мере, с этим.

Во-первых, предоставленный вами сайт отображает 10 страниц за раз под списком элементов, по которым вы можете циклически перемещаться.,Мне жаль говорить, что я не понимаю язык, на котором он написан, поэтому я не знаю, есть ли возможность где-нибудь отобразить больше страниц.Поэтому, когда вы вводите текст для поиска, он отображается следующим образом:

First ten pages listed

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

More pages added dynamically

Это значительно затрудняет поиск общего количества страниц, поскольку нет возможности «перейти» к самомуПоследняя страница (и впоследствии также нет возможности вернуться к самой первой).Позже я покажу вам другой пример сайта, который делает это.

В вашем случае я бы порекомендовал вам использовать некоторые простые математические методы, чтобы точно определить, сколько страниц будет отображаться в списке.Это будет слишком сложно, чтобы постоянно указывать puppeteer, например, «продолжать нажимать последний доступный номер страницы, пока не дойдете до конца» или что-то подобное.Но мы можем определить количество страниц, просто выполнив несколько простых шагов.

Во-первых, вам нужно получить общее количество элементов, возвращаемых в списке поиска через этот элемент:

Total number of results

Вы можете сделать это, выполнив следующий код:

const totalItems = await page.$eval('._productSet_total', (items) => {
  // Remove the characters before the total number, leaving only the number in isolation
  const child = items.querySelector('em');
  items.removeChild(child);

  // Now remove all commas from the total number
  let finalItems = items.textContent.trim();
  while(finalItems.indexOf(',') > -1) {
    finalItems = finalItems.replace(',', '').trim();
  }
  return finalItems;
});
console.log(totalItems); // Outputs 4337903 (or something similar)

Итак, теперь у вас есть это общее число.Следующий шаг - определить, сколько элементов будет отображаться на каждой странице.Вы можете сделать это, посчитав количество элементов, отображаемых на текущей странице, следующим образом:

const itemsPerPage = await page.$$eval('.goods_list li', (items) => {
  return items.length;
});
console.log(itemsPerPage); // Outputs 180 on my machine

Итак, теперь у вас есть общее количество найденных элементов и количество элементов, отображаемых на каждой странице.,Следующая часть - ваша простая математика, чтобы определить, сколько страниц потребуется, чтобы перечислить все эти элементы:

const pages = totalItems / itemsPerPage;
console.log(Math.ceil(pages));

И это все!Это был довольно сложный пример из-за плохого дизайна самого сайта (на самом деле он должен всегда иметь прямой путь к первой и / или последней страницам).

Например, если вы нажмете наpuppeteer тег в Stack Overflow (этот замечательный сайт), он приведет вас к: https://stackoverflow.com/questions/tagged/puppeteer

Теперь прокрутите вниз страницы, вы увидите что-то вроде этого:

enter image description here

Это идеально для определения количества страниц, перечисленных в одном простом шаге, следующим образом:

const lastPage = await page.$$eval('div[class*="pager"] > a > span[class*="page-numbers"]', (spans) => {
  return spans[spans.length - 2].textContent;
});
console.log(lastPage); // Outputs 78

Надеемсячто-то здесь поможет вам в учебном пути вашего кукловода!

0 голосов
/ 14 ноября 2018
  if (!this.browser) {
    this.browser = await puppeteer.launch(this.OPT)
    const pages: puppeteer.Page[] = await this.browser.pages()

    // close chromium by catching 'targetdestryed'
    this.browser.on('targetdestroyed', async () => {
      if (this.browser) {
        const pages: puppeteer.Page[] = await this.browser.pages()
        if (pages.length === 0) {
          process.exit(0)
        }
      }
    })
  }

Выше приведен код, который я написал в Typescript.Вы можете получить Array of Page (= Tab) из browser.pages() И у Puppeteer впервые будет 1 вкладка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...