JS::Yandex::LangDetect

Парсер JS::Yandex::LangDetect 2.0.0

Available for license holders
  • Автор темы Автор темы Support
  • Дата начала Дата начала

Support

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

JS::Yandex::LangDetect - Определение языка страницы через Яндекс Переводчик

  • Используется HTML::TextExtractor HTML::TextExtractor для получения текста
  • Для определения языка страницы используется Яндекс Переводчик
    • Получаем ID
    • Отправляем POST запрос с полученным ID и текстом
  • Чтобы не делать дополнительные однотипные запросы, таблица соответствия кода языка и полного названия встроена в парсер
  • Есть возможность менять некоторые настройки парсера прямо из интерфейса: user agent и использование прокси для TextExtractor'а, обьем и...

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

Результат:
Код:
http://www.aljazeera.com.tr: tr (Turkish)
http://apple.com: en (English)
https://ja.wikipedia.org: ja (Japanese)
http://brasil.gov.br: pt (Portuguese)
http://a-parser.com: ru (Russian)

Код парсера
Код:
class Parser {
    constructor() {
        this.defaultConf = {
            results: {
                flat: [
                    ['langcode', 'Language code'],
                    ['langname', 'Language name'],
                    ['error', 'Error reason'],
                ]
            },
            parsecodes: {
                200: 1,
            },
            results_format: '$query: $langcode ($langname)\\n',
            HTML_TextExtractor_ua: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
            HTML_TextExtractor_use_proxy: false,
            max_text_size: 4096,
            text_position: 'last',
            lang_list: {
                "af":"Afrikaans","am":"Amharic","ar":"Arabic","az":"Azerbaijani","ba":"Bashkir","be":"Belarusian","bg":"Bulgarian","bn":"Bengali","bs":"Bosnian","ca":"Catalan","ceb":"Cebuano","cs":"Czech","cy":"Welsh","da":"Danish","de":"German","el":"Greek","en":"English","eo":"Esperanto","es":"Spanish","et":"Estonian","eu":"Basque","fa":"Persian","fi":"Finnish","fr":"French","ga":"Irish","gd":"Scottish Gaelic","gl":"Galician","gu":"Gujarati","he":"Hebrew","hi":"Hindi","hr":"Croatian","ht":"Haitian","hu":"Hungarian","hy":"Armenian","id":"Indonesian","is":"Icelandic","it":"Italian","ja":"Japanese","jv":"Javanese","ka":"Georgian","kk":"Kazakh","kn":"Kannada","ko":"Korean","ky":"Kyrgyz","la":"Latin","lb":"Luxembourgish","lt":"Lithuanian","lv":"Latvian","mg":"Malagasy","mhr":"Mari","mi":"Maori","mk":"Macedonian","ml":"Malayalam","mn":"Mongolian","mr":"Marathi","mrj":"Hill Mari","ms":"Malay","mt":"Maltese","ne":"Nepali","nl":"Dutch","no":"Norwegian","pa":"Punjabi","pap":"Papiamento","pl":"Polish","pt":"Portuguese","ro":"Romanian","ru":"Russian","si":"Sinhalese","sk":"Slovak","sl":"Slovenian","sq":"Albanian","sr":"Serbian","su":"Sundanese","sv":"Swedish","sw":"Swahili","ta":"Tamil","te":"Telugu","tg":"Tajik","th":"Thai","tl":"Tagalog","tr":"Turkish","tt":"Tatar","udm":"Udmurt","uk":"Ukrainian","ur":"Urdu","uz":"Uzbek","vi":"Vietnamese","xh":"Xhosa","yi":"Yiddish","zh":"Chinese"
            },
        };

        this.editableConf = [
            ['HTML_TextExtractor_ua', ['textfield', 'User agent']],
            ['max_text_size', ['combobox', 'Max text size for detect',
                [1024, '1 Kb'],
                [2048, '2 Kb'],
                [4096, '4 Kb'],
                [8192, '8 Kb']
            ]],
            ['text_position', ['combobox', 'Text position for detect',
                ['first', 'First'],
                ['last', 'Last']
            ]],
            ['HTML_TextExtractor_use_proxy', ['combobox', 'Use proxy in TextExtractor',
                [true, 'Yes'],
                [false, 'No']
            ]],
        ];
    }

