TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
──────── * ───────
BÁO CÁO PROJECT I
Đề tài : Xây dựng một Crawler
Sinh viên thực hiện : Bùi Văn Toàn
Lớp : CNTT2 – K54
Giảng viên hướng dẫn : Trần Đức Khánh
Hà Nội, tháng 12 năm 2011
1
LỜI NÓI ĐẦU
Mục tiêu của báo cáo:
- Nhằm củng cố, bổ sung, tăng cường kiến thức, kĩ năng xây dựng và phát
triển .
- Tổng kết những vấn đề đã thực hiện được và chưa thực hiện được để tiến
hành rút ra những kinh nghiệm .
Em xin gửi lời cảm ơn tới thầy Trần Đức Khánh vì đã tạo rất nhiều điều kiện
thuận lợi trong học phần ProjectI này !
2
MỤC LỤC
Lời mở đầu:
Phần I : Cơ Sở Lý Thuyết………………………………………………… …4
Chương III : Cài đặt công cụ tìm kiếm theo lĩnh vực chuyên sâu
3.1. Phương hướng cài đặt hệ thống tìm kiếm ………………………… 4
3.2. Kiến trúc của Nutch………………………………………………… 5
3.3. Hoạt động của Nutch crawler…………………………………… … 6
Phần II: Cài Đặt Một WebCrawler
2.1 Yêu cầu bài toán ……………………………………………………… 14
2.2 Chi tiết cài đặt………………………………………………………….14
Kết luận :
3
Phần I : CƠ SỞ LÝ THUYẾT
Chương III
CÀI ĐẶT THỬ NGHIỆM CÔNG CỤ THU THẬP THÔNG TIN THEO LĨNH
VỰC CHUYÊN SÂU
3.1. Phương hướng cài đặt hệ thống tìm kiếm thông tin theo lĩnh vực
chuyên sâu
Để thực hiện cài đặt hệ thống tìm kiếm thông tin theo lĩnh vực chuyên
sâu như ý tưởng đã trình bày trong chương II, nhóm SE2010 chúng tôi đã lựa
chọn Nutch. Bởi Nutch là thư viện mã nguồn mở trên nền Java do Apache
Foundation phát triển nhằm đơn giản hóa việc xây dựng một máy tìm kiếm.
Sử dụng Nutch. Người dùng có thể tạo ra một máy tìm kiếm cho riêng mình
với đầy đủ các thành phần: Thu thập tài liệu, đánh chỉ mục, tìm kiếm dựa
trên câu truy vấn, giao diện người dùng.
Nutch phát triển dựa trên hai bộ thư viện mã nguồn mở nổi tiếng của
Apache là Lucene và Hadoop.
(
1
)
Nutch = Crawler + Indexer/Searcher (Lucene) +
GUI/Plugins/MapRedce/Distribited File System (Hadoop)
Một số ưu điểm chính của Nutch:
• Tính trong suốt: Các máy tìm kiếm trên thị trường không tiết lộ với
người dùng về giải thuật được xây dựng bên trong đặc biệt là giải
thuật Ranking các trang kết quả. Với Nutch, người dùng không chỉ có
thể xem các giải thuật mà còn có thể can thiệp hoặc viết lại các giải
thuật đó.
1
4
• Tính mở: Bằng việc chỉnh sửa giải thuật được cài đặt, Nutch có thể trở
thành một máy tìm kiếm theo chủ đề.
• Tính tận dụng: Như mọi hệ thống mã nguồn mở khác, sử dụng Nutch là
việc kế thừa thành quả lao động của cộng đồng giúp tiết kiệm thời gian
và công sức phát triển.
• Tích hợp: Nhiều công nghệ tiến tiến liên quan đến xử lý văn bản và có
thể xử lý dữ liệu lớn (scalability) đã được tích hợp trong Nutch.
3.2. Kiến trúc của Nutch
Kiến trúc của Nutch Error: Reference source not found được minh họa
bởi hình 3.1. Hệ thống Nutch sử dụng một kho dữ liệu về các trang web (web
db) để lưu trữ địa chỉ tất cả các trang web đã biết và các link nằm trong các
trang đó. Web db cung cấp địa chỉ các trang sẽ được lấy về cho bộ download
dưới dạng một danh sách địa chỉ (fetch list). Bộ download (fetcher) gồm
nhiều thành phần hoạt động song song có thể download đồng thời nội dung
của nhiều trang nhằm tận dụng băng thông. Dữ liệu lấy về được cập nhật vào
trong web db để phục vụ cho việc tạo ra các fetch list tiếp theo.
Sau khi hoàn thành quá trình lấy dữ liệu từ Internet, bộ đánh chỉ mục
(Indexer) tiến hành đánh chỉ mục và sắp xếp. Giao diện người dùng trên các
máy chủ web (web server) đưa câu truy vấn vào bộ tìm kiếm (searcher) để
tìm kiếm trên dữ liệu đã đánh chỉ mục và trả lại kết quả cho người dùng.
(
2
)
2
5
Hình 3.: Kiến trúc một máy tìm kiếm dựa trên Nutch.
Theo kiến trúc này thì Crawler, Indexer, Searcher hoạt động độc lập và
chỉ phụ thuộc về mặt dữ liệu. Điều này cho phép chúng ta thay đổi cách thức
hoạt động của từng thành phần mà không ảnh hưởng tới thành phần khác.
(
3
)
3.3. Hoạt động của Nutch crawler
Crawler hoạt động theo từng chu kỳ, tổng số chu kỳ gọi là độ sâu (depth)
trong một lần thu thập thông tin. Mỗi chu kỳ sẽ có tối đa
N
tài liệu được lấy
về. Theo cấu hình của Nutch thì
18
10290 ×<< .N
.
Crawler hoạt động qua 5 bước và được minh họa bởi Hình 3.
(
4
)
:
1:. Ịnject: Bắt đầu với một số trang hạt giống được "tiêm" vào cơ sở dữ liệu
link (CrawlerBD);
2:. Generate: Lấy ra các link cần duyệt từ CrawlDB và cho vào hàng đợi (Fetch
list);
3:. Fetch: Lấy về nội dung của các trang trong fetch list;
3
4
6
4:. Parse: Đọc nội dung đã được lấy về để trích rút ra các link mới và nội dung
các link dưới dạng text đơn thuần;
5:. Update: Cập nhật CrawlerDB với các link đã được trích rút ở bước 4.
Bước 2 đến bước 5 được lặp lại cho đến khi đạt được độ sâu cần thiết
hoặc số lượng tài liệu theo ý.
Hình 3.: Sơ đồ hoạt động của crawler.
3.3.1. Cấu trúc thư mục làm việc của Nutch
Một phiên làm việc của Nutch được lưu trữ dưới dạng cây thư mục
(Hình 3.). Trong đó:
a. CrawlerDB
CrawlerDB là cơ sở dữ liệu về các trang đã biết và đã được duyệt.
Crawler lưu trữ thông tin về từng trang như: trạng thái, thời gian của lần
duyệt cuối cùng, lấy về có thành công không, khoảng thời gian giữa hai lần
duyệt, mã hóa nội dung của trang, CrawlerDB được tổ chức dưới dạng map
file gồm các bản ghi có trường
umCrawlerDat,URL
,
URL
sử dụng kiểu dữ
7
liệu text của Hadoop để lưu trữ địa chỉ của trang.
umCrawlerDat
là một lớp
của Nutch để lưu trữ trạng thái của một trang gồm có các thông tin ở trên.
CrawlerDB được khởi tạo bởi Ịnjector. Ịnector đơn giản chỉ chuyển một
tệp văn bản chứa các trang hạt giống (seed URL) sang dạng map file
Crawler,URL
. Trong quá trình thu thập tài liệu, Crawler được cập nhật sau
mỗi chu kỳ bằng các địa chỉ đã được lấy về và các địa chỉ mới được trích rút
ra.
Hình 3.: Cấu trúc thư mục làm việc của Nutch Crawler.
b. LinkDB
LinkDB lưu trữ thông tin về đồ thị link sau khi một phiên làm việc kết
thúc. LinkDB được tổ chức dưới dạng map file
Inlinks,URL
trong đó
Inlinks
là một lớp của Nutch chứa danh sách các địa chỉ và anchor text trỏ tới URL.
LinkDB không có sẵn mà được tạo ra bằng cách sử dụng mô hình
MapReduce của Hadoop. LinkDB rất có ích trong việc huấn luyện cho crawler
hoặc tính độ quan trọng của một trang tài liệu (page ranking).
8
c. Segments
Mỗi segment lưu trữ dữ liệu của một chu kỳ. Mỗi segment sẽ được lưu
trữ vào trong một thư mục có tên được ghi theo dạng năm-tháng-ngày-giờ-
phút-giây. Chẳng hạn, một chu kỳ bắt đầu làm việc vào lúc 11 giờ 20 ngày 10
tháng 5 năm 2010, khi đó dữ liệu của chu kỳ này sẽ được chứa trong một thư
mục có tên: 20100510112036. Mỗi segment chịu trách nhiệm thu thập một
tập các trang và trích rút ra các thông tin cần thiết. Segment được tổ chức
với các thư mục con như sau:
Content:
Chứa dạng dữ liệu gốc (raw) của các trang được lấy về, được tổ chức
dưới dạng map file
Content,URL
. Content là một lớp của Nutch chứa
thông tin dưới dạng gốc của một trang.
Crawl_generate:
Chứa danh sách địa chỉ các trang được lấy về trong chu kỳ làm việc
này. Danh sách được lấy ra từ crawlerDB bởi Generator và được tổ
chức dưới dạng file tuần tự
CrawlDatum,URL
.
Crawler_fetch:
Chứa thông tin về các địa chỉ trong
generate_crawl
sau khi lấy về,
được lưu trữ dưới dạng map file
CrawlDatum,URL
. Danh sách URL
trong
fetch_crawl
giống như trong
generate_crawl
chỉ có
CrawlDatum được cập nhật các thông tin về việc download có thành
9
công hay không, thời gian download, Thông tin trong crawl_fetch
chính là thông tin dùng để cập nhật cho CrawlDB sau mỗi chu kỳ.
Crawl_parse:
Được tổ chức dưới dạng file tuần tự
CrawlDatum,URL
, là các địa chỉ
mới được lấy ra sau quá trình trích rút các trang mới được lấy về.
Thông tin về các trang mới này được bổ sung vào cho CrawlDB để mở
rộng cơ sở dữ liệu link phục vụ cho các chu kỳ hoạt động sau.
Parse_date:
Lưu trữ dạng map file
ParseData,URL
. ParseDate là một lớp của
Nutch lữu trữ thông tin (
text anchor ,URL
) về các out-link xuất phát từ
URL. Các out-link này đồng thời được lưu trữ trong
parse_crawl
.
Anchor text của các out-link là cơ sở để "nhìn trước" tiềm năng trong
quá trình thu thập thông tin.
Parse_text:
Các trang khi đã được tải về và cắt bỏ hết thông tin thừa chỉ còn lại là
dạng văn bản. Lưu trữ dạng map file
ParseText,URL
, trong đó
ParseText
chứa dạng văn bản của URL.
d. Index và Indexes
10
Hai thư mục này sinh ra sau khi quá trình đánh chỉ mục được thực
hiện. Hai thư mục này chứa các chỉ mục trỏ tới dữ liệu trong các segment cụ
thể.
3.3.2. Phiên làm việc của Nutch Crawler
Hình 3.: Phiên làm việc của Nutch Crawler.
Phiên làm việc của Nutch Crawler (Hình 3.), Error: Reference source
not found: Đầu tiên, Injector khởi tạo một danh sách trang hạt giống vào
CrawDB. Sau đó, mỗi chu kỳ tạo một thư mục dành riêng cho segment và đều
lặp lại các bước sau:
1:. Generator sử dụng CrawlDB để lấy ra
N
địa chỉ có đủ điều kiện (chưa
download lần nào hoặc download lần cuối vượt quá khoảng thời gian giữa
hai lần download định trước, ). Những địa chỉ này được chuyển vào thư
mục con
generate_crawl
và chờ để được download.
2:. Fetcher là bộ có chức năng download một cách song song đa luồng nhiều
địa chỉ cùng lúc. Có nhiều fetcher cùng hoạt động. Mỗi fetcher chịu trách
nhiệm download một địa chỉ tại một thời điểm. Các fetcher được cấp phát
11
địa chỉ bởi queue feeder, một lớp của Nutch có nhiệm vụ kiểm soát tốc độ
download, số fetcher hoạt động trên một máy chủ đề tránh vô tình làm sập
máy chủ.
Nội dung gốc của các trang lấy về được lưu trữ trong thư mục
content. Ngoài ra, tình trạng của các địa chỉ được lấy về có thành công hay
không được cập nhật và ghi lại vào thư mục
fectch_crawl
.
3:. Parse lấy nội dung gốc của từng trang và phân tích để trích rút ra định
dạng văn bản của trang đó, các địa chỉ mới. Định dạng văn bản của từng
trang được lưu trữ tại
text_parse
. Các địa chỉ mới được lưu trữ trong
parse_crawl
. Cấu trúc out-link được lưu trữ tại
data_parse
.
4:. Updater sử dụng
parse_crawl
cập nhật thông tin về các trang được
download và bổ sung địa chỉ mới vào CrawlDB, CrawlDB mới sẽ phục vụ
cho việc tạo ra danh sách địa chỉ cần download cho một segment mới.
Kết thúc quá trình thu tập thông tin,
data_parse
của từng segment
được sử dụng để tạo ra đồ thị link của toàn bộ các trang đã biết. Tiếp theo,
tất cả các segment cung cấp thông tin cho quá trình đánh chỉ mục.
3.3.3. Phiên làm việc của Nutch Crawler có ứng dụng học tăng cường
Tương tự như phiên làm việc của Nutch crawler như đã trình bày ở
trên, nhưng ngay sau quá trình parse thì dữ liệu của
data_parse
và
text_parse
sẽ được đưa vào khối tiền xử lý của modul tách từ tiếng Việt (tách
câu). Đầu ra của modul tách từ tiếng Việt sẽ được đưa vào khối tiền xử lý của
12
modul phân loại văn bản bằng SVM. Rồi thực hiện tính độ quan trọng của tài
liệu và anchor text. Kết quả tính toán này sẽ được đẩy vào modul điều khiển.
Nếu độ quan trọng của tài liệu và anchor text được quan tâm (đúng
chủ đề) thì cho phép thực hiện các bước: Fetcher; Parse và Updater như đã
biết với phiên làm việc của Nutch Crawler.
Nếu độ quan trọng của tài liệu và anchor text không đáng được quan
tâm (khác chủ đề) thì bỏ qua. Rồi tiếp tục vòng lặp khác.
Phiên làm việc này được minh họa trên Hình 3
Seed urls
CrawlDb
Generator
Segment N
Crawl_generate
13
Crawl_fetch
Content
Crawl_parse
Parse_data
Parse_text
Fetcher
Parse segment
Updater
LinkDb
LinkDb invertlinks
Injector
VnTokenizer
SVM
Indexer
Lucene index
1
6
2
3
Đúng chủ đề
Đ
Tính độ quan trọng của tài liệu và anchor text
14
Bỏ qua
S
4
5
Hình 3.: Phiên làm việc của Nutch Crawler có ứng dụng học tăng
cường.
Phần II : CÀI ĐẶT MỘT WEBCRAWLER
2.1 Yêu cầu bài toán :
Xây dựng Crawler hay còn gọi là bộ thu thập thông tin . Nó là một trong 3
thành phần chính tạo nên bộ tìm kiếm : Crawler, Indexer và Searcher
2.2 Chi tiết cài đặt :
Thuật toán :
Đầu vào của người dùng: URL bắt đầu vào mong muốn
loại tập tin. Thêm URL vào danh sách URL để tìm kiếm.
While ( danh sách các URL để tìm kiếm not null)
{
Lấy địa chỉ URL đầu tiên trong danh sách.
Di chuyển URL vào danh sách các URL đã được tìm kiếm.
Kiểm tra URL để đảm bảo giao thức của nó là HTTP
(if not, thoát ra khỏi vòng lặp, trở lại "while").
dù có một tập tin robots.txt tại trang web này
bao gồm một tuyên bố "Không cho phép".
(if có, thoát ra khỏi vòng lặp, trở lại "while".)
thử "mở" URL (có nghĩa là lấy
tài liệu từ Web).
if nó không phải là một tập tin HTML, thoát ra khỏi vòng lặp,
15
trở lại "while."
Bước qua các tập tin HTML.
While( các văn bản HTML chứa một liên kết khác)
{
Xác nhận URL của liên kết và làm cho robot chắc chắn là
cho phép (chỉ trong vòng lặp bên ngoài).
if nó là một file HTML,
if URL không có mặt trong tìm kiếm hoặc
danh sách hoặc danh sách đã tìm kiếm, thêm nó vào
danh sách tìm kiếm.
Khác nếu đó là loại tập tin người dùngyêu cầu,
Thêm vào danh sách các tập tin tìm thấy.
}
}
Chương trình chính : Về cơ bản giao diện của chương trình WebCrawler
Mô tả :
16
- StartURL : Là seedURL phải có giao thức “http://’’
- Search limit : Giới hạn của các link đã được thăm.
- Frontier : Các URL biên tức là tất cả các link lấy ra từ trang web đã và đang
được thăm.
- Visited URLs : Những trang URL đã được thăm và đã trích rút ra các link liên
kết .
- Các chức năng : Search , Stop , Clear( Clear Panel : Frontier , Visted URLs),
Exit.
Đầu vào : Là 1 URL phải có giao thức là “ http:// ”
Đầu ra sẽ : Là các link liên kiết phục vụ cho công đoạn Indexer và Searcher
Đánh giá :
- Chương trình cơ bản đáp ứng được yêu cầu của một WebCrawler.
- Khi nhập vào 1 URL chương trình sẽ tìm tất cả các Link liên kết trong trang
đó và tiếp tục vòng lặp đến khi đáp ứng điều kiện đặt ra.
Linh hoạt trong kiểm soát số lượng các link cần được viếng thăm ( có giới hạn
các link kết quả tìm kiếm )
17
KẾT LUẬN
Chương trình là sự nỗ lực rất nhiều của cá nhân em .
Trong thời gian tìm hiểu có hạn nên không tránh khỏi những thiếu sót , rất
mong được sự đóng góp của thầy giáo để chương trình được hoàn thiện hơn .
Em xin chân thành cám ơn !
18