1. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!
    Скрыть объявление

Парсер JS::TextFromSE 2.0

Парсинг текстовки по ключу одним заданием

  1. Support

    Support Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    16 мар 2012
    Сообщения:
    4.545
    Симпатии:
    2.163
    Пользователь Support разместил новый ресурс:

    JS::TextFromSE - Парсинг текстовки по ключу одним заданием

    Узнать больше об этом ресурсе...
     
    Vvtex нравится это.
  2. Support

    Support Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    16 мар 2012
    Сообщения:
    4.545
    Симпатии:
    2.163
    [​IMG]
    Код парсера
    • Данный парсер - это пример обьединения парсера поисковой выдачи и парсера текста в одном
    • Есть возможность выбрать ПС: Google или Яндекс
    • Для выбранной ПС и парсера текста можно задать собственные пресеты настроек. Тем самым можно регулировать кол-во ссылок, по которым будет парситься текст, а также настроить парсер текста (задать минимальный размер блока, юзер агент и т.п.) Пример такой настройки:
      [​IMG]
    • В результат выводится ключ, ссылка и текст. Текст никак дополнительно не чистится, можно использовать Конструктор результатов как в обычном парсере текста
    • Алгоритм работы:
      • По ключу из выбранного поисковика парсятся ссылки
      • Полученные ссылки передаются в HTML::TextExtractor для получения текста
      • С помощью this.query.add ссылки распределяются по потоках, для равномерной нагрузки
     
  3. EceninPars

    EceninPars A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    14 янв 2013
    Сообщения:
    67
    Симпатии:
    14
    У Вас в примере в Override option показан HTML TextExtractorPreset как я понял для очистки текста. Но реально его нет возможности добавить, т.к. его нет в списке. Пожалуйста добавьте в примере готовый парсер с фильтрами очистки как в примере.
     
  4. Support

    Support Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    16 мар 2012
    Сообщения:
    4.545
    Симпатии:
    2.163
    Forbidden нравится это.
  5. Support

    Support Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    16 мар 2012
    Сообщения:
    4.545
    Симпатии:
    2.163
    Пользователь Support обновил ресурс JS::TextFromSE новой записью:

    Обновление 1.2

    Узнать больше об этом обновлении...
     
  6. Babloman

    Babloman A-Parser Pro License
    A-Parser Pro

    Регистрация:
    19 июн 2015
    Сообщения:
    11
    Симпатии:
    3
    Здравствуйте
    Как в таком случае можно чистить текст?

    Т.к. если просто парсить по ссылкам, можно сделать parser result и удалять ненужное.
    В данном же случае софт тянет и менюшки и даты и прочий мусор со страницы

    Спасибо
     
  7. Support Денис

    Support Денис A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    12 июн 2017
    Сообщения:
    586
    Симпатии:
    185
    Здравствуйте.
    Для очистки текста вы можете использовать конструктор результатов. И соответственно с его помощью очищать текст.
    Более подробно о конструкторе результатов вы можете почитать по ссылке
     
  8. Newsoros

    Newsoros A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    16 мар 2017
    Сообщения:
    13
    Симпатии:
    1
    Добрый день подскажите как в этом парсере из текста (text) выбрать предложения длинной больше 50 символов, обработка результата text конструктором результатов приводит к тому что парсер закрывается с ошибкой. Обработку делал по примеру https://a-parser.com/resources/191/ Пришел к выводу что нужно добавить это в сам парсер, регулярка ([^.!?]{50,}(?:[.!?]))
    Код:
    *parseText(set, results) {
            this.logger.put("Scraping text from " + set.query);
            let response = yield this.parser.request('HTML::TextExtractor', this.conf.HTML_TextExtractor_preset, set.query);
            results.key = set.first;
            results.link = set.query;
            if(response.info.success) {          
                results.text =  response.texts.join("\n");
               
                results.title = response.data.match(/<title>\s*(.+?)\s*<\/title>/)[1];
                this.logger.put(set.query + " - " + response.texts.length + " blocks, " + results.text.length + " chars");
                results.success = 1;
            }
            else {
                this.logger.put(set.query + " - error scraping text");
                results.success = 0;
            } 
     
  9. Support Денис

    Support Денис A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    12 июн 2017
    Сообщения:
    586
    Симпатии:
    185
    Здравствуйте. Для того что бы решить этот вопрос надо сделать следующее
    1)Добавить в переменные результата массив предложений
    Код:
     arrays :{
                              sentences: ['sentences',[
                                   ['sent','sentences'],
                              ]]
                    }
    2)Используя регулярное выражение поделить текст на предложения
    Код:
    let sen = /([^.!?]{30,}(?:[.!?]|$))/g;
                 let block;
                 while(block = sen.exec(results.text)){
                      results.sentences.push(block[1]);
                 }
    class Parser {
    constructor() {
    this.defaultConf = {
    version: '1.2.1',
    results: {
    flat: [
    ['key', 'Keyword'],
    ['link', 'Link'],
    ['text', 'Text'],
    ],
    arrays :{
    sentences: ['sentences',[
    ['sent','sentences'],
    ]]
    }
    },
    results_format: "$key - $link\\n$text\\n\\n",
    search_engine: 'SE::Google',
    SE_Google_preset: 'default',
    SE_Yandex_preset: 'default',
    HTML_TextExtractor_preset: 'default',
    };
    this.editableConf = [
    ['SE_Google_preset', ['combobox', 'SE::Google preset']],
    ['SE_Yandex_preset', ['combobox', 'SE::Yandex preset']],
    ['HTML_TextExtractor_preset', ['combobox', 'HTML::TextExtractor preset']],
    ['search_engine', ['combobox', 'Search engine', ['SE::Google', 'Google'], ['SE::Yandex', 'Yandex']]],
    ];
    }


    *parse(set, results) {
    return yield* set.lvl == 0 ? this.parseSE(set, results) : this.parseText(set, results);
    }

    *parseSE(set, results) {
    this.logger.put("Start scraping query: " + set.query);

    this.logger.put(`Use ${this.conf.search_engine}`);
    let SEresp = yield this.parser.request(
    this.conf.search_engine,
    this.conf[this.conf.search_engine.replace(/::/, '_') + '_preset'],
    set.query
    );

    if(SEresp.info.success) {
    let link_count = 0;
    let step = this.conf.search_engine == 'SE::Google' ? 3 : 6;
    for (let i = 0; i < SEresp.serp.length; i += step) {
    const link = SEresp.serp;
    this.query.add(link);
    link_count += 1;
    }
    this.logger.put("Added " + link_count + " links");
    results.success = 1;
    results.SKIP = 1;
    return results;
    }
    else {
    this.logger.put(`Error scraping ${this.conf.search_engine}`);
    results.success = 0;
    return results;
    }
    }

    *parseText(set, results) {
    this.logger.put("Scraping text from " + set.query);
    let response = yield this.parser.request('HTML::TextExtractor', this.conf.HTML_TextExtractor_preset, set.query);
    results.key = set.first;
    results.link = set.query;
    if(response.info.success) {
    results.text = response.texts.join("\n");
    // Здесь будум выбирать предложения
    let sen = /([^.!?]{30,}(?:[.!?]|$))/g;
    let block;
    while(block = sen.exec(results.text)){
    results.sentences.push(block[1]);
    }
    this.logger.put(set.query + " - " + response.texts.length + " blocks, " + results.text.length + " chars");
    results.success = 1;
    }
    else {
    this.logger.put(set.query + " - error scraping text");
    results.success = 0;
    }
    return results;
    }
    }

     
  10. Newsoros

    Newsoros A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    16 мар 2017
    Сообщения:
    13
    Симпатии:
    1
    Да работает спасибо, а заставить первый парсер ходить через прокси, а второй без него. Или если нет то подсовывать локальный прокси, чтобы трафик шел напрямую - такое возможно?
     
  11. Support Денис

    Support Денис A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    12 июн 2017
    Сообщения:
    586
    Симпатии:
    185
    Вы можете сделать пресет настроек для HTML::TextExtractor HTML::TextExtractor в котором отключите прокси. И затем через Override указать этот пресет в настройках.
    [​IMG]
     
  12. Newsoros

    Newsoros A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    16 мар 2017
    Сообщения:
    13
    Симпатии:
    1
    Я так и делал но в лог пишет на 2 парсере что прокси используется
     
  13. Support Денис

    Support Денис A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    12 июн 2017
    Сообщения:
    586
    Симпатии:
    185
    Используйте команду this.proxy.set('Тут укажите проксю',true) ;
    Код:
    *parseText(set, results) {
            this.logger.put("Scraping text from " + set.query);
            this.proxy.set('http://проксю  тут поставьте',true);
            results.sentences = [];
            let response = yield this.parser.request('HTML::TextExtractor', this.conf.HTML_TextExtractor_preset, set.query);
            results.key = set.first;
            results.link = set.query;
            if(response.info.success) {
                results.text = response.texts.join("\n");
                 // Здесь будум выбирать предложения
                 let sen = /([^.!?]{30,}(?:[.!?]|$))/g;
                 let block;
                 while(block = sen.exec(results.text)){
                      results.sentences.push(block[1]);
                 }
                this.logger.put(set.query + " - " + response.texts.length + " blocks, " + results.text.length + " chars");
                results.success = 1;
            }
            else {
                this.logger.put(set.query + " - error scraping text");
                results.success = 0;
            }
            return results;
        }
     
  14. Newsoros

    Newsoros A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    16 мар 2017
    Сообщения:
    13
    Симпатии:
    1
    Метод push выдает ошибку - JavaScript error: TypeError: Cannot read property 'push' of undefined at Parser.parseText (files/parsers/TextFromSE/TextFromSE.js:78:18) at

    Как это исправить
     
  15. Support Денис

    Support Денис A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    12 июн 2017
    Сообщения:
    586
    Симпатии:
    185
    Здравствуйте. А у вас такая строка
    Код:
    results.sentences = [];
    в коде присуствует?
     
  16. Newsoros

    Newsoros A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    16 мар 2017
    Сообщения:
    13
    Симпатии:
    1
    Все увидел в первом коде парсера когда добавили массив не было. Спасибо
     
  17. Support Денис

    Support Денис A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    12 июн 2017
    Сообщения:
    586
    Симпатии:
    185
    Пожалуйста
     
  18. Newsoros

    Newsoros A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    16 мар 2017
    Сообщения:
    13
    Симпатии:
    1
    Добрыйдень. Попытался в парсере поменять SE::Google на SE::Google::Modern, но выдает ошибку
    Код:
    07/12 12:56:30
    Parser JS::TextFromSEmodern::0 parse query мойка
    07/12 12:56:30
    Use proxy socks://**************:4532
    07/12 12:56:30
    Start scraping query: мойка
    07/12 12:56:30
    Use SE::Google::Modern
    07/12 12:56:30
    JavaScript error: Parser 'SE::Google::Modern' or preset '' not exists at build/core.to_build.pl line 41334.
    07/12 12:56:30
    Thread complete work
    07/12 12:56:31
    <keyword></keyword><link></link>
    <title></title>
    <content><content>
    
    Вот сам код парсера. Помогите исправить.
    Код:
    class Parser {
        constructor() {
            this.defaultConf = {
                version: '1.2.113',
                results: {
                    flat: [
                        ['key', 'Keyword'],
                        ['link', 'Link'],
                        ['title', 'Title'],
                        ['text', 'Text'],
                    ]
                },
                results_format: "<keyword>$key</keyword><link>$link</link>\\n<title>$title</title>\\n<content>$text<\content>\\n\\n",
                search_engine: 'SE::Google::Modern',
                SE_Google_Modern_preset: 'default',
                SE_Yandex_preset: 'default',
                HTML_TextExtractor_preset: 'default',
            };
            this.editableConf = [
                ['SE_Google_Modern_preset', ['combobox', 'SE::Google::Modern preset']],
                ['SE_Yandex_preset', ['combobox', 'SE::Yandex preset']],
                ['HTML_TextExtractor_preset', ['combobox', 'HTML::TextExtractor preset']],
                ['search_engine', ['combobox', 'Search engine', ['SE::Google::Modern', 'GoogleModern'], ['SE::Yandex', 'Yandex']]],
            ];
        }
    
          
        *parse(set, results) {
            return yield* set.lvl == 0 ? this.parseSE(set, results) : this.parseText(set, results);
        }
        
        *parseSE(set, results) {
            this.logger.put("Start scraping query: " + set.query);
    
            this.logger.put(`Use ${this.conf.search_engine}`);
            let SEresp = yield this.parser.request(
                this.conf.search_engine,
                this.conf[this.conf.search_engine.replace(/::/, '_') + '_preset'],
                set.query
            );
    
            if(SEresp.info.success) {
                let link_count = 0;
                let step = this.conf.search_engine == 'SE::Google::Modern' ? 3 : 6;
                for (let i = 0; i < SEresp.serp.length; i += step) {
                    const link = SEresp.serp[i];
                    this.query.add(link);
                    link_count += 1;
                }
                this.logger.put("Added " + link_count + " links");
                results.success = 1;
                results.SKIP = 1;
                return results;
            }
            else {
                this.logger.put(`Error scraping ${this.conf.search_engine}`);
                results.success = 0;
                return results;
            }
        }
    
        *parseText(set, results) {
            this.logger.put("Scraping text from " + set.query);
            let response = yield this.parser.request('HTML::TextExtractor', this.conf.HTML_TextExtractor_preset, set.query);
            results.key = set.first;
            results.link = set.query;
            if(response.info.success) {
                results.text =  response.texts.join("\n");
                results.title = response.data.match(/<title>\s*(.+?)\s*<\/title>/)[1];
                this.logger.put(set.query + " - " + response.texts.length + " blocks, " + results.text.length + " chars filename:" + results.filename);
                results.success = 1;
            }
            else {
                this.logger.put(set.query + " - error scraping text");
                results.success = 0;
            }
     
            return results;
        }
    }
    
     
  19. Support Денис

    Support Денис A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    12 июн 2017
    Сообщения:
    586
    Симпатии:
    185
    Здравствуйте.
    У вас переменная с названием пресета настроек неправильно формируется.
     
  20. Newsoros

    Newsoros A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    16 мар 2017
    Сообщения:
    13
    Симпатии:
    1
    Я это понял что несоответствие, но я не могу понять как правильно, в упор не вижу в чем ошибка. Пресеты у меня все подтягиваются корректно
     
    #20 Newsoros, 7 дек 2017
    Последнее редактирование: 7 дек 2017

Поделиться этой страницей