MỤC LỤC
TỔNG QUAN ĐỀ TÀI 1
I. GIỚI THIỆU CHUNG VỀ VẤN ĐỀ NGHIÊN CỨU 1
I.1. Lịch sử phát triển 1
I.2. Giới thiệu về các máy tìm kiếm thông dụng 2
I.2.1. Thế giới 2
I.2.2. Việt Nam 3
II. LÝ DO CHỌN ĐỀ TÀI 4
II.1. Mục tiêu và ý nghĩa của đề tài 4
II.2. Nhiệm vụ cần phải thực hiện 5
II.2.1. Xây dựng chức năng 5
II.2.2. Xây dựng ứng dụng web 6
II.3. Hướng nghiên cứu của đề tài 6
II.3.1. Về mặt lý thuyết 6
II.3.2. Công cụ xây dựng đề tài 6
II.3.3. Dự kiến kết quả đạt được 7
CƠ SỞ LÝ THUYẾT 8
I. LÝ THUYẾT LIÊN QUAN ĐẾN ĐỀ TÀI 8
I.1. Tổng quan hệ thống máy tìm kiếm 8
I.1.1. Giới thiệu 8
I.1.2. Bộ thu thập tài liệu-Crawler 10
I.1.3. Bộ lập chỉ mục-Indexer 15
I.1.4. Ứng dụng tìm kiếm-Searcher 17
I.2. Lucene-Mã nguồn mở cho máy tìm kiếm 18
I.2.1. Giới thiệu chung 18
I.2.2. Các bước thực hiện 21
I.2.3. Các lớp chính 22
II. VẤN ĐỀ CẦN NGHIÊN CỨU 23
II.1. HyperText Transfer Protocol 23
II.1.1. Định dạng địa chỉ (Internet addressing) 23
II.2. Lập trình đa luồng trong java 27
II.2.1. Thread là gì? 27
II.2.2. Thread trong ngôn ngữ Java 27
II.3. Phân tích HTML 29
II.3.1. Bốn thành phần cơ bản của Html 29
II.3.2. Thành phần mà crawler phân tích 31
II.3.3. Vấn đề cần xử lý 33
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG 37
I. PHÂN TÍCH HỆ THỐNG 37
I.1. Gói crawler 38
I.1.1. Use-case quản lý các liên kết 39
I.1.2. Usecase quản lý thiết lập các tùy chọn 46
I.2. Gói reader 47
I.3. Gói indexer 48
I.4. Gói searcher và ứng dụng web 49
II. THIẾT KẾ HỆ THỐNG 50
II.1. Tổng thể chương trình 50
II.1.1. Gói crawler 52
II.1.2. Gói reader 53
II.1.3. Gói indexer 55
II.2. Xây dựng các chức năng 55
II.2.1. Chức năng xác nhận cho phép đánh chỉ mục 55
II.2.2. Chức năng tải tài liệu về máy 57
II.2.3. Tạo công việc mới 58
II.2.4. Lưu công việc dở dang 59
II.2.5. Thực hiện các công việc cũ 59
II.2.6. Chức năng truy xuất liên kết 59
II.3. Tổ chức dữ liệu 62
II.3.1. Lớp URLRootBean 62
II.3.2. Lớp LinkBean 63
II.3.3. Lớp ParentDirBean 64
CÀI ĐẶT VÀ TRIỂN KHAI CHƯƠNG TRÌNH 66
I. CÀI ĐẶT CHƯƠNG TRÌNH 66
II. KẾT QUẢ THỰC HIỆN 68
II.1. Màn hình chính của chương trình 68
II.2. Màn hình hệ thống crawler đang vận hành 68
II.3. Màn hình xử lý các công việc cũ 70
KẾT QUẢ THỬ NGHIỆM 71
I. DỮ LIỆU THỬ NGHIỆM 71
II. KẾT QUẢ THỬ NGHIỆM 71
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 74
I. KẾT QUẢ ĐẠT ĐƯỢC 74
I.1. Về mặt lý thuyết 74
I.2. Về mặt thực nghiệm 74
I.2.1. Ưu điểm 74
I.2.2. Khuyết điểm 74
II. HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI 75
PHỤ LỤC 76
TÓM TẮT ĐỀ TÀI 78
87 trang |
Chia sẻ: netpro | Lượt xem: 2581 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Luận văn Nghiên cứu máy tìm kiếm và xây dựng thử nghiệm mô phỏng máy tìm kiếm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
dụng máy tìm kiếm sử dụng mã nguồn mở Lucene có thể đạt được các tính năng như sau:
Đánh chỉ mục hoạt động cao
Tốc độ đánh chỉ mục lớn, hơn 20Mb mỗi phút đối với máy Pentium M 1.5GHz
Yêu cầu dung lượng RAM nhỏ - chỉ cần 1Mb heap
Dữ liệu chỉ mục tăng một cách thống nhất đồng loạt
Các tập tin chỉ mục của Lucene kích thước chỉ khoảng 20% - 30% kích thước của chỉ mục bằng tập tin txt.
Sử dụng thuật toán tìm kiếm mạnh, chính xác và hiệu quả
Xếp hạng kết quả - kết quả tốt nhất được trả về trước tùy theo độ tương đồng với câu truy vấn người sử dụng. Kết quả có thể sắp xếp theo các trường được đánh chỉ mục, theo ngày tháng v.v…
Nhiều loại truy vấn mạnh như: phrase query (truy vấn theo cụm từ), wildcast query (truy vấn sử dụng các kí hiệu thay thế như *, ?, ~), range query (câu truy vấn theo phạm vi) v.v…
Tìm kiếm theo các trường được đánh chỉ mục. Nhiều trường có thể được lựa chọn để phục vụ cho việc tìm kiếm. Ví dụ một tài liệu thường được chia thành các trường cơ bản như tựa đề, tác giả và nội dung. Ta có thể lựa chọn bất kì trường nào để tìm kiếm hay tìm kiếm trên tất cả các trường. Thông thường thì trường nội dung dùng để tìm kiếm còn trường tác giả, tựa đề thì dùng để biểu diễn kết quả trả về.
Ta có thể tìm kiếm đồng thời trên nhiều hệ thống chỉ mục. Các hệ thống chỉ mục cho phép cập nhật nội dung mới, chỉnh sửa…
Được sử dụng miễn phí cho phần mềm mã nguồn mở cũng như phần mềm thương mại
Các gói chính của thư viện Lucene (Lucene core):
org.apache.lucene
Gói chính
org.apache.lucene.analysis.
API dùng để chuyển text sang các đơn vị từ vựng(token) để có thể đánh chỉ mục và tìm kiếm
org.apache.lucene.analysis.standard
Cấu trúc ngữ pháp dùng tokenize từ vựng
org.apache.lucene.document
Quản lý document
org.apache.lucene.index.
Mã để duy trì và truy cập chỉ mục
org.apache.lucene.queryParser.
Phân tích truy vấn đơn giản
org.apache.lucene.search
Gói dùng để tìm kiếm chỉ mục
org.apache.lucene.search.function
.
Quản lý và xếp hạng các kết quả
org.apache.lucene.search.payloads
Cung cấp các cơ chế truy vấn
org.apache.lucene.util
Chứa các lớp tiện ích
org.apache.lucene.search.spans
Các thuật toán
org.apache.lucene.store
API thực hiện vào/ra, dùng cho tất cả các dữ liệu đánh chỉ mục.
Bảng 2 Các gói chính trong thư viện mã nguồn mở Lucene
Các bước thực hiện
Mô tả các đối tượng
Lucene coi các đối tượng được đánh chỉ mục là các Lucene Document, mỗi Lucene Document có nhiều Field tương ứng như là thuộc tính của đối tượng. Ví dụ như ta muốn đánh chỉ mục cho một tập tin pdf, thì ta phải mô tả các metadata của tập tin pdf như Title, Keyword, Author, Content v.v… thành các Field tương ứng cho Lucene Document.
Các Field có thể được đánh chỉ mục hay không đánh chỉ mục. Các Field được đánh chỉ mục thường là nội dung của tập tin, còn các Field không đánh chỉ mục thường là các thông tin không quan trọng như tên tác giả, đường dẫn v.v…các thông tin này chỉ được lưu trữ để phục vụ cho các kết quả trả về.
Đánh chỉ mục
Trước khi đánh chỉ mục ta cần phải viết các hàm để chuyển đổi tài liệu từ dạng ban đầu về plaintext để có thể tạo ra Lucene Document như đã giới thiệu ở trên. Chẳng hạn như dữ liệu ban đầu là một tập tin Microsoft Word đuôi doc. Lucene không thể trực tiếp tạo Lucene Document được mà cần phải có một hàm đọc nội dung của tập tin .doc để đưa ra dạng text đơn giản hay còn gọi là plaintext. Sau đó từ định dạng văn bản thuần túy này thì Lucene mới tạo ra được các Lucene Document.
Thao tác đánh chỉ mục khá phức tạp. Trước hết dữ liệu văn bản sẽ được phân tích thành các từ khóa, đồng thời loại bỏ các xuất hiện nhưng không mang nghĩa quan trọng gọi là các stopword. Chẳng hạn trong Tiếng Việt các stopword như: thì, là, và, nhưng v.v…Sau đó các từ khóa sẽ được dùng để tạo chỉ mục nghịch đảo và lưu thành các phân đoạn dạng thuận tiện cho việc tìm kiếm sau này. Chỉ mục nghịch đảo được hiểu là một dạng cấu trúc dữ liệu dùng để lưu trữ danh sách các tài liệu mà có chứa các từ khóa. Chẳng hạn như ta muốn tìm các tài liệu có chứa từ khóa “search engine” nếu dùng chỉ mục thông thường, phải quét qua hết các tài liệu có trong cơ sở dữ liệu thì mới tìm ra được, rất tốn thời gian khi số lượng dữ liệu lớn. Cách này tương ứng với câu hỏi: Các tài liệu nào có chứa từ “search engine”? Nếu có 100 tài liệu thì ta cần phải tìm 100 lần. Còn chỉ mục nghịch đảo sẽ tương ứng với câu hỏi ngược lại: Từ “search engine” nằm trong các tài liệu nào? Tức là ta sẽ lập chỉ mục trước và chỉ tìm với số lần đúng với số tài liệu có chứa từ “search engine” mà không cần duyệt qua tất cả 100 tài liệu.
Sau khi dữ liệu đã được đánh chỉ mục, ta có thể thực hiện tìm kiếm trên chúng. Tìm kiếm toàn văn cho phép bạn có thể tìm kiếm theo danh sách các từ khóa cùng với các toán tử luận lí (và, hoặc, phủ định).Ví dụ ta có thể truy vấn “cửa hàng máy tính NOT Phi Long” tức là sẽ tìm các website có từ “cửa hàng máy tính” nhưng không có từ “Phi Long”. Ngoài ra, điểm nổi bật khác của tìm kiếm toàn văn là cho phép xếp hạng các kết quả trả về tùy vào độ tương đồng (relevance) giữa câu truy vấn và kết quả tìm kiếm.
Các lớp chính
Các lớp dùng để đánh chỉ mục
IndexWriter
Là lớp trọng tâm của quá trình đánh chỉ mục. Lớp này tạo một chỉ mục mới và thêm tài liệu vào một chỉ mục đã tồn tại. Đây là lớp dùng để thao tác chỉnh sửa chỉ mục.
Directory
Là lớp đại diện cho vị trí của bảng chỉ mục. Đây là lớp trừu tượng cho phép các lớp con của nó lưu trữ các chỉ mục mà nó cho là phù hợp. Để lưu dữ liệu trên đĩa ta dùng lớp FSDirectory, còn muốn lưu dữ liệu trên bộ nhớ ta dùng lớp RAMDirectory.
Analyzer
Trước khi được đánh chỉ mục thì văn bản cần được xử lý qua lớp Analyzer.
Document
Lớp Document đại diện cho tập hợp các trường. Có thể xem nó như là một tài liệu ảo – một đoạn dữ liệu, như một trang web, một thông điệp email, hoặc một file văn bản mà bạn muốn có thể truy lục tìm kiếm trong lần sau. Các trường của tài liệu đại diện cho meta-data liên quan đến tài liệu. Các tài nguyên gốc chẳng hạn như một database record, Word document, một chương trong sách v.v… là không được đánh chỉ mục mà chỉ có meta-data như author, title, subject, data modified mới được đánh chỉ mục và lựu trữ một cách tách biệt như các trường của tài liệu.
Field
Mỗi Document trong chỉ mục chứa ít nhất một tên trường, mỗi trường phù hợp với mảnh dữ liệu mà vừa được truy vấn hoặc truy lục từ chỉ mục trong quá trình tìm kiếm.
Trong Lucene có bốn loại Field: Keyword, UnIndexed, UnStored và Text.
Các lớp chính dùng để tìm kiếm
IndexSearcher
Lớp IndexSearcher làm công việc tìm kiếm những gì mà IndexWriter đã đánh chỉ mục, đây là lớp trung tâm liên kết với bảng chỉ mục mà đưa ra một vài phương thức tìm kiếm.Ta có thể nghĩ rằng IndexSearch là một lớp có thể mở các bảng chỉ mục ở chế độ chỉ đọc. Nó cung cấp một số phương thức tìm kiếm, phương thức đơn giản nhất là chỉ cần một tham số là một đối tượng Query và trả về một đối tượng Hits. Cách sử dụng phương thức như sau:
IndexSearcher is = new IndexSearcher(FSDirectory.getDirectory(“tmp/index”, false));
Query q = new TermQuery(new Term(“contents”, “lucene”));
Hits hits = is.search(q);
Term
Term là một đơn vị cơ bản trong tìm kiếm. Tương tự như đối tượng Field, nó bao gồm một hai thành phần kiểu String: là tên của trường và giá trị của trường. Chú ý rằng đối tượng Term cũng liên quan đến quá trình đánh chỉ mục. Trong quá trình tìm kiếm, chúng ta có thể khởi tạo đối tượng Term và sử dụng chúng cùng với TermQuery:
Query q = new TermQuery(new Term(“contents”, “lucene”);
Hits hits = is.search(q);
Đoạn mã trên chỉ cho Lucene tìm tất cả các tài liệu mà có chứa từ lucene trong trường có tên contents
Query
Lucene bao gồm một số các lớp con Query cụ thể như BooleanQuery, PharaseQuery, PrefixQuery, PharasePrefixQuery, RangeQuery, FilteredQuery, SpanQuery
TermQuery
TermQuery là loại truy vấn cơ bản nhất hỗ trợ trong Lucene, và nó là một trong các loại truy vấn chính. Nó được sử dụng để tìm các tài liệu mà có chứa các trường với các giá trị cụ thể.
Hits
Lớp Hits có tác dụng để xếp hạng các kết quả tìm kiếm. Khi muốn xử lý, thao tác với các kết quả trả về thì ta khai báo đối tượng của lớp Hits
VẤN ĐỀ CẦN NGHIÊN CỨU
HyperText Transfer Protocol
Định dạng địa chỉ (Internet addressing)
Địa chỉ Internet là cách kết hợp nhiều phần thành một địa chỉ, địa chỉ đó xác định duy nhất một tập tin trên Internet. Nguồn thông tin trên Internet là vô cùng lớn vì thế chúng ta cần phải chỉ định chính xác thông tin nào chúng ta cần tìm kiếm. Địa chỉ Internet giúp ta giải quyết vấn đề này.
Định dạng URI
URI là viết tắt của Uniform Resources Indentifier) là dạng địa chỉ cơ bản dùng trên Internet. URIs được hình thành từ hai phần:
Scheme: scheme-specific-path
Scheme: tên giao thức truy cập
Giao thức
Diễn giải
Data
Dữ liệu được mã hóa dưới mã Base64
File
Dữ liệu là tập tin lưu trữ ở hệ thống cục bộ
FTP
Data được truyền bằng giao thức FTP(file transfer protocol)
HTTP
Data được truyền bằng giao thức HTTP
HTTPS
Data được truyền bằng giao thức HTTP bảo mật
GOPHER
Data được truyền bằng giao thức Gopher
MAILTO
Data được truyền bằng giao thức Simple Mail Transfer Protocol
NEWS
Data được truyền bằng dùng News server
TELNET
Data được truyền bằng kết nối Telnet
Bảng 3 Các giao thức thường gặp
Phần thứ hai của định dạng URI là scheme-specific-path không theo một cú pháp chuẩn nào nhưng thường có dạng:
host/path?query
Ví dụ: với liên kết thì host sẽ là www.java2s.com còn path là /java/path.
Định dạng URL
URL là viết tắt của Uniform Resources Locators đây là địa chỉ chỉ định đến tài nguyên cụ thể trên Internet. Chẳng hạn là địa chỉ trỏ đến hình ảnh pic.gif trên web server. URL được hiểu như là con trỏ trỏ đến tài nguyên trên World Wide Web, tài nguyên ở đây có thể là tập tin hay thư mục, hay nó cũng có thể tham chiếu đến các tài nguyên phức tạp khác như truy vấn một cơ sở dữ liệu hay một máy tìm kiếm, một chương trình CGI-BIN, một serlet hay một JSP page.
Scheme://hostname :port/path ?query#anchor
Các thành phần của một URL
Scheme
Chỉ định giao thức truy cập, thông thường là HTTP và HTTPS
host
Đây là server mà tài liệu được lưu trữ, có thể là tên hoặc địa chỉ IP
port
URL có tùy chọn chỉ định cổng. Mặc định cổng 80 cho giao thức HTTP và 443 cho HTTPS.
path
Đường dẫn thực sự chỉ đến tập tin được yêu cầu tới server
anchor
Chỉ đến vị trí ở bên trong tài liệu. Điểm neo thực sự là chuỗi ngắn tương tự như một label
Bảng 4 Các thành phần của một URL
Địa chỉ URL tương đối
Đôi khi chỉ một phần của địa chỉ URL được chỉ định. Thay vì phải dùng toàn bộ địa chỉ như đôi khi ta thấy chỉ là /images/logo.gif hay /logo.gif hay đôi khi chỉ logo.gif những địa chỉ như trên gọi là địa chỉ tương đối.
Khi xử lý địa chỉ tương đối ta cần phải dựa vào địa chỉ của trang web chứa nó ta mới xác định được địa chỉ tuyệt đối.
Nếu địa chỉ bắt đầu bằng / thì địa chỉ sẽ là: host + địa chỉ tương đối. Chẳng hạn trong trang có chứa địa chỉ tương đối là /images/pic.gif thì lúc này địa chỉ đó chính là
Nếu địa chỉ tương đối không bắt đầu bằng / thì có nghĩa là nó nằm cùng thư mục với trang web đang được xem. Cũng như trên nhưng nếu địa chỉ của trang mà chứa địa chỉ tương đối là thì lúc này ta được địa chỉ sẽ là
HTTP request
Chức năng cơ bản của một crawler hay spider là truy xuất trang web dùng HTTP. Thông thường thì các crawler hay các spider chỉ truy xuất các nội dung là HTML và nó có thể bỏ qua thời gian tiêu tốn cho công việc tải các hình ảnh. Cũng như các giao thức Internet khác, HTTP được định nghĩa bởi RFC nó được trình bày trên RFC2616. Tài liệu RFC này trình bày cấu trúc của phiên làm việc của HTTP (HTTP session).
Một yêu cầu HTTP được bắt đầu từ trình duyệt web. Trình duyệt web gửi yêu cầu đến web server và web server sẽ phản hồi. Khi một kết nối được thiết lập, vài dòng văn bản đơn giản mô tả yêu cầu sẽ được gửi lên server. Sever sẽ phản hồi với một vài header cùng với dữ liệu được yêu cầu. HTTP header chứa một số thông tin quan trọng như thời gian cuối sửa đổi trang web, loại web server đang sử dụng v.v…Ví dụ:
HTTP/1.1 200 OK
Connection: Keep-Alive
Server: Microsoft-IIS/4.0
Content-Type: text/html
Cache-control: private
Transfer-Encoding: chunked
Via: 1.1 c760 (NetCache 4.1R4D1)
Date: Tue, 13 Mar 2001 03:55:05 GMT
HTTP GET request
HTTP GET request là phổ biến nhất trong các HTTP request. Hầu như mỗi yêu cầu truyền trên Internet là các GET request. Nói chúng bất kì trang nào được nhận mà không phải là hình thức submit từ form thì là GET request. Phía Client phải khởi tạo request bằng cách gửi một gói request. Gói request có dạng như sau :
GET /grindex.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/vnd.ms-powerpoint, application/vnd.ms-excel,
application/msword, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Host: www.classinfo.net
Connection: Keep-Alive
Cookie: ASPSESSIONIDGGGGQHPK=BHLGFGOCHAPALILEEMNIMAFG
Dòng đầu tiên chứa thông tin quan trọng nhất. Từ GET ở dòng đầu tiên nhận định đây là GET request. Trường tiếp theo trên dòng này chỉ định tài nguyên. Tài nguyên thường là tên đường dẫn bắt đầu bằng dấu / (có ý nghĩa là trực tiếp từ gốc). Thông tin từ phía server phản hồi lại gọi là response, ví dụ một response cho GET resquest phía trên như sau :
HTTP/1.1 200 OK
Connection: Keep-Alive
Server: Microsoft-IIS/4.0
Content-Type: text/html
Cache-control: private
Transfer-Encoding: chunked
Via: 1.1 c760 (NetCache 4.1R4D1)
Date: Tue, 13 Mar 2001 03:55:05 GMT
... the rest of the HTML document ...
Response cho GET Request có hai phần phần header và phần body được ngăn cách nhau bởi một dòng trống. Phần body chính là tài nguyên mà client yêu cầu.
HTTP POST request
Tương tự như HTTP GET request nhưng HTTP POST request có thêm phần body dùng để gửi dữ liệu lên cho server. Các dữ liệu thường được điền vào các form và khi form này được submit thì các thông tin trong form được gửi cho server.
HTTP HEAD request
HTTP HEAD request là yêu cầu mà ít được dùng nhất trong các loại yêu cầu của HTTP. HTTP HEAD chỉ được sử dụng bởi browser dùng để xác nhận sự tồn tại của tài liệu mà không cần tài liệu được gửi về. Loại yêu cầu này thường được các search engine cũng như các web directory gửi đến server nhằm mục đích xác nhận liên kết có còn tồn tại hay không. HTTP HEAD không mất nhiều thời gian để cho server xử lý vì không có dữ liệu nào được gửi đi ngoại trừ request header.
Lập trình đa luồng trong java
Thread là gì?
Một thread thực thi một loạt các câu lệnh. Một số thread có thể chạy trong toàn bộ vòng đời của một chương trình hay chỉ tồn tại trong chỉ một vài mili giây. Một thread cũng có thể tạo ra một thread hay kết thúc một thread khác. Phương thức và hàm khởi tạo được cấp phát bên trong bộ nhớ, tự các phương thức và hàm khởi tạo không thể hoạt động. Thread chạy bên trong các phương thức hay các hàm khởi tạo theo các dòng lệnh.
Ta có thể dùng Thread để thực hiện các công việc:
Khởi tạo trong thời gian dài
Công việc dùng vòng lặp hay liên quan đến thời gian
Thực thi sự kiện không đồng bộ
Công việc mang tính đa nhiệm (multistasking)
Thread trong ngôn ngữ Java
Giới thiệu lớp java.lang.Thread
Trong ngôn ngữ lập trình Java định nghĩa lớp java.lang.Thread dùng để tạo và điều khiển Thread. Khi một Thread được tạo ra nghĩa là một đối tượng của lớp java.lang.Thread được khởi tạo. Và khi hàm Thread.start() được gọi thì lúc đó Thread mới thực sự hoạt động, nó sẽ thực thi hàm run(). Có hai cách khởi tạo Thread:
Thứ nhất là tạo lớp kế thừa từ lớp Thread, và lớp này sẽ thực thi hàm run() của riêng nó.
Thứ hai là thực thi Runable Interface. Trong Java không có đa kế thừa, nên khi một lớp đã kế thừa từ một lớp khác thì nó không thể kế thừa lớp Thread được nên lúc này thì cần phải tạo theo cách này.
Hình 8 Vòng đời của một Thread
Các hàm khởi tạo:
Thread()Thread(Runnable)Thread(ThreadGroup)Thread(String)Thread(ThreadGroup,String)Thread(Runnable,String)Thread(ThreadGroup,Runnable,String)
Tham số kiểu String là tên của Thread. Tham số kiểu Runable là đối tượng thực thi lớp Runable. Tham số GroupThread là nhóm Thread dùng để dễ quản lý Thread.
Các phương thức của Thread:
start() phương thức này bắt đầu chạy Thread, thực thi hàm run() của lớp Runable đích. Hàm này chỉ được gọi một lần
suspend() phương thức này treo một phương thức đang chạy, nó sẽ bị treo cho đến khi hàm resume() được gọi
resume() lớp này sẽ thực thi Thread bị treo
stop() lớp này dừng và chấm dứt một Thread, nhưng muốn chấm dứt một thread bị treo thì ta phải resume Thread vì stop() chỉ có tác dụng trên các Thread đang chạy
sleep() Thread sẽ tạm dừng trong khoảng thời gian, thời gian được đưa vào trong tham số của Thread
Đồng bộ hóa các Thread
Cách ngăn chặn dữ liệu không bị hỏng bởi nhiều Thread tác động vào nó cùng lúc ta dùng kỹ thuật “critical region” tạm gọi là vùng “gay cấn”. Tức là khi đã có một Thread đi vào vùng này rồi thì các Thread khác sẽ không được vào vùng này nữa. Chỉ khi Thread ra khỏi cùng này thì Thread khác mới được vào. Trong ngôn ngữ Java dùng từ khóa synchronized để định nghĩa vùng critical region.
Phân tích HTML
Hầu hết các nguồn thông tin lưu trên Internet đều ở dạng html. Ta cần phải hiểu rõ cấu trúc của một trang html để xây dựng một chương trình crawler.
Bốn thành phần cơ bản của Html
Text
Comment
Simple Tag
Beginning Tag và Ending Tag
Text
Text là văn bản là những từ mà chúng hiển thị trên một trình duyệt web. Ngoại trừ những đoạn code còn phần văn bản nào không là tag thì được xem là văn bản. Phần văn bản thì được điểu khiển bởi các tag bao nó. Ví dụ như ta có hai tag và phần văn bản như: Hello World
Như đã đề cập trước đó, có một trường hợp dữ liệu nằm bên ngoài một tag nhưng không được xem là văn bản đó là script code. Hầu hết các đoạn mã hay gặp trong trang html là JavaScript. JavaScript là một chương trình nhỏ nằm bên trong các trang html giữa các tag Đoạn mã JavaScript Crawler cần phải phân biệt giữa text và mã JavaScipt . Ví dụ ta có đoạn mã sau:
var wpop_;
function myfunct(para)
{
if(wpop_&&!wpop_.closed)
{
wpop_.location.href=para;
}
wpop_.focus();
}
Trình duyệt web chỉ thực thi đoạn mã trên và dĩ nhiên chúng không được hiển thị trên trang web.
Comments
Comments (phần chú thích) cũng là một thành phần của trang html nhưng không được hiển thị cho người dùng. Phần chú thích thường nằm bên trái ở dưới bên trong hai tag sau tag chẳng hạn như:
Comment cũng còn được dùng để giấu các đoạn mã JavaScript đối với các trình duyệt không hỗ trợ JavaScript. Ví dụ:
<!--
var wpop_;
function myfunct(para)
{
if(wpop_&&!wpop_.closed)
{
wpop_.location.href=para;
}
wpop_.focus();
}
//-->
Bởi vì mục đích của crawler là tìm ra phần text nên phải cần phân biệt giữa text và phần chú thích để crawler sẽ bỏ qua phần chú thích khi gặp.
Simple Tag
Simple Tag là phần tag trong html mà chỉ có một tag duy nhất. Chẳng hạn như những Simple Tag phổ biến như break và image những tag này không có tag kết thúc và . Ví dụ:
First line of text
Second line of text
Third line of text
Beginning Tag và Ending Tag
Hầu hết các html Tag đều bao hàm Beginning Tag và Ending Tag. Sự khác nhau giữa Simple Tag và Beginning Tag là Beginning Tag sẽ có Ending Tag để kết thúc. Ending Tag giống như Beginning Tag nhưng có thêm dấu gạch / ở phía trước. Ví dụ:
Ở trên là Beginning Tag còn là Ending Tag
Thành phần mà crawler phân tích
Navigating with HyperLinks
Siêu liên kết HyperLinks hay Links được định nghĩa để kết nối các tài liệu trên Internet với nhau. Crawler sẽ đi theo các links này để tìm kiếm thông tin. Nhờ các links này mà Crawler có thể hoạt động liên tục đi từ tài liệu này đến tài liệu khác vậy nên crawler cần phải nhận ra chúng.
Click Here
Trong đoạn mã trên thì chỉ có phần text Click Here được hiển thị lên cho người truy cập. Thuộc tính alt dùng để khi người dùng lướt chuột vào phần text Click Here sẽ xuất hiện một “popup” nhỏ như là một phần chú thích mang dòng chữ Go Here. Đây là thuộc tính không cần thiết lúc nào cũng phải có nhưng nếu có thì nó sẽ giúp cho crawler dễ dàng nhận ra các liên kết. Thuộc tính href sẽ chứa các liên kết. Crawler cần phải truy xuất được nội dung của các liên kết này và phân tích để có thể đến được một trang web khác. Sở dĩ phải phân tích bởi vì không phải lúc nào cũng nhận được liên kết là có thể tới trang web đích ngay mà crawler cần phải phân tích giữa liên kết tuyệt đối và liên tương đối. Địa chỉ tương đối và địa chỉ tuyệt đối đã được trình bày ở phần HyperText Protocol.
Image Maps
Đôi khi hình ảnh cũng được dùng để cho công việc liên kết các trang web với nhau. Khi người dùng click chuột vào một hình ảnh sẽ dẫn tới một trang web khác. Ví dụ:
Parsing Form
Nhiều trang web chứa một thành phần gọi là form mở đầu bằng và kết thúc . Phía trong form thì có các thành phần khác thường là các tag . Với form người dùng sẽ điền thông tin vào và gửi lên server, server sẽ xử lý các yêu cầu này và trả về thông tin. Nội dung trả về có thể đưa đến một trang web khác.
User ID
Password
Crawler cũng cần phải nhận ra các liên kết dạng như trên.
Table
Bảng là thành phần quan trọng trong các trang Html. Nhờ bảng dữ liệu sẽ được hiển thị đẹp hơn và đây là phần mà chứa phần văn bản nhiều trong một trang html. Trong bảng có các tag :
định nghĩa một bảng.
định nghĩa một tiêu đề trong bảng.
định nghĩa các dòng
định nghĩa các ô trong một dòng
Ví dụ :
Header 1Header 2Header 3
col1,row1col2,row1col3,row1
col1,row2col2,row2col3,row2
col1,row3col2,row3col3,row3
Với đoạn mã trên ta sẽ có bảng như sau :
Hình 9 Bảng trong Html
Trong quá trình phân tích đánh chỉ mục cho các trang html thì cần phải chú ý đến các bảng. Vì nội dung bằng văn bản thường được nằm nhều trong phần này.
Vấn đề cần xử lý
Xử lý với JavaScript
Thử thách mà các crawler gặp khi đối mặt với mã JavaScript thể hiện ở hai khía cạnh. Thứ nhất crawler không được nhầm lẫn mã JavaScript với các nội dung text thực sự. Thứ hai thỉnh thoảng mã JavaScript cũng dùng để chuyển hướng đến một địa chỉ khác. Crawler cần phải nhận biết được hai khó khăn này.
Bởi vì mã JavaScript thường nằm giữa các HTML chú thích, như đã được thảo luận trước, các chương trình spider đơn giản thường sẽ lọc bỏ mã JavaScript và không đối phó với nó, quá trình xử lý này là tương đối dễ dàng. Để thực hiện điều này, chương trình spider cần phải được biết rõ về cấu trúc các HTML chú thích để nhận ra mã Javascript, và nó phải biết không cần xử lý dữ liệu bên trong các chú thích này. Bởi vì JavaScript luôn luôn được chứa giữa các thẻ , spider cần nạp tri thức để nhận biết các thẻ này và bỏ qua chúng nếu gặp phải.
Đối phó với mã JavaScript mà được sử dụng để chuyển hướng tới một trang khác là đặc biệt phiền hà cho crawler. Lúc này JavaScript được dùng để tạo ra một liên kết sẽ chuyển đến một trang kế tiếp. Ví dụ:
Trợ giúp
Spider sẽ thấy những dòng này và cố gắng phân tích thuộc tính href để lấy giá trị csssủa thuộc tính. Tuy nhiên, giá trị bên trong thuộc tính href là một hàm JavaScript thay vì thật sự là một URL. Hàm JavaScript được gọi là sẽ đưa người dùng đến một cửa sổ mới, nhưng không có cách nào để spider có thể thực hiện lần theo liên kết này. Để thực hiện khả năng theo các liên kết dạng này, các spider phải có khả năng thông dịch mã JavaScript. Có hai cách để giải quyết vấn đề. Đầu tiên là dành cho người lập trình, người lập trình sẽ giải quyết đích mà các liên kết chỉ đến. Sau đó, người lập trình sẽ thêm các trang đích này như là một phần của mã chương trình. Thật không may, cách thức giải quyết vấn đề là không mềm dẻo bởi vì nếu liên kết có bị thay đổi trên trang web, spider sẽ vẫn sử dụng các liên kết cũ, và do đó, nó sẽ không thể tìm thấy những điểm đến mới. Nhưng trong trường hợp gặp các liên kết JavaScript, ta thường không có nhiều sự lựa chọn. Đây là một ví dụ về cách làm việc này. Ví dụ nếu ta biết rằng khi ta nhấp chuột vào một liên kết, ta sẽ được gửi đến một tập tin có tên target.jsp, sau đó ta có thể xây dựng thực tế này vào chương trình. Mỗi lần theo các liên kết JavaScript , chương trình của ta chỉ cần chèn liên kết target.jsp chứ không phải cố gắng để giải quyết mã JavaScript. Dưới đây là hàm mà sẽ tìm kiếm bất kì liên kết nào bắt đầu bằng "javacript:", cho thấy cách thức này được thực hiện như thế nào: String resolveLink (String url) ( / / Kiểm tra xem nếu các liên kết là một Javascript nếu (url.beginsWith ( "javascript:")) return "target.jsp"; khác return url; )
Một cách khác để giải quyết vấn đề phức tạp hơn. Về cơ bản, giải quyết bằng cách sử dụng Rhino, một mã nguồn mở thực thi các mã JavaScript mà được viết hoàn toàn bằng Java, spider được mở rộng (extends) từ nó thì có thể nhận ra mã JavaScript. Rhino thường nhúng vào các ứng dụng Java để cung cấp các cho người sử dụng cuối.
Xử lý Frame
Có thể nói Frame là một kẻ đối địch của crawler bởi các frame che dấu hoàn toàn các thông tin chứa trong nó. Một trang html có s
Các file đính kèm theo tài liệu này:
- LVTN_PhanTanLuan_04T1.doc