2010-03-24 25 views
11

Tôi đang cố gắng xây dựng một regexp sẽ đánh giá đúng cho User-Agent: s của "trình duyệt được điều hướng bởi con người", nhưng sai cho chương trình. Không cần phải nói rằng sự kết hợp sẽ không chính xác, nhưng nếu nó đạt được những điều đúng đắn, thì 90% các trường hợp đó là quá đủ.Regexp phù hợp với tác nhân người dùng của trình duyệt người dùng cuối nhưng KHÔNG thu thập thông tin> độ chính xác 90%

Cách tiếp cận của tôi cho đến nay là nhắm mục tiêu chuỗi User-Agent của năm trình duyệt máy tính để bàn chính (MSIE, Firefox, Chrome, Safari, Opera). Cụ thể là tôi muốn regexp KHÔNG để khớp nếu tác nhân người dùng là bot (Googlebot, msnbot, v.v.).

Hiện nay tôi đang sử dụng regexp sau đó xuất hiện để đạt được độ chính xác mong muốn:

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

Tôi đã quan sát thấy số ít âm tính giả mà chủ yếu là các trình duyệt di động. Các trường hợp ngoại lệ phù hợp:

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

Câu hỏi của tôi là: Với mức độ chính xác mong muốn, bạn sẽ cải thiện regexp như thế nào? Bạn có thể nghĩ ra bất kỳ sai lầm tích cực sai hoặc âm tính giả nào đối với regexp đã cho không?

Xin lưu ý rằng câu hỏi đặc biệt về kết hợp dựa trên regexp dựa trên User-Agent. Có một loạt các cách tiếp cận khác để giải quyết vấn đề này, nhưng chúng nằm ngoài phạm vi của câu hỏi này.

+1

gì về chương trình để nhận dạng như các trình duyệt? – Macha

+0

Macha: Rõ ràng chúng sẽ được phân loại là trình duyệt. Nhưng chừng nào chúng còn hiếm thì chúng sẽ không là vấn đề với mục tiêu chính xác đã nêu. – knorv

+0

Vâng, errybody đang chạy bot thông qua trang web của bạn là trung thực. Giải pháp tốt nhất là suy nghĩ lại những gì bạn đang làm ở đây và làm thế nào bạn đang đi về nó. Hầu hết mọi người thích phát hiện bot theo hành vi (nhiều trang khác nhau trong một khoảng thời gian rất ngắn) thay vì tác nhân người dùng. – Will

Trả lời

7

Nhiều trình thu thập thông tin không gửi tiêu đề Chấp nhận ngôn ngữ, trong khi AFAIK tất cả các trình duyệt đều làm. Bạn có thể kết hợp thông tin này với regex của bạn để có được kết quả chính xác hơn.

+0

Người duy nhất tôi thấy rằng không tuân theo điều này là slurp: [Mozilla/5.0 (tương thích; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] [vi-us, vi ; q = 0.5] và nếu bạn đang phục vụ truyền thông thì tôi nghĩ đôi khi plugin trình duyệt đưa ra yêu cầu không có Accept-Language nếu trong IE (vì vậy đó không phải là bot, nhưng không gửi Accept-Language). Ngoài ra google dịch không gửi một Accept-Language, nhưng nói chung phương pháp này có vẻ hoạt động tốt. – rogerdpack

+0

Vì vậy, theo logic: bạn có nghĩ 'if (regex_matches || has_header) {is_human}' hay bạn đang nghĩ 'if (regex_matches && has_header) {is_human}' sẽ tốt hơn –

+0

@ NathanJ.Brauer 'AND' , không phải 'OR'. Vẫn không hoàn toàn đáng tin cậy, nhưng điều đó là không thể. – fuxia

22

Bạn có thể tạo danh sách đen bằng cách kiểm tra tác nhân người dùng nào truy cập robots.txt.

+0

Khái niệm thú vị! Cách suy nghĩ bên ngoài hộp. –

+0

Ý tưởng tuyệt vời! muốn cung cấp cho bạn đạo cụ và bỏ phiếu cho điều đó cũng :). –

4

Tôi muốn sử dụng ngược lại, có một khuôn mẫu cho chương trình là đơn giản hơn nhiều

Cá nhân tôi sử dụng sau đây regex

/bot\b|index|spider|crawl|wget|slurp|Mediapartners-Google/i 
+1

Điều đó rất nguy hiểm. Tôi đã có điều này lọc ra 'Mozilla/5.0 (Linux; U; Android 3.0.1; en-chúng tôi; Chai khói xây dựng/HRI66) AppleWebKit/534.13 (KHTML, như Gecko) Phiên bản/4.0 Safari/534.13 'và tôi chỉ chạy điều này trên một tập hợp con các tác nhân người dùng mà chúng tôi từng thấy. –

+0

'/ bot \ b | ...' :-) Không chắc chắn về 'chỉ mục' mặc dù, vì một số plugin thực hiện một số điều kỳ lạ cho chuỗi tác nhân người dùng (đặc biệt là trong IE, đẩy độ dài ra) – Tracker1

Các vấn đề liên quan