Регулярное выражение, которое соответствует пользовательским агентам браузеров конечных пользователей, но НЕ сканерам с точностью >90 %

Я пытаюсь создать регулярное выражение, которое будет оцениваться как истинное для User-Agent: "браузеров, управляемых людьми", но ложное для ботов. Излишне говорить, что совпадение не будет точным, но если оно работает правильно, скажем, в 90% случаев, этого более чем достаточно.

Мой подход до сих пор заключается в том, чтобы ориентироваться на строку User-Agent пяти основных браузеров для настольных компьютеров (MSIE, Firefox, Chrome, Safari, Opera). В частности, я хочу, чтобы регулярное выражение НЕ совпадало, если пользовательский агент является ботом (Googlebot, msnbot и т. д.).

В настоящее время я использую следующее регулярное выражение, которое, по-видимому, обеспечивает желаемую точность:

^(Mozilla.*(Gecko|KHTML|MSIE|Presto|Trident)|Opera).*$

Я наблюдал небольшое количество ложноотрицательных результатов, которые в основном связаны с мобильными браузерами. Все исключения совпадают:

(BlackBerry|HTC|LG|MOT|Nokia|NOKIAN|PLAYSTATION|PSP|SAMSUNG|SonyEricsson)

Мой вопрос: Учитывая желаемый уровень точности, как бы вы улучшили регулярное выражение? Можете ли вы назвать какие-либо серьезные ложные срабатывания или ложноотрицательные результаты данного регулярного выражения?

Обратите внимание, что вопрос конкретно о сопоставлении User-Agent на основе регулярных выражений. Есть куча других подходов к решению этой проблемы, но они выходят за рамки этого вопроса.


person knorv    schedule 24.03.2010    source источник
comment
А как насчет ботов, которые идентифицируют себя как браузеры?   -  person Macha    schedule 24.03.2010
comment
Macha: Очевидно, они будут классифицироваться как браузеры. Но пока они редки, они не будут проблемой, учитывая заявленную цель точности.   -  person knorv    schedule 24.03.2010
comment
Да, любой запуск бота через ваш сайт — это честно. Лучшее решение — переосмыслить, что вы здесь делаете и как вы это делаете. Большинство людей предпочитают определять ботов по поведению (множество разных страниц за очень короткий промежуток времени), а не по пользовательскому агенту.   -  person    schedule 24.03.2010
comment
Уилл: См. последний абзац вопроса. Это очень ясно по масштабу вопроса.   -  person knorv    schedule 24.03.2010


Ответы (3)


Многие поисковые роботы не отправляют заголовок Accept-Language, в то время как, насколько мне известно, все браузеры это делают. Вы можете объединить эту информацию с вашим регулярным выражением, чтобы получить более точные результаты.

person fuxia    schedule 25.03.2010
comment
Единственное, что я видел, не подчиняется этому slurp: [Mozilla/5.0 (совместимый; Yahoo! Slurp; help.yahoo.com/help/us/ysearch/slurp)] [en-us,en;q=0.5], а также, если вы обслуживаете медиа, я думаю, что иногда плагины для браузера делают запрос без Accept-Language, если в IE (так что это не бот, но не отправляет Accept-Language). Также Google Translate не отправляет Accept-Language, но в целом этот метод работает хорошо. - person rogerdpack; 27.10.2011
comment
Итак, что касается логики: вы думаете, что if (regex_matches || has_header) { is_human } или вы думаете, что if (regex_matches && has_header) { is_human } будет лучше - person Nathan J.B.; 23.01.2013
comment
@ Натан Дж. Брауэр AND, а не OR. Все еще не совсем надежно, но это все равно невозможно. - person fuxia; 23.01.2013

Вы можете создать черный список, проверив, какие пользовательские агенты имеют доступ к robots.txt.

person Sjoerd    schedule 24.03.2010
comment
Интересная концепция! Способ мыслить нестандартно. - person Nathan J.B.; 23.01.2013
comment
Потрясающая идея! хотел поддержать вас и проголосовать за это тоже :). - person Erx_VB.NExT.Coder; 03.08.2013

Я бы предпочел использовать наоборот, иметь шаблон для ботов намного проще

лично я использую следующее регулярное выражение

/bot\b|index|spider|crawl|wget|slurp|Mediapartners-Google/i
person Muayyad Alsadi    schedule 14.05.2012
comment
Это опасно. Я отфильтровал это Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; Bottle of Smoke Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 , и я запускал это только на подмножестве пользовательских агентов, которые мы когда-либо видели. - person Pawel Veselov; 27.11.2012
comment
/bot\b|... :-) Не уверен насчет «индекса», так как некоторые плагины делают странные вещи со строками пользовательского агента (особенно в IE, выталкивая длину) - person Tracker1; 27.11.2014
comment
вы должны добавить curl в свое регулярное выражение - person NMC; 31.10.2018