Welcome to Сообщество игровых серверов NETZONA.ORG

Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям. Зарегистрировавшись и войдя в систему, вы сможете создавать темы, публиковать ответы в существующих темах, давать репутацию другим участникам, получать собственный личный мессенджер и многое другое. Это также быстро и совершенно бесплатно, так чего же вы ждете?
  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами Публичной оферты Проекта NetZONA.org: https://netzona.org/help/public-offer/

  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами использования Ваших файлов cookie на Проекте NetZONA.org: https://netzona.org/help/cookies/

  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с Политикой конфиденциальности Проекта NetZONA.org: https://netzona.org/pages/privacy-policy/

  • Ответы на основные вопросы: https://netzona.org/threads/populjarnye-voprosy-i-otvety-na-nix.6122/

  • Приветствуем на сайте, Гость! Приобрести (купить) Информационную услугу (в том числе группу "Проверенный") на Проекте NetZONA.org: https://netzona.org/account/upgrades

[Node.js] Парсинг любой страницы

KailHet

Модератор
Команда форума
Проверенный
Регистрация
5 Ноя 2019
Сообщения
728
Реакции
9
Баллы
52
Возраст
21
Веб-сайт
kailhet.github.io
Пол
Мужской
Семейное положение
Свободен(а) как ветер
Род занятий
Веб разработчик
Добрый вечер. Сегодня мне предоставилось страдать с заполнением 7-ми таблиц по 176 ссылок в каждой и заполнением необходимых данных. Поэтому я написал скрипт на парсинг ВК и делюсь им с Вами

Данный скрипт на node.js первый от меня на форуме, но в ближайшее время буду выкладывать и другие (в т.ч. старые, которые по-хорошему бы переписать😁)

Пример парсинга ВК (тк через fetch и axios не работает)
По факту можно парсить не только вк, сам модуль ******** (очень классный)

Описание скрипта:
  1. Создает ВИДИМЫЙ браузер
  2. Переходит по ссылкам из массива
  3. Делает скрин каждой страницы и сохраняет в папку data
  4. В конце вносит в csv (таблица, эксель) файлик первый абзац (заголовок) поста, название группы, которая выложила пост, ссылку на пост и просмотры (скрин надо вставлять отдельно, но мб можно сделать и через код, я не пробовал)
Плюсы модуля:
  1. Парсит все что угодно
  2. Видно браузер (не во всех модуллях есть)
  3. ***** настроек различных
  4. Можно выбрать браузер, через который будут открываться ссылки
Минусы:
  1. После 72-73 постов скрипт либо крашится, либо просто останавливается, из-за чего возникает хз, железо стоит нормальное
P.S. На странице модуля selenium-webdriver написано, что нужно, чтобы был запущен дополнительный веб драйвер, у меня все работает и без них
P.S.S у меня при открытии таблицы кодировка стоит неправильная (вместо русских символов ***** какая-то), это только после этого скрипта
Чтобы сделать нормальную кодировку, заходим в Данные -> Из текста -> Выбираем наш файлик -> Ставим галочку на С разделителем -> Далее -> Выбираем точка с запятой (в скрипте можно изменить в параметре delimiter) -> Готово -> Ставим галочку Новый лист -> Ок. Поздравляю, мы получили фулл автоматизированное заполнение таблицы
Описание переменных с парсинга:
(закомментированая) title - заголовок страницы
author - автор поста
views - просмотры поста
text - текст поста
title - первый абзац текста (заголовок) (изменено)


JavaScript:
const fs = require('fs')
const {Builder, Browser, By} = require('selenium-webdriver');
const {stringify} = require('csv-stringify')

const urls = ["http://vk.com/wall-188348290_5510", "http://vk.com/wall-194912760_3552", "http://vk.com/wall-216841951_948"]

async function selenium() {
    (async function example() {
    let driver = await new Builder().forBrowser(Browser.FIREFOX).build();
    let url = ''

    const columns = {
        id: '№ п/п',
        name: 'Заголовок',
        author: 'Наименование паблика в социальной сети ВКонтакте',
        url: 'Ссылка на опубликованный материал',
        screenshot: 'Скриншот опубликованного материала',
        views: 'Охват аудитории'
    }

    let data = []
    console.log(urls.length)
    try {
        for (let i = 0; i < urls.length; i++) {
            url = urls[i]
            await driver.get(url);
            // let title = await driver.getTitle();
            let author = await driver.findElement(By.className('PostHeaderTitle__authorName')).getText()
            let views = await driver.findElement(By.className('_views')).getText()
            let text = await driver.findElement(By.className('wall_post_text')).getText()
            let title = text.split('\n')[0]
            console.log(i+1, author, views, title)
            const screenshot = await driver.takeScreenshot().then(function(data){
                var base64Data = data.replace(/^data:image\/png;base64,/,"")
                fs.writeFile('./data/' + i + '.png', base64Data, 'base64', function(err) {
                    if(err) console.log(err);
                });
            });

            data.push([i+1, title, author, url, '.', views])

        }

        stringify(data, {header: true, columns: columns, delimiter: ';'}, (err, output) => {
            if (err) throw err;
            fs.writeFile('./data/1.csv', output, 'utf-8', (err) => {
                if (err) throw err;
                console.log('saved')
            })
        })

    } finally {
        await driver.quit();
    }
    })();
}
selenium()


В комментариях также можете предлагать идеи скриптов
Также можете заказать у меня скрипты, которые я сделаю в кратчайшее время за доступную цену
 
Назад
Сверху Снизу