JS::TextFromSE

Парсер JS::TextFromSE 2.0

Доступно владельцам лицензии
  • Автор темы Автор темы Support
  • Дата начала Дата начала

Support

Administrator
Команда форума
A-Parser Enterprise
Пользователь Support разместил новый ресурс:

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

  • Данный парсер - это пример обьединения парсера поисковой выдачи и парсера текста в одном
  • Есть возможность выбрать ПС: Google или Яндекс
  • Для выбранной ПС и парсера текста можно задать собственные пресеты настроек. Тем самым можно регулировать кол-во ссылок, по которым будет парситься текст, а также настроить парсер текста (задать минимальный размер блока, юзер агент и т.п.) Пример такой настройки:
    suDUw.png
  • В результат выводится...

Узнать больше об этом ресурсе...
 
3HRbE.png

Код парсера
Код:
class Parser {
    constructor() {
        this.defaultConf = {
            results: {
                flat: [
                    ['key', 'Keyword'],
                    ['link', 'Link'],
                    ['text', 'Text'],
                ]
            },
            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 : 5;
            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");
            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;
    }
}
  • Данный парсер - это пример обьединения парсера поисковой выдачи и парсера текста в одном
  • Есть возможность выбрать ПС: Google или Яндекс
  • Для выбранной ПС и парсера текста можно задать собственные пресеты настроек. Тем самым можно регулировать кол-во ссылок, по которым будет парситься текст, а также настроить парсер текста (задать минимальный размер блока, юзер агент и т.п.) Пример такой настройки:
    suDUw.png
  • В результат выводится ключ, ссылка и текст. Текст никак дополнительно не чистится, можно использовать Конструктор результатов как в обычном парсере текста
  • Алгоритм работы:
    • По ключу из выбранного поисковика парсятся ссылки
    • Полученные ссылки передаются в HTML::TextExtractor для получения текста
    • С помощью this.query.add ссылки распределяются по потоках, для равномерной нагрузки
 
У Вас в примере в Override option показан HTML TextExtractorPreset как я понял для очистки текста. Но реально его нет возможности добавить, т.к. его нет в списке. Пожалуйста добавьте в примере готовый парсер с фильтрами очистки как в примере.
 
Пользователь Support обновил ресурс JS::TextFromSE новой записью:

Обновление 1.2

  • Исправлена ошибка, когда при выборе Яндекса появлялись неудачные запросы. Проблема появилась начиная с версии 1.1.811 из-за изменения кол-ва переменных в парсере Яндекса

Узнать больше об этом обновлении...
 
Здравствуйте
Как в таком случае можно чистить текст?

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

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

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

Спасибо
Здравствуйте.
Для очистки текста вы можете использовать конструктор результатов. И соответственно с его помощью очищать текст.
Более подробно о конструкторе результатов вы можете почитать по ссылке
 
Добрый день подскажите как в этом парсере из текста (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;
        }
 
Здравствуйте. Для того что бы решить этот вопрос надо сделать следующее
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;
}
}

 
Да работает спасибо, а заставить первый парсер ходить через прокси, а второй без него. Или если нет то подсовывать локальный прокси, чтобы трафик шел напрямую - такое возможно?
 
Вы можете сделать пресет настроек для HTML::TextExtractor HTML::TextExtractor в котором отключите прокси. И затем через Override указать этот пресет в настройках.
noproxy.png
 
Я так и делал но в лог пишет на 2 парсере что прокси используется
 
Используйте команду 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;
    }
 
Метод push выдает ошибку - JavaScript error: TypeError: Cannot read property 'push' of undefined at Parser.parseText (files/parsers/TextFromSE/TextFromSE.js:78:18) at

Как это исправить
 
Здравствуйте. А у вас такая строка
Код:
results.sentences = [];
в коде присуствует?
 
Все увидел в первом коде парсера когда добавили массив не было. Спасибо
 
Добрыйдень. Попытался в парсере поменять 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;
    }
}
 
Здравствуйте.
У вас переменная с названием пресета настроек неправильно формируется.
 
Я это понял что несоответствие, но я не могу понять как правильно, в упор не вижу в чем ошибка. Пресеты у меня все подтягиваются корректно
 
Последнее редактирование:
Назад
Верх