Парсер JS::TextFromSE 1.2

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

  1. Support

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

    Пользователь Support разместил новый ресурс:

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

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

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

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

    EceninPars A-Parser Enterprise License A-Parser Enterprise

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

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

    Forbidden нравится это.
  5. Support

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

    Пользователь Support обновил ресурс JS::TextFromSE новой записью:

    Обновление 1.2

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

    Babloman A-Parser Pro License A-Parser Pro

    Здравствуйте
    Как в таком случае можно чистить текст?

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

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

    Support Денис A-Parser Enterprise License Команда форума A-Parser Enterprise

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

    Newsoros A-Parser Enterprise License A-Parser Enterprise

    Добрый день подскажите как в этом парсере из текста (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

    Здравствуйте. Для того что бы решить этот вопрос надо сделать следующее
    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

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

    Support Денис A-Parser Enterprise License Команда форума A-Parser Enterprise

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

    Newsoros A-Parser Enterprise License A-Parser Enterprise

    Я так и делал но в лог пишет на 2 парсере что прокси используется
     
  13. Support Денис

    Support Денис A-Parser Enterprise License Команда форума A-Parser Enterprise

    Используйте команду 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;
        }
     

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