    *parse(set, results) {
        this.logger.put("Open " + set.query);

        let response_get_text = yield this.parser.request('HTML::TextExtractor', 'default', {
            goodCode: {
                200: 1,
            },
            'user-agent': this.conf.HTML_TextExtractor_ua,
            useproxy: this.conf.HTML_TextExtractor_use_proxy,
        }, set.query);
        let texts = response_get_text.texts;
        if (response_get_text.info.success && texts.length > 0) {
            this.logger.put("Received " + texts.length + " text blocks");
            let text = '';
            if (this.conf.text_position == 'last') {
                text = _.unescape(texts.join(" ").replace(/\s+/g, ' ').replace(/<.+?>/g, '')).slice(this.conf.max_text_size * -1);
                this.logger.put("Cutted last " + text.length + " chars");
            } else {
                text = _.unescape(texts.join(" ").replace(/\s+/g, ' ').replace(/<.+?>/g, '')).slice(0, this.conf.max_text_size);
                this.logger.put("Cutted first " + text.length + " chars");
            };

            this.logger.put("Open https://translate.yandex.ru");
            let response_get_id = yield this.request('GET', 'https://translate.yandex.ru', {}, {
                check_content: ['<\/html>'],
                decode: 'auto-html',
            });
            if (response_get_id) {
                let rev_id = response_get_id.data.match(/SID:\s*'([^']+)/)[1].split('.');
                let id = [];
                rev_id.forEach(function(part, i, rev_id) {
                    id.push(part.split("").reverse().join(""));
                });
                this.logger.put("Received ID successful");

                this.logger.put("Detect language");
                let response_get_lang = yield this.request('POST', 'https://translate.yandex.net/api/v1/tr.json/detect?sid=' + id.join('.') + '&srv=tr-text', {
                    text: text,
                }, {
                    check_content: ['"code":200'],
                    decode: 'auto-html',
                });
                if (response_get_lang.success) {
                    results.langcode = JSON.parse(response_get_lang.data).lang;
                    results.langname = this.conf.lang_list[results.langcode];
                    results.error = "";
                    results.success = 1;
                } else {
                    if (response_get_lang.code == 414) {
                        this.logger.put("Error: Text too large. Try reduce Max text size");
                        results.error = "Text too large, language detect failed";
                    } else {
                        this.logger.put("Error detecting language");
                        results.error = "Detecting language failed";
                    }
                    results.success = 0;
                }
            } else {
                this.logger.put("Error opening https://translate.yandex.ru");
                results.error = "Getting ID failed";
                results.success = 0;
            }
        } else {
            if (texts.length == 0) {
                this.logger.put("Error opening " + set.query + ": No text");
                results.error = "No text";
            } else {
                this.logger.put("Error opening " + set.query);
                results.error = "Other reason";
            }
            results.success = 0;
        }

        return results;
    }
}
  • Используется HTML::TextExtractor HTML::TextExtractor для получения текста
  • Для определения языка страницы используется Яндекс Переводчик
    • Получаем ID
    • Отправляем POST запрос с полученным ID и текстом
  • Чтобы не делать дополнительные однотипные запросы, таблица соответствия кода языка и полного названия встроена в парсер
  • Есть возможность менять некоторые настройки парсера прямо из интерфейса: user agent и использование прокси для TextExtractor'а, обьем и позицию текста, отправляемого на определение
  • Ведется подробный лог работы, в результат можно вывести переменную $error, в которой будет содержаться причина если запрос был неудачным
 
можете пожалуйста подправить или сказать в чем причина ошибки:
JavaScript error: Not an ARRAY reference at build/core.to_build.pl line 27529.
Код:
{"queryformat":"$query","options":[],"pagecount":1,"proxyChecker":"*","parsecodes":{"200":1},"do_gzip":1,"lang_list":{"ne":"Nepali","su":"Sundanese","tr":"Turkish","da":"Danish","gl":"Galician","ru":"Russian","ro":"Romanian","az":"Azerbaijani","vi":"Vietnamese","ta":"Tamil","lb":"Luxembourgish","ml":"Malayalam","cy":"Welsh","ko":"Korean","cs":"Czech","uz":"Uzbek","af":"Afrikaans","ht":"Haitian","bs":"Bosnian","is":"Icelandic","ky":"Kyrgyz","mrj":"Hill Mari","mt":"Maltese","ga":"Irish","hy":"Armenian","la":"Latin","ms":"Malay","eu":"Basque","ka":"Georgian","gu":"Gujarati","bg":"Bulgarian","mi":"Maori","pap":"Papiamento","sv":"Swedish","it":"Italian","hu":"Hungarian","fa":"Persian","ca":"Catalan","pl":"Polish","sq":"Albanian","sk":"Slovak","jv":"Javanese","hi":"Hindi","pt":"Portuguese","uk":"Ukrainian","ceb":"Cebuano","ba":"Bashkir","es":"Spanish","no":"Norwegian","sw":"Swahili","lv":"Latvian","tt":"Tatar","fr":"French","id":"Indonesian","xh":"Xhosa","sr":"Serbian","th":"Thai","mhr":"Mari","et":"Estonian","si":"Sinhalese","tl":"Tagalog","mk":"Macedonian","fi":"Finnish","en":"English","lt":"Lithuanian","udm":"Udmurt","hr":"Croatian","de":"German","be":"Belarusian","ur":"Urdu","yi":"Yiddish","pa":"Punjabi","sl":"Slovenian","ja":"Japanese","bn":"Bengali","am":"Amharic","tg":"Tajik","mr":"Marathi","kn":"Kannada","he":"Hebrew","te":"Telugu","zh":"Chinese","eo":"Esperanto","nl":"Dutch","ar":"Arabic","mn":"Mongolian","gd":"Scottish Gaelic","el":"Greek","kk":"Kazakh","mg":"Malagasy"},"timeout":60,"text_position":"last","useproxy":1,"extraquery":"","HTML_TextExtractor_use_proxy":1,"version":"1.0.1","proxyretries":10,"requestdelay":0,"proxybannedcleanup":600,"formatable":{"arrays":{},"flat":[["query","Formatted query"],["query.orig","Original query"],["query.first","First query"],["info.success","Parsing success"],["info.retries","Used retries"],["info.stats","Statistics"],["langcode","Language code"],["langname","Language name"],["error","Error reason"],["data","Raw data"]]},"max_text_size":4096,"formatresult":"$query: $langcode ($langname)\\n","HTML_TextExtractor_ua":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)","max_size":1048576}
 
Подскажите User Agent возможно менять налету?
"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; etc)";
 
@Vvtex, если вы имели в виду возможность указывать юзерагент в пресете, то да, такая возможность есть, и об этом написано выше:
  • Есть возможность менять некоторые настройки парсера прямо из интерфейса: user agent и использование прокси для TextExtractor'а, обьем и позицию текста, отправляемого на определение
А менять его "на лету", т.е. во время работы задания, нельзя.
 
Спасибо, я не знал, что можно строчкой указывать несколько user agent.
 
Можно указывать только 1 юзерагент.
 
Судя по скриншоту проблема в прокси. Увеличьте кол-во попыток и если проверка прокси не включена, то включите
 
Пользователь Support обновил ресурс JS::Yandex::LangDetect новой записью:

Обновление 2.0.0

  • Парсер переписан на JS API v2 (TypeScript)
  • Добавлена поддержка каптч (наследуется от SE::Yandex SE::Yandex)
  • Добавлен выбор пресета настроек HTML::TextExtractor HTML::TextExtractor
  • Адаптация к изменениям на источнике

Узнать больше об этом обновлении...
 
  • Like
Реакции: Rost
Назад
Верх