ĐẠI HỌC QUỐC GIA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN
NGUYỄN BÌNH MINH KHAI THÁC DỮ LIỆU TRÊN WEB VÀ XÂY DỰNG ỨNG DỤNG HỖ TRỢ NHẬP LIỆU
LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN
HÀ NỘI – 2014
ĐẠI HỌC QUỐC GIA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN
NGUYỄN BÌNH MINH KHAI THÁC DỮ LIỆU TRÊN WEB VÀ XÂY DỰNG ỨNG DỤNG HỖ TRỢ NHẬP LIỆU
Ngành: Công nghệ thông tin Chuyên ngành: Quản lý hệ thống thông tin Mã số: Chuyên ngành đào tạo thí điểm
LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN
NGƯỜI HƯỚNG DẪN KHOA HỌC: TS. Nguyễn Văn Đoàn
HÀ NỘI - 2014
LỜI CẢM ƠN
Trước hết, tôi xin bày tỏ lòng cảm ơn chân thành TS. Nguyễn Văn Đoàn, là
người tận tình hướng dẫn tôi trong thời gian làm luận văn tốt nghiệp.
Tôi xin cảm ơn các thầy, cô giáo ở Viện Công nghệ thông tin - Đại học Quốc gia Hà Nội đã giảng dạy tôi trong suốt thời gian học tập tại viện và tạo điều kiện giúp đỡ tôi hoàn thành luận văn này. Cảm ơn các bạn bè, đồng nghiệp đã cổ vũ động viên tôi trong suốt quá trình học tập tại viện.
Tuy đã có những cố gắng nhất định nhưng do thời gian và trình độ có hạn nên chắc chắn luận văn này còn nhiều thiếu sót và hạn chế nhất định. Kính mong nhận được sự góp ý của thầy cô và các bạn.
Luận văn thạc sĩ này được thực hiện trong khuôn khổ đề tài nghiên cứu mang
mã số Chuyên ngành đào tạo thí điểm, Đại học Quốc gia Hà Nội.
Hà Nội, ngày 10 tháng 01 năm 2014
Học viên
Nguyễn Bình Minh
1
LỜI CAM ĐOAN
Tôi xin cam đoan kết quả đạt được trong luận văn là sản phẩm nghiên cứu, tìm hiểu của riêng cá nhân tôi. Trong toàn bộ nội dung của luận văn, những điều được trình bày hoặc là của cá nhân tôi hoặc là được tổng hợp từ nhiều nguồn tài liệu. Tất cả các tài liệu tham khảo đều có xuất xứ rõ ràng và được trích dẫn hợp pháp.
Tôi xin hoàn chịu trách nhiệm và chịu mọi hình thức kỷ luật theo quy định cho
lời cam đoan của mình.
Hà Nội, ngày 10 tháng 01 năm 2014
Học viên
Nguyễn Bình Minh
2
TÓM TẮT LUẬN VĂN
Trong những năm gần đây cùng với phát triển nhanh chóng của khoa học kỹ thuật là sự bùng nổ về tri thức. Kho dữ liệu, nguồn tri thức của nhân loại cũng trở nên đồ sộ, vô tận làm cho vấn đề khai thác các nguồn tri thức đó ngày càng trở nên nóng bỏng và đặt ra thách thức lớn cho nền công nghệ thông tin thế giới.
Hiện nay, lượng thông tin trên Internet càng ngày càng khổng lồ, điều này khiến việc sử dụng Internet để khai thác thông tin hữu ích, phục vụ cho các mục đích của tổ chức hay cá nhân luôn có những khó khăn nhất định của nó. Nhất là đối với những mục đích đòi hỏi cần khai thác thông tin với khối lượng lớn trên Web, chẳng hạn một công ty quảng cáo muốn thu thập thật nhiều thông tin liên lạc của các doanh nghiệp trong nhiều lĩnh vực để gửi thư quảng cáo. Những công việc như thế này nếu được thực hiện thủ công bằng sức người thì sẽ mất rất nhiều thời gian, công sức, và chúng cũng khá tẻ nhạt do tính chất phải lặp đi lặp một vài thao tác của việc thu thập dữ liệu.
Do những vấn đề cấp thiết được đề cập ở trên nên em chọn đề tài: “Khai thác dữ liệu trên Web và xây dựng ứng dụng hỗ trợ nhập liệu”. Mục tiêu của đề tài nhằm đưa ra phương pháp cũng như công cụ có khả năng hỗ trợ con người trong những bài toán có yêu cầu thu thập dữ liệu, giúp giảm thời gian và sức lực của con người nhưng vẫn đảm bảo tính toàn vẹn của dữ liệu.
3
MỤC LỤC
MỞ ĐẦU .................................................................................................................................... 7
CHƯƠNG 1. TỔNG QUAN VỀ KHAI THÁC DỮ LIỆU TRÊN WEB................................... 9
1.1
TÌM HIỂU CÁC KIẾN THỨC TỔNG QUAN .......................................................... 9
1.1.1 WORLD WIDE WEB ............................................................................................ 9
1.1.2 TRÌNH THU THẬP DỮ LIỆU WEB – WEB CRAWLER ................................... 9
1.1.3 TRÌNH BÓC TÁCH VÀ TRÍCH XUẤT THÔNG TIN – WEB SCRAPER ....... 10
1.1.4 PHÂN LOẠI WEB ............................................................................................... 11
1.1.4.1 Phân loại dựa vào sự thể hiện của tính động ................................................ 11
1.1.4.2 Phân loại dựa vào cách thức tạo ra tính động ............................................... 12
1.1.4.3 Khả năng của các web crawler ..................................................................... 12
1.2
CÁC CHIẾN LƯỢC THU THẬP DỮ LIỆU ........................................................... 13
1.2.1 CHIẾN LƯỢC THU THẬP DỮ LIỆU THEO CHIỀU SÂU .............................. 14
1.2.2 CHIẾN LƯỢC THU THẬP DỮ LIỆU THEO CHIỀU RỘNG ........................... 14
1.3
ĐÁNH GIÁ SƠ BỘ .................................................................................................. 15
CHƯƠNG 2. PHÂN TÍCH VÀ THIẾT KẾ ỨNG DỤNG ...................................................... 17
2.1
CÁC KIẾN THỨC NỀN TẢNG VÀ CÔNG NGHỆ LIÊN QUAN ........................ 17
2.1.1 HTML ................................................................................................................... 17
2.1.2 XML ..................................................................................................................... 18
2.1.3 XHTML ................................................................................................................ 19
2.1.3.1 Tính chuẩn của một tài liệu XML (well-formed) ......................................... 19
2.1.3.2 Tên các phần tử và tên các thuộc tính phải ở dạng chữ in thường ............... 19
2.1.3.3 Các thẻ không rỗng bắt buộc phải có thẻ đóng............................................. 19
2.1.3.4 Các thuộc tính luôn phải ghi rõ giá trị .......................................................... 20
2.1.3.5 Các phần tử rỗng ........................................................................................... 20
2.1.4 XPATH ................................................................................................................. 20
2.1.4.1 Cú pháp và ngữ nghĩa ................................................................................... 21
2.1.4.2 Axis specifier ................................................................................................ 22
2.1.4.3 Node test ....................................................................................................... 23
2.1.4.4 Predicate ....................................................................................................... 23
2.1.4.5 Các hàm và toán tử ....................................................................................... 23
4
2.1.5 CÁC THƯ VIỆN HỖ TRỢ .................................................................................. 24
2.1.5.1 HTML Tidy .................................................................................................. 24
2.1.5.2
cURL ............................................................................................................ 26
2.2
PHÂN TÍCH ............................................................................................................. 26
2.2.1 PHÁT BIỂU BÀI TOÁN ..................................................................................... 26
2.2.2 PHÂN LOẠI CÁC TRANG WEB DỰA TRÊN CÁCH CHUYỂN TRANG ..... 29
2.2.3 ĐỀ XUẤT GIẢI PHÁP ........................................................................................ 30
2.3
THIẾT KẾ ỨNG DỤNG .......................................................................................... 33
2.3.1 SƠ ĐỒ USE CASE .............................................................................................. 33
2.3.2 KIẾN TRÚC ỨNG DỤNG................................................................................... 34
2.3.2.1 Thành phần front-end ................................................................................... 34
2.3.2.2 Thành phần back-end.................................................................................... 36
CHƯƠNG 3. HIỆN THỰC ỨNG DỤNG VÀ ĐÁNH GIÁ KẾT QUẢ .................................. 39
3.1
ĐẶC TẢ DỮ LIỆU ĐẦU VÀO BẰNG XML ......................................................... 39
3.1.1 ĐẶC TẢ THÔNG TIN CHUNG CHO ROBOT ................................................. 39
3.1.2 ĐẶC TẢ CÁC TRANG ....................................................................................... 40
3.1.3 ĐẶC TẢ BẢNG CƠ SỞ DỮ LIỆU ..................................................................... 44
3.2
CẤU TRÚC CƠ SỞ DỮ LIỆU ................................................................................ 45
3.3
SƠ ĐỒ TUẦN TỰ CHO CÁC CHỨC NĂNG ........................................................ 46
3.3.1 BOT MANAGER ................................................................................................. 46
3.3.2 ROBOT ................................................................................................................. 47
3.3.2.1 Quản lý tiến trình của Robot ........................................................................ 48
3.3.2.2 Thực hiện quy trình thu thập dữ liệu ............................................................ 49
3.3.3 CRAWLER ........................................................................................................... 50
3.3.3.1 Simple Crawler ............................................................................................. 51
3.3.3.2 Advanced Crawler ........................................................................................ 51
3.3.4 EXTRACTOR ...................................................................................................... 54
KẾT LUẬN .............................................................................................................................. 55
TÀI LIỆU THAM KHẢO ........................................................................................................ 56
5
MỤC LỤC HÌNH ẢNH
Hình 1-1. World Wide Web ............................................................................................ 9
Hình 1-2. Sơ đồ hoạt động của một web crawler đơn giản ........................................... 10
Hình 1-3. Phân loại web cùng khả năng của các web crawler ...................................... 13
Hình 2-1. Một trang web danh bạ .................................................................................. 27
Hình 2-2. Sơ đồ Use Case của ứng dụng DESS ............................................................ 33
Hình 2-3. Sơ đồ các trạng thái của Bot.......................................................................... 35
Hình 2-4. Quá trình hoạt động tổng quát của ROBOT ................................................. 37
Hình 3-1. Sơ đồ cấu trúc cơ sở dữ liệu của chương trình .............................................. 45
Hình 3-2. Sơ đồ tuần tự của tác vụ start Bot ................................................................. 46
Hình 3-3. Sơ đồ tuần tự của tác vụ resume Bot ............................................................. 46
Hình 3-4. Sơ đồ tuần tự của tác vụ pause Bot ............................................................... 47
Hình 3-5. Sơ đồ tuần tự của tác vụ stop Bot .................................................................. 47
Hình 3-6. Sơ đồ tuần tự thể hiện quá trình hoạt động tổng quát của Robot .................. 48
Hình 3-7. Quá trình thu thập dữ liệu tổng quát ............................................................. 49
Hình 3-8. Sơ đồ class của các Crawler .......................................................................... 50
Hình 3-9. Sơ đồ tuần tự hoạt động của Simple Crawler ............................................... 51
Hình 3-10. Sơ đồ tuần tự hoạt động của Advanced Crawler ......................................... 51
Hình 3-11. Sơ đồ class của các Extractor ...................................................................... 54
6
MỞ ĐẦU
Trong thập kỷ qua, chúng ta đã được chứng kiến sự phát triển đến chóng mặt của Internet mà tiêu biểu là các trang thông tin. Internet đã và đang được coi là một nguồn cung cấp tin khổng lồ với mọi chuyên mục, mọi vấn đề mà người sử dụng cần đến. Với sự phát triển này, lượng thông tin từ Internet mang đến cho người sử dụng là quá lớn dẫn tới việc chúng ta cần phải có các ứng dụng Internet thông minh và hiệu quả hơn đối với người sử dụng. Tuy nhiên nếu lượng thông tin mà họ cần khai thác là quá nhiều thì quá trình duyệt web, trích xuất và lưu trữ theo cách thủ công lại trở thành một công việc khó khăn, hao tốn nhiều sức lực, thời gian của con người. Một số ví dụ có thể kể ra như: nhu cầu trích xuất thông tin về tất cả các mặt hàng thuộc một chuyên mục của một website bán hàng nào đó nhằm phục vụ mục đích khảo sát thị trường, nhu cầu tổng hợp tin tức từ các website tin tức để xây dựng các trang web thông tin tổng hợp, nhu cầu thu thập thông tin về các doanh nghiệp thuộc một ngành nào đó trên website danh bạ doanh nghiệp để gửi email quảng cáo, tiếp thị, v.v… Chính những ví dụ thực tế như trên đã nảy sinh ra nhu cầu: cần phải có một phương thức hoặc công cụ nào đó có khả năng tìm kiếm, trích xuất thông tin trên web và lưu trữ lại thông tin đó theo ý muốn của con người, một cách tự động và hiệu quả, và đó cũng chính là mục tiêu được đặt ra cho đề tài này. Đó là: Tìm hiểu phương pháp khai thác lượng dữ liệu trên, từ đó xây dựng được một ứng dụng thu thập dữ liệu tự động từ các website, phục vụ cho các nhu cầu của cá nhân hay tổ chức.
Các nhiệm vụ:
Tìm hiểu về các kiến thức nền tảng
Tìm hiểu về các kỹ thuật khai thác dữ liệu tự động từ các website
Tìm hiểu về các công nghệ liên quan và xây dựng ứng dụng khai thác dữ liệu
trên một website cụ thể
Bố cục của luận văn:
Mở đầu: Đặt vấn đề về ý nghĩa , tính cấp thiết, nhiệm vụ và tính thực tiễn của đề
tài.
Chương 1: Tổng quan về khai thác dữ liệu trên Web
Trong chương này, chúng ta sẽ tìm hiểu các khái niệm cơ bản về trình thu thập web (web crawler), các chiến lược thu thập dữ liệu, trình bóc tách và trích xuất thông tin (web scraper), sự phân loại các trang web, từ đó vẽ ra bức tranh chung về khai thác dữ liệu trên web để hiểu hơn về các giá trị thực tiễn mà nó mang lại trong đời sống con người.
Chương 2: Phân tích, thiết kế ứng dụng
7
Phần đầu chương sẽ trình bày về các kiến thức nền tảng và các công nghệ liên quan, ở phần tiếp theo nêu phát biểu cho bài toán khai thác dữ liệu trên web cũng như giải pháp thực hiện, kiến trúc thành phần của ứng dụng.
Chương 3: Hiện thực ứng dụng và đánh giá kết quả thu được
Đặc tả thông tin đầu vào cho ứng dụng, lược đồ cơ sở dữ liệu tương ứng và chức năng của các module trong chương trình. Phần tiếp theo trình bày ví dụ cụ thể và kết quả thu được khi thực hiện ứng dụng.
Kết luận: Phần cuối của luận văn sẽ nhìn lại những điều đã làm được, nêu lên
những hạn chế, từ đó đề ra hướng phát triển sau này.
8
CHƯƠNG 1. TỔNG QUAN VỀ KHAI THÁC DỮ LIỆU TRÊN WEB
1.1 TÌM HIỂU CÁC KIẾN THỨC TỔNG QUAN
1.1.1 WORLD WIDE WEB
Hình 1-1. World Wide Web
World Wide Web (WWW, hay gọi tắt là Web) là một ứng dụng phổ biến và phát triển mạnh mẽ nhất của Internet hiện nay. World Wide Web là một mạng lưới bao gồm các tài liệu siêu văn bản (hypertext) được đặt trên các máy tính nằm trong mạng Internet. Các siêu văn bản này có khả năng liên kết lẫn nhau thông qua các siêu liên kết (hyperlink). Sử dụng một trình duyệt web (web browser), con người có thể xem được các trang web (web page, cũng chính là một siêu văn bản) trên màn hình máy vi tính, nội dung các trang web có thể có chữ, hình ảnh, video, thậm chí có thể tương tác với người sử dụng thông qua các thiết bị như bàn phím, chuột. Cũng chính nhờ các hyperlink mà các trang web có thể liên kết được với nhau thông qua chỉ một cú click chuột, đây là khả năng đem lại sự mở rộng vô cùng lớn cho world wide web.
Nội dung các trang web chủ yếu được viết bằng ngôn ngữ HTML hoặc XHTML. Khi muốn truy cập một trang web, trình duyệt web sẽ gửi yêu cầu đến máy chủ (web server) chứa trang web đó. Máy chủ sẽ hồi đáp bằng nội dung trang web được yêu cầu trong trường hợp trang web đó thật sự tồn tại trên máy chủ và được cho phép truy cập. Cả hai quá trình yêu cầu và hồi đáp này đều được thực hiện dựa trên giao thức HTTP (Hyper Text Transfer Protocol).
1.1.2 TRÌNH THU THẬP DỮ LIỆU WEB – WEB CRAWLER
Một Web Crawler là một chương trình máy tính có thể “duyệt web” một cách tự động và theo một phương thức nào đó được xác định trước. Vì là một chương trình nên quá trình “duyệt web” của các web crawler không hoàn toàn giống với quá trình duyệt web của con người (web crawler phải sử dụng các phương thức dựa trên HTTP trực tiếp chứ không thông qua web browser như con người). Các web crawler thường bắt đầu với một danh sách URL của các web page để ghé thăm đầu tiên. Khi ghé thăm
9
Hình 1-2. Sơ đồ hoạt động của một web crawler đơn giản
một URL, crawler sẽ đọc nội dung web page, tìm tất cả các hyperlink có trong web page đó và đưa các URL được trỏ tới bới các hyperlink đó vào danh sách URL. Dựa vào danh sách URL này, Crawler lại tiếp tục quá trình duyệt đệ quy để ghé thăm tất cả các URL chưa được duyệt đến. Quá trình này được gọi là web crawling hoặc là web spidering, các web crawler còn được gọi là các robot (bot) hoặc nhện web (web spider). Thường thì các crawler được tạo ra để phục vụ cho một mục đích, tác vụ nào đó. Ví dụ các máy tìm kiếm (search engine) sử dụng crawler để tải các web page, các web page này sau đó được search engine đánh chỉ mục để có thể cho kết quả nhanh hơn khi được tìm kiếm.
Về bản chất, web crawling chính là quá trình duyệt đệ quy một đồ thị cây có các node là các web page. Tùy thuộc vào chiến lược của crawler, các node có thể được duyệt theo chiều sâu hoặc duyệt theo chiều rộng. Trong thực tế, quá trình crawling web sẽ phải đối diện với rất nhiều vấn đề khó khăn như: kích thước khổng lồ của world wide web, các trang web HTML được viết không chuẩn, hạn chế ghé thăm một URL đã được ghé thăm trước đó, các trang web động, nội dung các trang web được cập nhật thường xuyên v.v…
1.1.3 TRÌNH BÓC TÁCH VÀ TRÍCH XUẤT THÔNG TIN – WEB SCRAPER
Các trang web chủ yếu được viết bằng các ngôn ngữ đánh dấu như HTML, XHTML và được nhắm đến đối tượng sử dụng là con người chứ không phải máy tính. Các trang web lại chứa đựng nhiều thông tin có ích mà con người có thể muốn thu thập và lưu trữ lại, chính vì thế mà các web scraper được ra đời. Web Scraper là một thuật ngữ để chỉ các phần mềm có khả năng bóc tách và trích xuất thông tin chứa trên các web page một cách tự động. Công việc này được gọi là web scraping. Các web scraper khác với web crawler ở chỗ, trong khi web crawler tập trung vào việc duyệt các trang web thông qua các liên kết hyperlink, thì web scraper lại tập trung vào việc chuyển đổi nội dung không cấu trúc của các trang web (chủ yếu được viết bằng HTML) sang thành nội dung có cấu trúc, sau đó bóc tách, trích xuất phần thông tin
10
mong muốn và lưu trữ lại vào các cơ sở dữ liệu hoặc spreadsheet. Các web scraper cũng có thể thực hiện thêm các công đoạn phân tích dữ liệu sau khi đã trích xuất được để phục vụ cho một mục đích nào đó. Một số ứng dụng của web scraping bao gồm: so sánh giá cả thị trường trực tuyến, nghiên cứu thị trường, thu thập thông tin để thống kê, theo dõi thông tin thời tiết trên các website dự báo thời tiết, tổng hợp tin tức từ nhiều website v.v…
Một số kỹ thuật được sử dụng trong web scraping có thể kể ra như:
So trùng: một kỹ thuật đơn giản nhưng khá hiệu quả để tìm kiếm các phần nội dung chữ có sự tương đồng với nhau (do nội dung trang web chủ yếu là ở dạng ký tự). Kỹ thuật này thường sử dụng regular expression (biểu thức chính quy) để so trùng và tìm kiếm.
Lập trình HTTP: ta có thể lấy được nội dung trang web bằng cách gửi một yêu cầu HTTP đến web server, cũng giống như cách web browser làm. Đây cũng là một kỹ thuật được sử dụng bởi các web crawler.
Phân tích cấu trúc DOM: phân tích nội dung HTML của web page và xây dựng một cây DOM (Document Object Model), giúp scraper có thể duyệt các node trên cây này và chỉ lấy ra phần nội dung mà nó cần.
1.1.4 PHÂN LOẠI WEB
World Wide Web có thể được phân loại thành hai loại: các trang web tĩnh và các
trang web động. Sriram và Hector [3] đưa ra định nghĩa sau về trang web động:
“Một trang P được gọi là động nếu như một phần hoặc tất cả nội dung của nó được sinh ra tại thời điểm chạy (tức là sau khi yêu cầu của máy khách được máy chủ nhận) bởi một chương trình thực thi nằm trên máy chủ hoặc máy khách. Điều này ngược lại với một trang tĩnh P1, khi mà toàn bộ nội dung của P1 đã tồn tại sẵn trên máy chủ và luôn sẵn sàng được gửi cho máy khách ngay sau khi một yêu cầu được nhận.”
Các trang web động có thể được phân loại theo hai tiêu chí sau: sự thể hiện và
cách thức tạo ra [3].
1.1.4.1 Phân loại dựa vào sự thể hiện của tính động
Theo thời gian (temporal dynamism): đây là những trang web mà nội dung của chúng có thể được thay đổi, cập nhật theo thời gian. Điều này đồng nghĩa với việc: các yêu cầu đến cùng một trang web, khi được gửi ở hai thời điểm khác nhau có thể sẽ nhận được hai nội dung khác nhau.
Theo máy khách (client-based dynamism): những trang web có khả năng tùy biến theo người sử dụng (client) sẽ được xếp vào mục này. Ví dụ một trang tin tức tổng hợp có khả năng chọn lọc các tin tức khác nhau, tùy thuộc vào sở thích của người
11
sử dụng đang đăng nhập. Những trang kiểu này thường không thể trực tiếp truy xuất vào được mà phải vượt qua một bước xác thực danh tính (authentication).
Theo truy vấn (input dynamism): đây là những trang có nội dung phụ thuộc vào truy vấn của người sử dụng. Một ví dụ điển hình là những trang có các mẫu nhập liệu (form), chẳng hạn một trường nhập liệu để tìm kiếm một hoặc nhiều món hàng trong cơ sở dữ liệu của trang web. Những trang kiểu này cũng không luôn luôn truy xuất trực tiếp được (tùy thuộc vào phương thức truyền các tham số - GET hoặc POST – chi tiết về vấn đề này sẽ được phân tích ở phần 4), các trang kết quả nhận được cũng thường có số lượng rất lớn (tùy thuộc số tổ hợp của các tham số truy vấn). Đây cũng thường là những trang web không thể crawl được hoàn toàn bởi các crawler, và được gọi là Web ẩn (hidden Web, deep Web, invisible Web).
1.1.4.2 Phân loại dựa vào cách thức tạo ra tính động
Thực thi các chương trình nằm trên máy chủ (server-side programs): Trong kỹ thuật này, một chương trình sẽ được thực thi trên máy chủ và sinh ra toàn bộ nội dung HTML của trang web, sau đó được gửi đến máy khách yêu cầu. Ví dụ tiêu biểu cho loại này là CGI hoặc Java Servlet. Những chương trình phía máy chủ này cũng thường được dùng để xử lý các truy vấn từ người sử dụng.
Nhúng mã với sự thực thi phía máy chủ (embedded code with server-side execution): các trang web động sẽ chứa cả nội dung HTML tĩnh cùng với các đoạn mã được nhúng vào cùng với HTML. Khi một yêu cầu được nhận, các đoạn mã nhúng này sẽ được thực thi trên máy chủ và sẽ sinh ra các đoạn code HTML thay thế cho chúng. Kỹ thuật này khác kỹ thuật trên ở chỗ không phải toàn bộ mà chỉ một phần nội dung HTML được sinh động. Các mã nhúng này có thể là PHP, Java Scriplet, ASP hoặc các mã server-side khác.
Nhúng mã với sự thực thi phía máy khách (có thể có cả sự thực thi ở phía máy chủ) (embedded code with client-side execution): Với ký thuật này thì các đoạn mã được nhúng không chạy trên server mà chúng được máy khách tải về và được thực thi trên máy khách. Nếu mã chỉ chạy trên máy khách thì đó có thể là JavaScript, Java Applet hoặc Flash. Nếu vừa có sự thực thi ở máy khách và cả ở máy chủ thì đó chính là Ajax, trong trường hợp này mã clien-side có thể trao đổi thông tin với server thông qua một đối tượng đặc biệt là XMLHttpRequest để có thể thay đổi nội dung trang web một cách động mà không cần load trang web mới.
1.1.4.3 Khả năng của các web crawler
Nhìn chung, các web crawler hiện nay hầu hết đều chỉ có thể crawl một phần rất nhỏ của World Wide Web, đó là những trang web có thể đến được bằng cách đi theo các liên kết hyperlink. Các crawler này thường phải bỏ qua các trang có tính động theo
12
máy khách (client-based dynamism) và theo truy vấn (input dynamism). Cũng đã có một vài công trình nghiên cứu xây dựng các hidden-web crawler như HiWE [3], tuy nhiên đây không phải một vấn đề tầm thường và cũng vẫn còn đang được tiếp tục nghiên cứu và phát triển. Hình 1 cho thấy cái nhìn tổng quan về sự phân loại các trang web tĩnh - động, cùng với khả năng của các web crawler (thương mại) hiện nay.
Thể hiện
Nội dung
Nội dung động
tĩnh
Cách thức
Thời gian
Client-based
Truy vấn
Không cần xét vì trang tĩnh hoàn toàn không
Trang tĩnh hoàn toàn
thể tạo ra nội dung động
Chương trình thực thi
server-side
Không cần
Mã nhúng thực thi server-
xét vì nội
dung đã là
side
tĩnh
Mã nhúng thực thi client-
side
Các crawler truyền thống
Một vài crawler (Web ẩn)
(Web nổi)
Các crawler cá nhân
Không có
(Các web tùy biến)
Hình 1-3. Phân loại web cùng khả năng của các web crawler
1.2 CÁC CHIẾN LƯỢC THU THẬP DỮ LIỆU
Trong phần này chúng ta sẽ thảo luận về một số chiến lược thu thập dữ liệu bao
gồm [1]:
- Chiến lược thu thập dữ liệu theo chiều sâu.
- Chiến lược thu thập dữ liệu theo chiều rộng.
Như đã nói ở phần trước về bản chất, quá trình thu thập web chính là quá trình duyệt đệ quy một đồ thị. Các website được xem như một đồ thị với các trang là các đỉnh (node) và các siêu liên kết là các cạnh. Chính vì thế các chiến thuật thu thập dữ
13
liệu cũng được xây dựng dựa trên các thuật toán tìm kiếm trên đồ thị. Các thuật toán tìm kiếm trên đồ thị bao gồm:
- Tìm kiếm theo chiều sâu (Depth-First Search): Là thuật toán tìm kiếm bằng
cách mở rộng nút đồ thị theo chiều sâu.
- Tìm kiếm theo chiều rộng (Breath-First Search): Là thuật toán tìm kiếm bằng
cách mở rộng nút đồ thị theo chiều rộng.
1.2.1 CHIẾN LƯỢC THU THẬP DỮ LIỆU THEO CHIỀU SÂU
Quá trình thực hiện:
Bước 1: Lấy URL đầu tiên trong danh sách (frontier) để thu thập.
- Nếu có qua bước 2.
- Nếu không qua bước 5.
Bước 2: Lấy trang tương ứng với URL qua HTTP.
- Nếu có qua bước 3.
- Nếu không quay lại bước 1.
Bước 3: Kiểm tra xem trang này đã được thăm chưa?
- Nếu chưa qua bước 4.
- Nếu rồi quay lại bước 1.
Bước 4: Đánh dấu trang này đã được thăm. Bóc tách trang và tìm các liên kết có trong trang này.
- Nếu có, thêm các liên kết vào đầu danh sách. Quay lại bước 3.
- Nếu không, quay lại bước 1.
Bước 5: Kết thúc.
1.2.2 CHIẾN LƯỢC THU THẬP DỮ LIỆU THEO CHIỀU RỘNG
Quá trình thực hiện:
Bước 1: Lấy URL đầu tiên trong danh sách để thu thập.
- Nếu có qua bước 2.
- Nếu không qua bước 5.
Bước 2: Lấy trang tương ứng với URL qua HTTP.
- Nếu có qua bước 3.
- Nếu không quay lại bước 1.
14
Bước 3: Kiểm tra xem trang này đã được thăm chưa?
- Nếu chưa qua bước 4.
- Nếu rồi quay lại bước 1.
Bước 4: Đánh dấu trang này đã được thăm. Bóc tách trang và tìm các liên kết có trong trang này.
- Nếu có, thêm liên kết vào cuối danh sách. Quay lại bước 3.
- Nếu không, quay lại bước 1.
Bước 5: Kết thúc.
Ngoài 2 chiến lược kể trên còn phải kể đến các chiến lược thu thập dữ liệu khác như: Chiến lược thu thập dữ liệu theo lựa chọn tốt nhất ngây thơ (Naïve Best-First), tìm kiếm tham ăn (Shark Search). Chúng sử dụng thuật toán tìm kiếm theo quy tắc tính điểm số cho các URL dựa trên các tiêu chí để đánh giá độ quan trọng của một trang web như là: từ khóa, thẻ title và meta, số lượng liên kết ngoài. Các chiến lược kể trên không thuộc phạm vi nghiên cứu của đề tài.
1.3 ĐÁNH GIÁ SƠ BỘ
Có thể thấy được rằng, ứng dụng mà đề tài cần xây dựng chính là một chương trình vừa có thể crawl web một cách tự động, vừa có khả năng bóc tách, trích xuất dữ liệu như một web scraper. Từ đó có thể hình dung ứng dụng sẽ gồm 2 module chính: crawler module và data extractor module. Crawler module sẽ giúp ứng dụng “duyệt” nhiều trang web tương tự một cách tự động (ví dụ các trang phân trang của cùng một trang danh mục), với mỗi trang web được duyệt qua crawler module sẽ tải nội dung trang web về và lưu trữ tạm. Nội dung trang web sau đó được chuyển cho data extractor module, data extractor module có nhiệm vụ phân tích, xử lý nội dung trang web, chuyển đổi nó sang một cấu trúc trung gian nào đó để thuận tiện cho việc sử dụng trong bước nhập liệu.
Ứng dụng phải có tính tùy biến cao, phục vụ cho các mục đích cụ thể chứ không như các web crawler của các search engine (crawl phần Web nổi để đánh index), như vậy ứng dụng phải hỗ trợ được cả (một) phần Web ẩn. Vì phải phục vụ cho các mục đích cụ thể nên ứng dụng cũng cần được “dẫn đường” bởi người sử dụng.
Thành phần data extractor của ứng dụng sẽ không có nhiều khác biệt với các web scraper khác. Ứng dụng phải có thể bóc tách, trích xuất các dữ liệu (có sự tương đồng, do người sử dụng đặc tả) một cách tự động.
Ngoài ra, trong lĩnh vực trích xuất thông tin (Information Retrieval) cũng có một hướng nghiên cứu khác khá gần gũi với lĩnh vực khai phá dữ liệu (data mining) và trí tuệ nhân tạo (artificial intelligence). Hướng nghiên cứu này sẽ xây dựng, phát triển các
15
công cụ có khả năng tự động crawl và trích xuất thông tin một cách hoàn toàn tự động, không cần hoặc cần rất ít sự can thiệp của con người, và hơn nữa các công cụ này còn có khả năng tự học (machine learning) thông qua các dữ liệu mẫu [6], nhờ đó nó có thể ứng dụng được trên nhiều loại trang web có cấu trúc khác nhau một cách tự động. Ưu điểm của hướng tiếp cận này là tính tự động cao, có thể chạy được trên nhiều website khác nhau (cùng lĩnh vực) một cách tự động. Tuy nhiên các công cụ kiểu này thường chỉ có thể sử dụng cho các lĩnh vực cụ thể và phổ biến (domain-specific), chẳng hạn như lĩnh vực tin tức trực tuyến.
Vì lý do hạn chế về thời gian nên đề tài luận văn này sẽ không đi theo hướng này. Hướng tiếp cận của đề tài sẽ là xây dựng một ứng dụng có khả năng giải quyết các vấn đề trích xuất thông tin rất rời rạc và cụ thể. Ứng dụng cũng sẽ được xây dựng như một framework có khả năng mở rộng được, tùy biến được bởi người sử dụng, để có thể sử dụng cho nhiều loại website khác nhau, nhược điểm là mỗi khi sử dụng ứng dụng cho một website có cấu trúc khác, người sử dụng sẽ phải đặc tả lại các thông số đầu vào.
16
CHƯƠNG 2. PHÂN TÍCH VÀ THIẾT KẾ ỨNG DỤNG
2.1 CÁC KIẾN THỨC NỀN TẢNG VÀ CÔNG NGHỆ LIÊN QUAN
2.1.1 HTML
HTML (HyperText Markup Language – ngôn ngữ đánh dấu siêu văn bản) là một ngôn ngữ đánh dấu được thiết kế ra để tạo nên các trang web. HTML được xem như là một ứng dụng của SGML (Standard Generalized Markup Language – một chuẩn ISO định nghĩa các ngôn ngữ đánh dấu văn bản tổng quát). HTML được tổ chức World Wide Web Consortium (W3C) duy trì và là ngôn ngữ đánh dấu cốt lõi của World Wide Web. Phiên bản mới nhất của nó hiện là HTML 4.01. Tuy nhiên HTML hiện không còn được phát triển tiếp mà người ta đã thay thế nó bằng XHTML – một chuẩn HTML mở rộng dựa trên XML và có cú pháp chặt chẽ hơn HTML. Mặc dù vậy nhưng phần lớn các trang web hiện nay vẫn được viết bằng HTML, bởi nhiều nguyên nhân khác nhau (sử dụng các công cụ soạn thảo HTML cũ, người viết code ngại thay đổi v.v…).
Một tài liệu HTML được tạo nên bởi các phần tử HTML. Một cách tổng quát, một phần tử HTML bao gồm 3 thành phần: một cặp thẻ (tags) gồm một thẻ bắt đầu và một thẻ kết thúc; các thuộc tính (nằm trong thẻ bắt đầu); và toàn bộ phần ký tự, hình ảnh, nội dung thông tin sẽ được hiển thị lên màn hình. Một phần tử HTML là mọi thứ nằm giữa hai thẻ đầu cuối, tính cả hai thẻ này. Một thẻ HTML đơn giản là một từ khóa được đặt giữa một cặp hai dấu bé hơn (<) và lớn hơn (>). Thẻ đóng của một phần tử HTML luôn có một ký tự “/” ngay sau ký tự “<”. Sau đây là một ví dụ của một phần tử HTML ở dạng tổng quát nhất:
Có bốn loại phần tử đánh dấu trong HTML:
Đánh dấu có cấu trúc miêu tả mục đích của phần văn bản (ví dụ,
Football
sẽ điều khiển phần mềm đọc hiển thị “Football” là tiêu đề cấp một). Đánh dấu trình bày miêu tả phần hiện hình trực quan của phần văn bản bất kể
chức năng của nó là gì (ví dụ in đậm sẽ hiển thị thành in đậm).
liên kết hyperlink thể hiện các tử
Đánh dấu liên kết ngoài chứa phần liên kết từ trang này đến trang kia, đây chính là các phần (ví dụ Dan Tri sẽ hiển thị từ Dan Tri như một liên kết ngoài đến website www.dantri.vn).
17
Các phần tử thành phần điều khiển giúp tạo ra các đối tượng điều khiển như các
nút bấm, các ô textbox để nhập liệu.
đoạn văn này được in đậm
HTML là ngôn ngữ không phân biệt hoa thường (hai thẻ
,
và
Sự lồng nhau không đúng thứ tự của các phần tử HTML được gọi là overlapping (phủ lên nhau), mặc dù điều này không được phép trong đặc tả SGML, nhưng lại được chấp nhận bởi hầu hết các trình duyệt hiện nay.
Từ các đặc điểm trên ta có thể nhận thấy HTML không phải là một ngôn ngữ có cú pháp chặt chẽ, các đặc điểm như không cần đóng thẻ hoặc không cần lồng nhau đúng thứ tự sẽ là các trở ngại cho công việc đọc và phân tích văn bản HTML (HTML parsing), đặc biệt nếu sử dụng phương pháp tìm kiếm so trùng. Chính vì vậy, chúng ta cần phải chuyển đổi nội dung viết bằng HTML sang một định dạng ngôn ngữ khác có sự chặt chẽ hơn về cú pháp, điều này sẽ đem lại thuận lợi hơn cho quá trình xử lý về sau. Một ngôn ngữ đánh dấu được định nghĩa ra để thay thế cho HTML đó chính là XHTML.
2.1.2 XML
XML (Extensible Markup Language – ngôn ngữ đánh dấu mở rộng) là một ngôn ngữ đánh dấu mà người sử dụng có thể tự tạo ra các thẻ riêng của mình. Giống như HTML, XML cũng được dựa trên SGML. Tuy nhiên, XML được thiết kế nhằm mục đích truyền tải và lưu trữ thông tin, trong khi HTML tập trung vào việc thể hiện thông tin đó như thế nào. Về tính cấu trúc của nội dung, XML có thể dùng để định nghĩa các cấu trúc ngẫu nhiên tùy ý trong khi HTML hoàn toàn bị giới hạn.
Ví dụ của một tài liệu XML đầy đủ:
18
2.1.3 XHTML
XHTML (Extensible HyperText Markup Language) là một ngôn ngữ đánh dấu có cùng các khả năng như HTML, nhưng có cú pháp chặt chẽ hơn. XHTML được xây dựng dựa trên XML và được cho rằng sẽ là ngôn ngữ thay thế cho ngôn ngữ HTML trong tương lai.
Theo tổ chức W3C, khác biệt giữa XHTML 1.0 và HTML 4 về cơ bản thì XHTML phải là một tài liệu XML chuẩn (well-formed), trong khi HTML không cần phải thỏa điều kiện này. Cụ thể, một số điểm khác biệt như sau:
2.1.3.1 Tính chuẩn của một tài liệu XML (well-formed)
XHTML đòi hỏi các tài liệu viết bằng XHTML phải có tính chất well-formed, có nghĩa là tất cả các thẻ trong tài liệu đều phải có thẻ đóng tương ứng (ngoại trừ các thẻ rỗng được trình bày cụ thể ở phần sau) và các phần tử phải lồng nhau một cách đúng thứ tự (thẻ nào mở trước thì phải đóng sau). Ví dụ:
một đoạn văn được in nghiêng.
Đúng: các phần tử lồng nhau đúng thứ tự.
Sai: các phần tử lồng nhau không đúng (overlap).
một đoạn văn được in nghiêng.
2.1.3.2 Tên các phần tử và tên các thuộc tính phải ở dạng chữ in thường
XHTML thừa kế các đặc tính của XML, trong đó có sự phân biệt chữ hoa chữ thường (ví dụ
2.1.3.3 Các thẻ không rỗng bắt buộc phải có thẻ đóng
Trong HTML 4, một số phần tử được phép viết không cần thẻ đóng. Tuy nhiên XML không cho phép điều này. Tất cả các phần tử đều phải có thẻ đóng tương ứng ngoại trừ các phần tử được định nghĩa trong DTD là EMPTY (các phần tử này có thể có thẻ đóng đầy đủ hoặc được viết ở dạng tắt). Ví dụ:
đây là đoạn văn đầu tiên.
đây là đoạn văn thứ hai.
Đúng: các phần tử đều có thẻ đóng.
đây là đoạn văn đầu tiên.
đây là đoạn văn thứ hai.
Sai: các phần tử không có thẻ đóng.
Giá trị của các thuộc tính luôn được bọc bởi cặp dấu ngoặc kép
19
Đúng: giá trị thuộc tính nằm trong ngoặc kép.
Sai: giá trị thuộc tính không nằm trong ngoặc kép.
2.1.3.4 Các thuộc tính luôn phải ghi rõ giá trị
Các thuộc tính của phần tử phải được viết dưới dạng tên=”giá trị” đầy đủ. Ví
dụ:
Đúng:
Sai:
Các ký tự khoảng trắng đứng trước và sau giá trị của thuộc tính đều được bỏ qua.
2.1.3.5 Các phần tử rỗng
Các phần tử được định nghĩa trong DTD là EMPTY nếu không viết thẻ đóng tương
ứng thì chúng phải được viết dưới dạng
Đúng:
Sai:
Ngoài ra, để có thể tương thích ngược với các trình duyệt cũ, W3C khuyến cáo nên thêm một khoảng trắng ở trước chuỗi ký tự /> vì một số trình duyệt cũ có thể gặp lỗi khi đọc.
2.1.4 XPATH
Xpath - XML Path - là một ngôn ngữ truy vấn được định nghĩa bởi W3C, sử dụng để truy vấn các node hoặc tính toán các giá trị lấy trong một tài liệu XML. Một tài liệu XML được xem như là một sự thể hiện của cấu trúc phân cấp ở dạng cây của nhiều phần tử, mỗi phần tử được xem như là một node của cây, XPath đem lại khả năng duyệt các node trên cây hoặc lựa chọn chúng theo các tiêu chí nào đó, dựa trên các mối quan hệ như cha - con, tổ tiên - con cháu. Một biểu thức XPath (Xpath expression) có thể chọn một node hoặc một tập hợp các node, hoặc nó có thể trả lại
20
một giá trị dữ liệu dựa trên một hoặc nhiều node trong tài liệu. XPath hiện có 2 phiên bản là XPath 1.0 và XPath 2.0.
2.1.4.1 Cú pháp và ngữ nghĩa
Một biểu thức XPath có thể là một đường dẫn vị trí (location path), đây là loại biểu thức quan trọng nhất trong XPath. Một location path bao gồm một hoặc nhiều bước (location step). Mỗi bước gồm có 3 thành phần sau:
một axis specifier (chỉ định hướng)
một node test
một hoặc nhiều predicate
Biểu thức XPath luôn được đánh giá một cách tương đối đối với một node ngữ cảnh (context node). Một chỉ định hướng (axis specifier) “child” sẽ cho biết hướng di chuyển (để tìm kiếm) sẽ là hướng đến các node con của node ngữ cảnh. Node test và predicate sẽ dùng để lọc các node thu được một cách chi tiết hơn. Ví dụ node test “A” đòi hỏi tất cả các node nhận được phải có tên là “A”. Một predicate dùng để chỉ ra các node này phải có một số đặc điểm nào đó nữa. Cú pháp của biểu thức XPath cũng có thể ở hai dạng: rút gọn và đầy đủ.
Cú pháp rút gọn
Ví dụ một tài liệu XML như sau:
/A/B/C
Một biểu thức XPath đơn giản:
Biểu thức XPath này sử dụng giá trị mặc định của các axis specifier đó là giá trị child, và các step của biểu thức đều không sử dụng predicate. Biểu thức này chọn ra các phần tử C nào mà là con của các phần tử B, và các phần tử B này cũng phải là con của các phần tử A. Cú pháp này của XPath có nét tương đồng với cú pháp của URI (Uniform Resource Identifier) cũng như cú pháp đường dẫn file của các hệ điều hành Unix.
A//B/*[1]
Một biểu thức phức tạp hơn:
21
Biểu thức này chọn ra phần tử có tên tùy ý và phải là phần tử đầu tiên (“[1]”) trong các phần tử con của phần tử B, phần tử B này phải là con hoặc cháu chắt (“//”) của một phần tử A nào đó, phần tử A này lại là con của node ngữ cảnh (do biểu thức không bắt đầu bởi “/”). Nếu phần tử A có nhiều node con cháu cùng tên B thì biểu thức này sẽ trả về một tập các node con đầu tiên của các phần tử B này.
Cú pháp đầy đủ
/child::A/child::B/child::C
child::A/descendant-or-self::node()/child::B/child::*[position()=1]
Hai biểu thức XPath ở trên khi được viết lại ở dạng đầy đủ thì chúng sẽ như sau:
Có thể thấy ở dạng đầy đủ, axis specifier được viết tường minh trong mỗi step của biểu thức, nối tiếp bởi hai dấu hai chấm ::, rồi đến node test như A, B hoặc node() trong ví dụ trên.
2.1.4.2 Axis specifier
Cú pháp đầy đủ
Cú pháp rút gọn
Ví dụ
ancestor
ancestor-or-self
attribute
@
@abc là viết tắt của attribute::abc
child
xyz là viết tắt của child::xyz
descendant
//B
là viết
tắt
của descendant-or-
descendant-or-self
//
self::node()/child::B
following
following-sibling
namespace
A/../B
là
viết
tắt
của
parent
..
A/parent::node()/child::B
preceding
preceding-sibling
self
.
. là viết tắt của self::node()
22
2.1.4.3 Node test
Một số node test:
comment(): tìm một node chú thích, ví dụ
text(): tìm một node có kiểu là text, ví dụ hello trong hello
world
processing-instruction(): tìm các chỉ dẫn xử lý của XML, ví dụ processing-
instruction(‘php’) sẽ trả về node
node(): tìm bất kỳ node nào
2.1.4.4 Predicate
Một step của biểu thức XPath có thể có nhiều predicate. Mỗi predicate cũng được viết dưới dạng biểu thức và nằm trong cặp ngoặc vuông [ ], các node nhận được của biểu thức sẽ phải thỏa điều kiện của các predicate. Ví dụ a[@href=’help.php’] sẽ chỉ trả về các phần tử có tên là a (trong các node con của node ngữ cảnh) và có một thuộc tính href với giá trị help.php. Các predicate có thể trả về giá trị boolean, số nguyên, hoặc một tập các node. Nếu giá trị trả về của predicate là số nguyên thì giá trị này được hiểu là vị trí của node cần tìm, ví dụ p[1] trả về phần tử p đầu tiên, p[last()] trả về phần tử p cuối cùng. Trong trường hợp trả về một tập node thì khi tập node khác rỗng giá trị sẽ được hiểu là true, ví dụ p[@id] trả về các node p có thuộc tính id.
2.1.4.5 Các hàm và toán tử
XPath 1.0 định nghĩa 4 kiểu dữ liệu: kiểu tập node (node-set), kiểu chuỗi ký tự
(string), kiểu số (number) và kiểu logic (boolean).
Các toán tử phổ biến được dùng trong XPath:
Toán tử hội “|“ để tìm hội của hai tập node.
Toán tử logic “and” và “or” (và một hàm not(boolean) để phủ định một biểu
thức boolean).
Các toán tử cộng trừ nhân chi “+”, “-“, “*”, “div” và “mod”.
Các toán tử so sánh “=”, “!=”, “<”, “>”, “<=”, “>=”.
Các hàm phổ biến trong thự viện hàm của XPath 1.0:
position(): trả về giá trị kiểu số thể hiện vị trí của node trong một chuỗi các
node.
count(node-set): trả về số node có trong node-set.
23
string(object?): chuyển bất kỳ kiểu dữ liệu nào thành kiểu chuỗi. Nếu tham số là kiểu node-set thì hàm này trả về giá trị chuỗi của node đầu tiên trong node- set (theo thứ tự xuất hiện trong tài liệu).
contains(s1, s2): trả về true nếu s1 chứa s2.
true(), false(): trả về các giá trị true, false tương ứng.
//item[@price > 2*@discount]
Một số ví dụ:
discount của nó;
//product[contains(comment, ‘bad’)]
trả về các node item có thuộc tính price lớn hơn hai lần giá trị thuộc tính
trả về các node product có node con comment chứa từ ‘bad’.
2.1.5 CÁC THƯ VIỆN HỖ TRỢ
2.1.5.1 HTML Tidy
HTML Tidy là một ứng dụng phần mềm nguồn mở, giúp “sửa chữa” các tài liệu HTML bị lỗi cú pháp (bad HTML) hoặc chuyển hẳn chúng sang các tài liệu XHTML. HTML Tidy ban đầu được phát triển đầu tiên bởi Dave Raggett thuộc tổ chức W3C, sau này thì HTML Tidy trở thành một dự án của Sourceforge. HTML Tidy bao gồm một công cụ chạy trong môi trường command line và một gói thư viện TidyLib có chức năng tương tự để tích hợp vào các ngôn ngữ khác. Hiện nay TidyLib đã được tích hợp vào PHP như một gói mở rộng từ phiên bản 5.0b3 trở đi (Tidy extension), điều này giúp lập trình viên có thể sử dụng ngay các khả năng của HTML Tidy như phân tích (parse), kiểm tra (validate) và sửa chữa (repair) các tài liệu HTML, XHTML và XML ngay từ trong mã PHP. Sau đây là một số ví dụ về các khả năng của HTML Tidy:
heading
subheading
Thêm các thẻ đóng bị thiếu và sửa các thẻ đóng không khớp
heading
subheading
sẽ được chuyển thành
bold bold italic bold
Sửa các thẻ đóng sai thứ tự
sẽ được chuyển thành
24
bold bold italic bold
heading
new paragraph bold text
some more bold text
Sửa các thẻ đặt không rõ ràng, trộn lẫn vào nhau
heading
new paragraph bold text
some more bold text
sẽ được chuyển thành
heading
sub
heading
Sửa các thẻ
đặt sai
heading
sub
heading
sẽ được chuyển thành
Bổ sung ký tự “/” vào thẻ đóng của các thẻ anchor
sẽ được chuyển thành
Bổ sung các thẻ đóng bị thiếu trong các danh sách
- 1st list item
- 2nd list item
sẽ được chuyển thành
Bổ sung ngoặc kép bọc giá trị của các thuộc tính
25
sẽ được chuyển thành
Chuyển nội dung HTML thành XHTML, đây là một khả năng được sử dụng
phổ biến của HTML Tidy.
2.1.5.2 cURL
cURL là một project phần mềm nguồn mở cũng bao gồm một công cụ command line và một gói thư viện. Ứng dụng command line là cURL, được xây dựng dựa trên gói thư viện libcurl. cURL được tạo ra để hỗ trợ truyền tải các tập tin có cú pháp URL (gửi và nhận), thông qua các giao thức phổ biến như FTP, HTTP, HTTPS, TELNET, LDAP, FILE v.v… cURL cũng hỗ trợ các phương thức như HTTP POST, HTTP PUT, FPT uploading, proxy, xác thực username / password v.v…
2.2 PHÂN TÍCH
2.2.1 PHÁT BIỂU BÀI TOÁN
Xem xét mô hình tổng quát của một website cung cấp danh bạ về các doanh nghiệp trong nhiều lĩnh vực. Danh bạ này có thể được chia làm nhiều mục lớn (category) về các lĩnh vực lớn, trong mỗi category lại phân ra làm nhiều phân mục nhỏ (sub-category) về các lĩnh vực nhỏ, trong mỗi sub category lại phân ra làm nhiều phân mục nhỏ hơn nữa, cứ thế cho đến phân mục nhỏ nhất, phân mục nhỏ nhất sẽ chứa danh sách các liên kết đến các trang chi tiết về một doanh nghiệp nào đó nằm trong phân mục này. Các trang chi tiết này chính là các trang cấp thấp nhất, nội dung của trang này sẽ chứa các thông tin mà người sử dụng website quan tâm như: tên doanh nghiệp, mô tả về doanh nghiệp, địa chỉ liên lạc, số điện thoại, địa chỉ email v.v… Mô hình trang web kiểu này được gọi là mô hình Master – Detail, trong trường hợp tổng quát, các trang cấp N chính là trang master của trang cấp N+1 và trang cấp N+1 là trang detail của trang cấp N, và cấp N+1 được gọi là thấp hơn cấp N. Lưu ý rằng ở mỗi cấp có thể sẽ có sự phân trang (pagination – danh sách các category thuộc cùng 1 cấp sẽ không chỉ nằm trong 1 trang mà có thể nằm trong nhiều trang). Ta gọi những trang hiển thị danh sách các category lớn nhất là những trang cấp 1, từ một trong những trang cấp 1 nếu ta chọn 1 category nào đó thì sẽ dẫn đến một trang hiển thị các sub- category thuộc category đã chọn, những trang này ta gọi là những trang cấp 2, và cứ thế cho đến cấp thấp nhất.
26
Hình 2-1. Một trang web danh bạ
Giả sử một tình huống như sau: một người sử dụng muốn thu thập các thông tin về các doanh nghiệp nằm trong một lĩnh vực nào đó như tên doanh nghiệp, địa chỉ email, để phục vụ mục đích gửi thư quảng cáo. Nếu như anh ta không có một công cụ hỗ trợ nào thì anh ta sẽ phải thực hiện công việc thu thập thông tin này một cách thủ công. Trình tự công việc anh ta phải làm có thể sẽ như sau:
1. Từ trang chủ website, anh ta lần lượt click vào các liên kết phân mục để vào
được phân mục của lĩnh vực kinh doanh mong muốn.
2. Sau khi đã vào được phân mục của lĩnh vực anh ta mong muốn, anh ta sẽ thấy danh sách các doanh nghiệp thuộc lĩnh vực này được liệt kê ra. Anh ta phải click vào đường dẫn dẫn đến trang chi tiết của doanh nghiệp đầu tiên.
3. Ở trang thông tin chi tiết này (một trang cấp N, cấp thấp nhất), anh ta chọn những thông tin mà anh ta mong muốn (ở dạng chữ) và copy các thông tin đó, lưu vào đâu đó mà anh ta muốn, có thể là một tài liệu Microsoft Excel.
4. Sau khi lấy được thông tin của doanh nghiệp này, anh ta phải trở lại trang danh sách doanh nghiệp trước đó (trang cấp N-1) và click vào đường dẫn dẫn
27
đến trang chi tiết của doanh nghiệp thứ hai. Anh ta lại lặp lại công việc của bước thứ 3.
5. Nếu số doanh nghiệp thuộc lĩnh vực này quá nhiều thì danh sách các doanh nghiệp có thể sẽ bị phân thành nhiều trang, và nếu anh ta đã duyệt hết thông tin của các doanh nghiệp nằm trong trang đầu tiên, anh ta sẽ phải chuyển sang trang thứ hai của danh sách (cũng bằng một đường dẫn hoặc một nút do website cung cấp) để tiếp tục công việc của mình.
Qua một trình tự khá tổng quát của công việc thu thập thông tin như trên, ta có
thể rút ra một số nhận xét như sau:
Khi anh ta click chuột để vào các trang phân mục con, hoặc để vào trang thông tin chi tiết, công việc này chính là để chuyển từ trang này sang trang khác. Tuy nhiên đối tượng trên trang web mà anh ta có thể click chuột vào được, không phải lúc nào cũng là một hyperlink mà đó có thể là một nút bấm hoặc một đối tượng điều khiển nào đó khác. Và cũng tùy thuộc vào công nghệ sử dụng của website mà không phải bao giờ chuyển trang, URL của trang mới cũng khác URL của trang cũ. Trang web có thể sử dụng các đoạn mã client-side như JavaScript để thực hiện một HTTP POST method, postback các tham số ẩn (hidden input) để chuyển trang mà URL không bị thay đổi (công nghệ ASP.NET), hoặc cũng chính những đoạn mã JavaScript nhưng trang web chỉ load lại phần nội dung cần thiết mà không khiến web browser phải load một trang mới (công nghệ Ajax). Tuy nhiên mọi công nghệ vẫn phải dựa vào một nền tảng đó là HTTP. Nhờ đặc điểm này mà việc tạo ra một công cụ giả lập được việc “click chuột” của người duyệt Web là hoàn toàn khả thi, với điều kiện chúng ta phải cung cấp cho công cụ biết cụ thể các thông tin cần thiết như: cần chuyển đến URL nào, cần GET hoặc POST các tham số gì, hoặc cần thực thi các đoạn mã JavaScript nào, v.v… Thư viện của cURL sẽ giúp chúng ta đạt được một phần của các mục tiêu này.
Khi đã vào được trang chi tiết chứa những thông tin mong muốn, anh ta chọn các thông tin mà anh ta mong muốn, copy-paste để lưu lại. Có thể thấy rằng công việc này khá dễ dàng đối với con người, tuy nhiên đối với máy tính lại là cả một vấn đề không nhỏ. Các trang web được viết ra để phục vụ cho đối tượng chính là con người, các nội dung thể hiện trên trang web luôn có ngữ nghĩa riêng của nó mà chỉ có con người mới có thể hiểu được. Tuy nhiên, để ý một điều rằng, các website tuy rằng rất đa dạng và phong phú, nhưng các trang web nằm trong cùng một website lại thường được thiết kế với một cấu trúc tương tự nhau, gọi là web template. Các web template dựa vào cách thiết kế, sắp đặt các phần tử HTML, kết hợp với Cascading Style Sheets (CSS), đem lại một cấu trúc nhất quán cho toàn bộ website. Lấy ví dụ cụ thể đối với các trang thông tin chi
28
tiết về doanh nghiệp nêu trên, các trang này sẽ thường có chung một template, tức là sự sắp xếp các thẻ HTML trong các trang này hầu hết là giống nhau, chỉ có phần nội dung chữ bên trong các thẻ này là khác nhau vì nó thể hiện cho thông tin của các doanh nghiệp riêng biệt. Chính vì lý do này, khi đã có được nội dung của toàn bộ trang web, chúng ta hoàn toàn có thể trích xuất được phần nội dung mong muốn, giả lập cho công việc copy-paste của anh ta, với điều kiện được cung cấp vị trí chính xác của phần dữ liệu mong muốn trong template của trang web.
Trên đây chỉ là một ví dụ tổng quát của bài toán thu thập dữ liệu tự động. Trong thực tế sẽ có nhiều khác biệt phát sinh, ví dụ người sử dụng không chỉ mong muốn trích xuất các thông tin ở trang detail cấp thấp nhất mà anh ta còn muốn một số thông tin ở các trang cấp cao hơn, chẳng hạn thu thập thông tin các doanh nghiệp của nhiều lĩnh vực, kèm với thông tin về lĩnh vực nằm trong trang phân mục. Ứng dụng sẽ phải cung cấp khả năng trích xuất được thông tin nằm trong một hoặc nhiều trang có cấp bất kỳ, các dữ liệu trích xuất được sẽ được lưu vào cơ sở dữ liệu để tiện cho việc tra cứu, sử dụng về sau.
2.2.2 PHÂN LOẠI CÁC TRANG WEB DỰA TRÊN CÁCH CHUYỂN TRANG
Theo như cách phân loại Web ở phần 2.1.4, chúng ta có thể thấy được cái nhìn tổng quan về các Web tĩnh và động, cũng như có được cái nhìn chung về khả năng và giới hạn hoạt động của các Web crawler, so với thành phần crawler của ứng dụng cần xây dựng. Tuy nhiên để có thể đi vào các vấn đề chi tiết, cụ thể hơn trong việc hiện thực các kỹ thuật sử dụng bởi ứng dụng, ta cần phải phân loại lại các trang Web dựa vào cách thức chuyển trang từ trang đó sang các trang Web khác, hoặc thay đổi từ nội dung này sang nội dung khác trong cùng một trang web. Đây là vấn đề cốt lõi quyết định hoạt động của thành phần Crawler của ứng dụng vì thành phần này quan tâm đến việc làm thế nào để lấy được nội dung của các trang Web một cách tự động.
Cách thức chuyển trang này phụ thuộc vào kỹ thuật sử dụng của người lập trình
web. Nhìn chung có thể phân ra làm 2 loại sau:
A. Loại I: Kỹ thuật chuyển trang sử dụng các phương thức HTTP GET, HTTP POST thông thường. Các trang web loại này không sử dụng JavaScript, hoặc có sử dụng JavaScript nhưng không làm ảnh hưởng đến cách thức chuyển trang hoặc nội dung của trang web.
Giả sử một trang web X có thể dẫn đến một trang web Y khác và Y là một trang cần thiết cho quá trình thu thập dữ liệu mong muốn. Trang web X sẽ được xếp vào loại I nếu như ta có thể đến được trang Y (hoặc chính xác hơn là lấy được nội dung HTML của Y) chỉ nhờ vào duy nhất một yêu cầu HTTP GET hoặc HTTP POST đơn giản. Ví dụ:
29
- Y được dẫn đến từ X bởi các liên kết hyperlink đơn thuần (GET)
- Y được dẫn đến từ X bởi một form submit (GET hoặc POST)
- Y được dẫn đến từ X bởi một yêu cầu GET hoặc POST, chương trình thực thi trên máy chủ có sử dụng đến cookie hoặc các biến session để tạo ra nội dung của Y.
- Với nhiều ứng dụng web xây dựng bằng ASP.NET, khi người duyệt web tác động một điều khiển (control) trên X, một đoạn mã JavaScript được thực thi để postback một hoặc nhiều tham số chứa trong các hidden input, máy chủ nhận các tham số, xử lý và chuyển người dùng đến trang Y. Kỹ thuật này về bản chất cũng là một HTTP POST đơn thuần với các tham số nằm ẩn trong nội dung HTML.
B. Loại II: kỹ thuật chuyển trang hoặc sử dụng đến các đoạn mã nhúng client-side như JavaScript, làm thay đổi cấu trúc DOM hoặc nội dung bên trong của trang web, hoặc không thể xếp vào loại I.
Giả sử một trang web X có thể dẫn đến một trang web Y khác và Y là một trang cần thiết cho quá trình thu thập dữ liệu mong muốn. Trang web X sẽ được xếp vào loại II nếu như ta không thể đến được Y (hoặc chính xác hơn là lấy được nội dung HTML của Y) chỉ bằng một yêu cầu HTTP GET hoặc HTTP POST. Ví dụ:
- Công nghệ Ajax: sử dụng JavaScript để thực hiện các yêu cầu GET hoặc POST, tuy nhiên chỉ để lấy và nhận dữ liệu, dữ liệu nhận được từ máy chủ lại được JavaScript xử lý (chẳng hạn thay đổi cấu trúc DOM của trang web) để hiển thị kết quả lên cho người duyệt web. Web browser cũng không phải load trang web mới.
2.2.3 ĐỀ XUẤT GIẢI PHÁP
Từ những phân tích trên, ta nhận thấy ứng dụng cần xây dựng đòi hỏi phải có các khả năng chính sau đây (tên của ứng dụng được tạm đặt là DESS - Data Entry Support System):
- Người sử dụng có thể cho DESS biết anh ta muốn bắt đầu quá trình thu thập
dữ liệu từ trang web nào, dựa theo cách anh ta thực hiện thủ công.
- Người sử dụng có thể cho DESS biết anh ta muốn trình tự chuyển trang (chuyển phân trang, chuyển đến trang chi tiết cấp thấp hơn, hoặc thay đổi nội dung trên cùng trang web) như thế nào, dựa theo kỹ thuật chuyển trang được hiện thực bởi trang web.
- Người sử dụng có thể cho DESS biết ở mỗi trang được duyệt qua, phần dữ
liệu nào trong nội dung của trang cần được trích xuất.
30
- Người sử dụng có thể cho DESS biết mỗi dữ liệu trích xuất được sẽ được
lưu vào đâu và như thế nào.
Bốn khả năng trên cùng thể hiện chung cho một khả năng lớn duy nhất: ứng dụng có khả năng giúp người sử dụng mã hóa các tri thức, cung cấp các chỉ dẫn quan trọng cho ứng dụng. Khi thực hiện theo cách thủ công, người thu thập cần phải thực hiện lặp đi lặp lại các chuỗi thao tác một cách phí công sức do các trang web trong cùng một website thường dùng chung một web template. Do đó, nếu như DESS có thể giúp người sử dụng đặc tả được các chuỗi thao tác (lặp lại) này, DESS sẽ có thể trích xuất dữ liệu một cách tự động và hiệu quả. Ta sử dụng ngôn ngữ XML làm ngôn ngữ thể hiện các đặc tả này vì tính cấu trúc rõ ràng của XML. Tuy nhiên, một khó khăn không nhỏ đó là: người sử dụng cũng cần phải có hiểu biết về cấu trúc của các trang web cần trích xuất thông tin cũng như cách thức các trang này liên kết với nhau. Lợi thế của cách tiếp cận này đó là người sử dụng chỉ cần đặc tả một lần duy nhất trước khi thực thi ứng dụng.
Ngoài ra theo như các phân tích ở phần trước, thực tế không chỉ có các thao tác là chuyển trang bằng hyperlink và trích xuất dữ liệu bằng copy - paste, mà còn có các tình huống khác như: các trang cần xác thực danh tính (authentication), các trang cần nhập liệu vào form và submit, các trang sử dụng Ajax, dữ liệu sau khi trích xuất cần được xử lý thêm v.v… DESS cũng cần phải hỗ trợ người dùng đặc tả cách xử lý đối với các trường hợp này (ví dụ login bằng username và password gì, nhập liệu các giá trị gì vào form, dữ liệu sau khi trích xuất được thì cần xử lý như thế nào …).
Như vậy, dựa trên những phân tích trên đây, ta đưa ra các giải pháp sau:
Ứng dụng cần tập trung vào hai module chính, quan trọng nhất đó là Crawler và Extractor. Cả hai module phải có khả năng hoạt động đan xen với nhau, input của module này là output của module kia và ngược lại.
Đối với module Extractor:
- Việc bóc tách, trích xuất dữ liệu hiệu quả hoàn toàn phụ thuộc vào sự chính xác của việc chỉ ra vị trí tương đối của phân vùng dữ liệu cần trích xuất trong nội dung HTML.. Tuy nhiên HTML không phải là một ngôn ngữ có cấu trúc tốt, cần phải chuyển nội dung này sang dạng khác có cấu trúc hơn, đó chính là XHTML, với sự trợ giúp của thư viện Tidylib.
- XHTML tận dụng được những điểm mạnh của XML, nên cũng đem lại các khả năng truy vấn tìm kiếm node mạnh mẽ bằng XPath
Đối với module Crawler:
- Nhiệm vụ quan trọng nhất của Crawler chính là tải về nội dung tất cả các trang web cần thiết cho bài toán thu thập dữ liệu. Tuy nhiên, sự đa dạng của các công nghệ Web đã tạo ra nhiều khó khăn cho mục tiêu này. Vì thế, ta đưa ra sự phân loại các trang web dựa vào cách thức chuyển trang và module Crawler sẽ giải quyết vấn đề theo phân loại này.
31
- Đối với các trang thuộc loại I, sử dụng thư viện CURL để thực hiện các yêu cầu HTTP GET, HTTP POST, kèm theo gửi tham số, hỗ trợ cookie, authentication và proxy.
- Đối với các trang thuộc loại II, mấu chốt là phải thực thi được các đoạn mã JavaScript. Vì thư viện CURL không làm được điều này nên giải pháp của ta là phải xây dựng một Crawler engine riêng dưới dạng web browser giả lập, mục đích để crawl nội dung các trang thuộc loại II này. Để xây dựng web browser giả lập, ta sẽ sử dụng HtmlUnit, đây là một thư viện API nguồn mở dành cho Java, có khả năng mô phỏng hoạt động của các browser mặc dù không có giao diện sử dụng.
Đối với môi trường và ngôn ngữ phát triển
- Ta lựa chọn môi trường web để hiện thực ứng dụng vì đây là một môi trường linh hoạt, giúp người sử dụng có thể điều khiển từ xa thông qua môi trường web
- Ta chọn PHP làm ngôn ngữ phát triển chính cho DESS, vì:
o DESS liên quan đến nhiều tác vụ xử lý nội dung HTML ở dạng chuỗi ký tự (text), trong khi đó PHP lại là ngôn ngữ có các thư viện mạnh mẽ trong việc xử lý chuỗi được tích hợp sẵn ngay trong ngôn ngữ.
o PHP là một ngôn ngữ có tính linh hoạt cao, được tối ưu hóa cho các ứng dụng web. PHP có tốc độ nhanh, nhỏ gọn, cú pháp giống C và Java, dễ học và thời gian xây dựng sản phẩm tương đối ngắn, thích hợp cho đề tài Luận Văn này.
o Ta cũng chọn MySQL làm cơ sở dữ liệu chính của ứng dụng, giúp lưu trữ các thông tin trích xuất được, cũng như các thông tin cần thiết khác.
o Ngoài ra, chương trình sử dụng thư viện HtmlInput cũng sẽ được viết bằng Java, sau đó được kết hợp với ứng dụng chính viết bằng PHP, trao đổi dữ liệu với nhau thông qua tập tin text trung gian.
Bên cạnh đó, DESS cũng cần cho phép người sử dụng quản lý các quá trình thu thập dữ liệu của mình, hay nói cách khác là quản lý các Robot, mỗi Robot được sử dụng cho một bài toán thu thập dữ liệu. Các Robot cũng có thể chạy song song (đa tiến trình) để có thể đem lại hiệu quả công việc cao hơn.
32
2.3 THIẾT KẾ ỨNG DỤNG
Hình 2-2. Sơ đồ Use Case của ứng dụng DESS
2.3.1 SƠ ĐỒ USE CASE
Sơ đồ trên là các tác vụ mà người sử dụng có thể thực hiên trong chương trình,
chi tiết ý nghĩa các tác vụ được liệt kê ở bảng dưới đây:
STT
Tên
Ý nghĩa
Ghi chú
1 Add Robot
Khởi tạo một Robot mới
Dữ liệu đầu vào của Robot không được vi phạm với cấu trúc XML của chương trình
2
Edit Robot
Thay đổi cấu hình của Robot Dữ liệu đầu vào của Robot không được vi phạm với cấu trúc XML của chương trình
3 Delete Robot
Xóa Robot
4
Start Robot
Kích hoạt Robot chạy
Toàn bộ thông tin, dữ liệu thu thập được đều bị xóa trước khi Robot được chạy.
5
Pause Robot
Tạm dừng Robot
Có thể resume để Robot tiếp tục quá trình thực thi.
6
Resume Robot
Tiếp tục chạy Robot đang tạm dừng
33
7
Cancel Robot
Hủy bỏ quá trình thực thi của một Robot
Nếu người dùng Start Robot trở lại thì toàn bộ thông tin, dữ liệu thu thập được trong lần chạy trước sẽ bị xóa.
8
Export Data
Các định dạng tập tin hỗ trợ: SQL, CSV, XLS, XLSX
Xuất dữ liệu thu thập được ra tập tin làm đầu vào cho việc nhập liệu
9
đổi
Thay đổi đường đi có sẵn
Thay connection
10
Statistic
Thống kê Robot
2.3.2 KIẾN TRÚC ỨNG DỤNG
Kiến trúc của ứng dụng ở mức cao nhất được chia làm hai thành phần chính:
front-end và back-end.
Trong front-end có một module chính duy nhất dó là Bot Manager, đảm nhiệm vai trò quản lý, thực thi hoặc dừng các Bot, lưu lại các thông số trong quá trình thực thi ứng dụng, thể hiện lên cho người sử dụng. Phần giao diện của ứng dụng cũng nằm trong thành phần front-end này.
Thành phần back-end bao gồm hai module quan trọng đó là Crawler và Extractor, đảm nhiệm vai trò chức năng chính của ứng dụng. Tuy nhiên để nâng cao khả năng mở rộng cho ứng dụng, hai module con này được gộp chung lại vào một module lớn hơn, đó là module Robot - đại diện cho một Bot.
2.3.2.1 Thành phần front-end
Thành phần front-end chứa một module duy nhất đó là Bot Manager, chịu trách nhiệm quản lý trạng thái của một Bot. Sơ đồ sau đây thể hiện các trạng thái của Bot và sự dịch chuyển giữa các trạng thái:
34
Hình 2-3. Sơ đồ các trạng thái của Bot
Có 4 trạng thái như sau:
Ready: đây là trạng thái sẵn sàng của Bot. Từ trạng thái này người sử dụng chỉ có thể có một lựa chọn ra lệnh đó là Start (khởi động chạy). Trạng thái Ready có thể đạt được bằng một trong những cách sau:
- Sau khi người sử dụng submit input XML, bot manager parse, xử lý input này thành các setting và lưu vào database, lúc này bot sẵn sàng cho lần chạy đầu tiên.
- Bot đang chạy và người sử dụng ra lệnh dừng (Stop), lúc này bot trở về
trạng thái sẵn sàng cho lần chạy lại tiếp theo.
- Bot đang được tạm dừng (Paused) và người sử dụng quyết định hủy sự thực
thi của bot (Cancel).
- Quá trình chạy của Bot gặp lỗi và người sử dụng quyết định ngừng không
chạy tiếp bằng lệnh Cancel.
Started: đây là trạng thái đang thực thi của Bot. Từ trạng thái này, người sử dụng có thể quay trở lại trạng thái Ready nếu sử dụng lệnh Stop, hoặc chuyển đến trạng thái Paused nếu sử dụng lệnh tạm dừng Pause. Nếu có lỗi xảy ra trong quá trình thực thi, Bot sẽ tự động chuyển đến trạng thái Error. Trạng thái Started có thể đạt được thông qua các cách sau:
- Người sử dụng ra lệnh start khi Bot đang ở Ready
35
- Bot đang bị tạm dừng (Paused) và người sử dụng quyết định chọn Resume
để Bot tiếp tục quá trình thực thi.
- Bot đang ở trạng thái bị lỗi (Error) và người sử dụng quyết định chon
Resume để Bot tiếp tục quá trình thực thi.
Paused: đây là trạng thái tạm dừng của Bot. Từ trạng thái này nếu người sử dụng hủy quá trình thực thi bằng Cancel thì Bot trở về trạng thái Ready, sẵn sàng cho một lần chạy lại khác; nếu người sử dụng cho Bot quay lại thực thi tiếp bằng Resume thì trạng thái của Bot sẽ trở lại Started. Để đến được trạng thái Paused này chỉ có một trường hợp đó là người sử dụng ra lệnh tạm dừng Bot bằng lệnh Pause.
Error: trạng thái lỗi của Bot. Trong quá trình chạy nếu Bot gặp một lỗi (nặng) thì Bot sẽ tự động chuyển đến trạng thái Error. Trạng thái này cho người sử dụng hai lựa chọn đó là Resume – quay trở lại và tiếp tục quá trình thực thi và Cancel – ngừng luôn quá trình thực thi, trở về trạng thái Ready.
2.3.2.2 Thành phần back-end
Back-end là thành phần cốt lõi của DESS, thực hiện các chức năng chính của ứng dụng đó là crawl các trang web và trích xuất dữ liệu từ chúng. Đối tượng giúp back- end thực hiện các tác vụ này và cũng là đối tượng quan trọng nhất trong back-end, đó là Robot. Có thể hiểu Robot như một đối tượng điều khiển, phối hợp hai đối tượng khác là Crawler và Extractor, đây là hai thực thể có chức năng tách bạch và cùng được Robot sử dụng để hoàn thành công việc trích xuất dữ liệu tự động. Để có thể vận hành được, Robot cũng cần đến các đối tượng trợ giúp, được gọi là các Helper. Các helper có thể hiểu là những đối tượng Wrapper của các thư viện quan trọng, hoặc là những đối tượng có các hàm trợ giúp như giúp đọc dữ liệu đầu vào XML. Ngoài ra Crawler và Extractor cũng cần đến một số thư viện ngoài để đem lại một số khả năng hữu ích cho ứng dụng. Chi tiết về các thành phần này sẽ được đề cập sâu hơn ở các phần sau.
Crawler
Crawler đảm nhận trách nhiệm quản lý các URL đã ghé thăm cũng như cần được ghé thăm tiếp theo, gửi yêu cầu đến máy chủ, tải nội dung trang web về dưới dạng HTML text. Các URL cần được ghé thăm được lưu trong cơ sở dữ liệu của Bot, sẽ được Crawler đọc lên, cùng với các thông tin hỗ trợ khác thể hiện cách thức chuyển trang (get, post, parameters, javascript …) để Crawler có thể lấy được đúng nội dung của các trang web tiếp theo.
36
Hình 2-4. Quá trình hoạt động tổng quát của ROBOT
Crawler thật sự là một wrapper của hai crawler engine:
Simple Crawler Engine: crawler đơn giản, giúp lấy nội dung các trang web có thể đến được bằng các phương thức GET và POST thông thường, bao gồm cả sự chuyển trang cần đến form submission, authentication, nhưng không có sự phụ thuộc vào mã client-side như JavaScript.
Advanced Crawler Engine: crawler nâng cao, giúp lấy nội dung các trang web cần có xử lý JavaScript như Ajax hoặc các trang có sự thay đổi cấu trúc DOM nhờ các đoạn mã JavaScript.
Extractor
Extractor đảm nhận trách nhiệm đọc nội dung HTML do Crawler tải về, phân tích, chuyển đổi HTML thành XHTML nhờ helper Tidy. Sau đó Extractor phân tích nội dung này để bóc tách, trích xuất ra các dữ liệu cần thiết, bao gồm các thông tin có ích cho người dùng, hoặc các dữ liệu khác cần thiết cho quá trình thực thi tiếp theo của ứng dụng như URL của các phân trang, URL của các trang con. Để Extractor có thể lấy ra được đúng các dữ liệu này, người sử dụng cần phải đặc tả các thông tin “dẫn đường” cho Extractor bằng cách sử dụng XPath.
Các Helper
Các helper trong back-end là các class hỗ trợ các chức năng cần thiết cho Robot,
Crawler và Extractor. Một số các helper quan trọng như:
37
CURL: hiện thực bởi class pHTML. Đây là một wrapper của thư viện php curl và được Crawler sử dụng cho quá trình gửi yêu cầu tải nội dung các trang web. CURL helper này đem lại các hàm hỗ trợ bao bọc các hàm của curl, như:
- thực hiện một yêu cầu HTTP GET, kèm theo các tham số nếu có
- thực hiện một yêu cầu HTTP POST, kèm theo các tham số nếu có
- chuyển các mảng data trong php thành chuỗi query để đính kèm vào URL
khi gửi yêu cầu (là các tham số)
- sử dụng proxy cho các yêu cầu HTTP
TIDY: hiện thực bởi class pTIDY, đây là wrapper của thư viện php tidy, đem lại khả năng chuyển đổi một nội dung HTML thành XHTML (repair). TIDY helper được Extractor sử dụng mỗi khi Extractor nhận được nội dung HTML từ Crawler.
DOM: hiện thực bởi class pDOM, giúp chuyển đổi nội dung XHTML thành một cấu trúc cây DOM trong bộ nhớ chương trình, được sử dụng bởi XPath Extractor
XPATH: hiện thực bởi class pXPATH, giúp thực hiện các truy vấn XPath trên
nội dung XHTML, được sử dụng bởi XPath Extractor
38
CHƯƠNG 3. HIỆN THỰC ỨNG DỤNG VÀ ĐÁNH GIÁ KẾT QUẢ
3.1 ĐẶC TẢ DỮ LIỆU ĐẦU VÀO BẰNG XML
Tập tin cấu hình XML có thành phần gốc (root element) là cặp thẻ
Phần đặc tả thông tin chung cho Robot
Phần đặc tả các trang (một hoặc nhiều trang, thứ tự khai báo theo độ sâu của
trang)
Phần đặc tả bảng cơ sở dữ liệu
3.1.1 ĐẶC TẢ THÔNG TIN CHUNG CHO ROBOT
Phần này khai báo những thông tin cần thiết cho Bot như: URL bắt đầu, crawler
engine và các tùy chọn khác cho Bot. Cụ thể gồm các phần tử sau:
: chỉ ra URL mà khi khởi động Bot sẽ crawl đến đầu tiên.
Đây là phần tử bắt buộc phải có.
: chỉ ra crawler engine mà người sử dụng muốn dùng với
Bot. Có hai lựa chọn là simple và advanced tương ứng với Simple crawler
engine và Advanced crawler engine. Nếu không khai báo cặp thẻ này, Bot sẽ
mặc định hiểu ngầm là dùng Simple crawler engine.
: trong thẻ này người dùng sẽ đặc tả các tùy chọn bổ
sung cho Bot, gồm có 3 tùy chọn hữu ích:
- : nội dung của thẻ này là một số nguyên không âm, xác
định thời gian (tính bằng giây) giữa hai lần gửi yêu cầu đến máy chủ web
liên tiếp. Sử dụng tùy chọn này để Bot có thể tránh được các kỹ thuật kiểm
tra và ngăn chặn các IP tải trang web liên tục (chống flood) của một số
website. Ví dụ: 2
- : cũng như trường hợp của sleep, nếu trang web có khả
năng chống flood, mà người sử dụng không muốn đợi lâu, ta có thể sử dụng
proxy để chạy Bot. Nội dung của thẻ này ở dạng IP:port, có thể có nhiều
proxy phân cách bằng dấu phẩy, khi đó các proxy sẽ được sử dụng luân
phiên sau mỗi lần tải trang web. Ví dụ: 222.253.102.93:8888,
222.253.102.92:8080
-
39
hành thu thập dữ liệu. DESS hỗ trợ hai kiểu xác thực đó là HTTP- Authentication (Basic) và Form-based Authentication (dựa vào web form). Ví dụ:
o Với HTTP-Authentication:
o Với đăng nhập bằng Form:
3.1.2 ĐẶC TẢ CÁC TRANG
Đây là phần quan trọng nhất của cấu hình Bot, phần này sẽ chỉ ra cách thức, hay
nói đúng hơn là dẫn đường cho Crawler và Extractor hoạt động, tự động chuyển trang,
tải nội dung trang mới, tự động bóc tách, trích xuất đúng phần dữ liệu người dùng
mong muốn. Có thể đặc tả một hoặc nhiều các cặp thẻ
: số nguyên dương lớn hơn 0, duy nhất, bắt đầu từ 1 và tăng
dần theo thứ tự xuất hiện trong khai báo, thể hiện cho cấp của trang web.
40
: đặc tả về phân trang như cách thức vào những
trang phân trang từ trang đang xét, giới hạn các trang phân trang
: đặc tả về các trang con như cách thức vào những trang
con từ trang đang xét, giới hạn các trang con
: đặc tả về các phân vùng dữ liệu cần trích xuất trong trang
đang xét
Các thành phần pagination và subpage cùng có chung một thẻ con là
Mỗi action thể hiện cho một tác vụ cơ bản cần thiết cho Crawler hoặc Extractor, được Robot thực hiện tuần tự. Các action cũng có thể lồng nhau tùy theo một số trường hợp. Có 5 loại action trong DESS, tùy thuộc vào giá trị của phần tử type trong action:
Capture Action: capture
Đây là action thể hiện việc trích xuất một phân vùng dữ liệu nào đó, được thực
hiện bởi Extractor. Capture action gồm các thành phần sau:
- : tên định danh cho phân vùng dữ liệu trích xuất được. Ví
dụ “title”, “description”
-
: có hai giá trị là Y và N, cho biết rằng capture action này
khi trích xuất sẽ trả về một hay nhiều data record.
-
xuất, ở dạng biểu thức XPath.
- : xác định các helper-function dùng để hậu xử lý dữ
liệu sau khi lấy được từ nội dung trang web (lưu ý rằng các dữ liệu này đều
ở dạng text). Các helper được phân cách bằng ký tự “|”. Người sử dụng có
thể tự định nghĩa nên các helper-function này bằng cách viết các hàm riêng
cho mình. DESS cung cấp 6 helper-function được xây dựng sẵn:
o trim: cắt bỏ các khoảng trắng thừa ở đầu và cuối chuỗi
o replace: cú pháp replace:a,u có ý nghĩa thay thế tất cả sự xuất hiện
của “a” trong chuỗi thành “u”
o entity: chuyển các ký tự đặc biệt thành HTML entity, ví dụ &
chuyển thành &
o strip: lọc bỏ hết tất cả các tag
41
o space: thay thế tất cả các chuỗi nhiều khoảng trắng thành một
khoảng trắng duy nhất
o content: bỏ tag đóng và tag mở, chỉ lấy nội dung bên trong
- : dùng thẻ này khi ta muốn action capture trả về đúng
chuỗi giá trị trong thẻ, chứ không trích xuất dữ liệu từ trang web. Thẻ này
được dùng trong các trường hợp dùng capture action làm parameter giá trị
cố định cho GET, POST (xem ví dụ của Link Action bên dưới). Khi dùng
thẻ này thì không được phép có các thẻ xpath, expression, selector và
list phải là N.
Block Action: block
Khi trên trang web đang xét có nhiều phân vùng dữ liệu khác nhau và ta muốn
các data record của các phân vùng này được gom nhóm lại với nhau vào chung một
data record lớn có nhiều field, ta cần dùng block action. Block action sẽ bao bọc nhiều
capture action con, bản thân block action sẽ trả về một hoặc nhiều phân vùng dữ liệu
“cha chung” của các phân vùng dữ liệu con (gọi là các block data). Block action có các
thẻ sau:
-
: giá trị Y hoặc N, xác định rằng block action này trả về một
hay nhiều block data (mỗi block data này chứa các phân vùng dữ liệu con)
- : tương tự Capture Action
Các biểu thức XPath của các Capture Action con sẽ phải là tương đối với nội
Link Action: link
dung của block data.
link
http://www.example.com/index.aspx
capture
id
SW063
Các Link Action trả về danh sách các URL có được nhờ biểu thức tìm kiếm
XPath, Expression, Selector tương tự như các action trên. Tuy nhiên Link Action cũng
cho phép gửi kèm theo các tham số vào URL, theo phương thức HTTP GET hoặc
HTTP POST, thông qua thành phần options, ví dụ:
42
Trong ví dụ trên, thẻ static cũng được dùng cho Link Action và có tác dụng tương tự
thẻ static của Capture Action. Ví dụ trên sẽ thể hiện cho thao tác gửi một yêu cầu HTTP
POST đến http://www.example.com/index.aspx kèm theo tham số id có giá trị
“SW063”. Một ví dụ khác mà tham số truyền có giá trị được trích xuất từ nội dung
trang web:
link
http://www.example.com/index.aspx
capture
__EVENTTARGET
/WebForm_PostBackOptions\("([a-
z0-9\$_]*next)"/s
Type Action: type
thì giá
type
[name]q
minh
Type Action thể hiện thao tác nhập chuỗi ký tự vào một điều khiển nào đó (một
textfield, một textarea, v.v..) cho phép nhập liệu (target). Giá trị nhập vào được thể
hiện trong thẻ value, còn target thể hiện bằng thẻ static hoặc xpath. Nếu dùng thẻ
static
trị của nó phải ở dạng [name]name_to_search hoặc
[id]id_to_search. Ví dụ sau sẽ thể hiện thao tác nhập giá trị “minh” vào điều khiển
có name là q. Nếu dùng thẻ xpath thì action sẽ nhập giá trị vào điều khiển tìm được
bởi biểu thức XPath.
Click Action: click
43
click
[name]btnG
1
Click Action thể hiện thao tác click chuột vào một điều khiển chẳng hạn một nút
bấm button. Action cũng hỗ trợ tìm kiếm target bằng name, id hoặc bằng XPath. Ví dụ
sau thể hiện thao tác click chuột vào một điều khiển có name là btnG.
Năm loại Action trên có thể kết hợp với nhau, lồng nhau để có thể giải quyết
những trường hợp từ đơn giản cho đến phức tạp. Tuy nhiên, Simple crawler engine chỉ
sử dụng Link Action, Capture Action và Block Action, trong đó Simple crawler sử
dụng các Link Action để chuyển trang, Extractor sử dụng Capture Action và Block
Action để trích xuất dữ liệu. Đối với Advanced crawler engine, chỉ có Click Action,
Type Action, Capture Action và Block Action là có thể sử dụng, trong đó Advanced
crawler sử dụng Click Action và Type Action (thông qua HtmlInput) để giả lập
browser, thực thi JavaScript, còn Extractor sử dụng Capture Action và Block Action
giống như Simple crawler engine.
3.1.3 ĐẶC TẢ BẢNG CƠ SỞ DỮ LIỆU
Phần này gồm một element duy nhất, đó là thẻ . Thẻ này
đặc tả metadata của bảng trong cơ sở dữ liệu dùng để chứa các dữ liệu trích xuất được
bởi Bot. Cụ thể là đặc tả các field của bảng thông qua một hoặc nhiều cặp thẻ
. Mỗi thẻ column đại diện cho một field trong bảng cơ sở dữ liệu,
mỗi column có một thẻ con thể hiện tên của column, một thẻ con
xác định kiểu dữ liệu của column và một thẻ
thể hiện ràng buộc dữ liệu của field.
Tất cả các dữ liệu trích xuất được của DESS sẽ được lưu vào bảng này. Tên của
bảng sẽ được sinh tự động và là duy nhất đối với mỗi Bot. Mỗi dữ liệu cần trích xuất
được đặc tả trong thẻ data đã được định danh bằng thẻ name trong capture action
tương ứng, và chúng sẽ được lưu vào một field tương ứng trong bảng. Người sử dụng
phải dùng các tên định danh của các data này làm tên các column để DESS có thể biết
mỗi dữ liệu trích xuất được cần lưu vào field nào của bảng.
Ví dụ sau đây đặc tả bảng cơ sở dữ liệu của Bot gồm 2 field, tương ứng với 2
title
varchar
100
phần dữ liệu cần trích xuất có tên định danh title và description.
44
description
varchar>
500
Hình 3-1. Sơ đồ cấu trúc cơ sở dữ liệu của chương trình
3.2 CẤU TRÚC CƠ SỞ DỮ LIỆU
Mô tả các bảng
STT
Tên
Mô tả
1 wde_crawl
Dữ liệu về Robot (Tên, Cấu hình, Trạng thái…)
2 wde_url
Các link của các trang web mà Robot trích xuất dữ liệu
3 wde_log
Quá trình hoạt động của Robot
4 wde_setting
Cac cấu hình của chương trình
5 wde_data_[num]
Dữ liệu mà Robot thu thập được với [num] tương ứng
với ID của Robot, Cấu trúc của bảng phụ thuộc vào khai
báo của người sử dụng.
45
3.3 SƠ ĐỒ TUẦN TỰ CHO CÁC CHỨC NĂNG
Hình 3-2. Sơ đồ tuần tự của tác vụ start Bot
Hình 3-3. Sơ đồ tuần tự của tác vụ resume Bot
3.3.1 BOT MANAGER
46
Hình 3-4. Sơ đồ tuần tự của tác vụ pause Bot
Hình 3-5. Sơ đồ tuần tự của tác vụ stop Bot
3.3.2 ROBOT
Class Robot đóng vai trò trung tâm điều khiển của Crawler và Extractor. Mọi
hoạt động của hai đối tượng này đều được điều khiển, phối hợp với nhau bởi Robot.
47
Hình 3-6. Sơ đồ tuần tự thể hiện quá trình hoạt động tổng quát của Robot
3.3.2.1 Quản lý tiến trình của Robot
Chạy Bot: Khi nhận được lênh kích hoạt từ người dùng thông qua Bot
Controller, Robot sẽ tiến hành thực hiện tuần tự các công việc sau:
- Cập nhật trạng thái của Robot thành đang hoạt động (Started).
- Kiểm tra xem Robot có đang được chạy hay không: Mỗi Robot sẽ được
chạy trên một process riêng biệt. Robot sẽ kiểm tra Process ID của Robot
muốn có đang tồn tại trong danh sách Process của Hệ điều hành hay không.
o Nếu không, Robot sẽ thực hiện một lênh khởi tạo một process mới để
chạy Bot được yêu cầu.
o Nếu có, Robot sẽ dừng lại.
48
Dừng Bot:
- Trong mỗi vòng lặp của quá trình hoạt động, Bot kiểm tra trạng thái của
mình.
- Nếu trạng thái là “Started”, Bot sẽ tiếp tục chạy.
- Nếu trạng thái không là “Started”, Bot sẽ dừng lại.
Việc tạo process mới để chạy và quản lý Robot bằng Process ID đã giúp khắc
phục nhược điểm khách quan của PHP là time limit.
3.3.2.2 Thực hiện quy trình thu thập dữ liệu
Class Robot điều khiển hai thành phần chính là Crawler và Extractor để tiến hành
Hình 3-7. Quá trình thu thập dữ liệu tổng quát
thu thập dữ liệu, quá trình tổng quát nhìn từ mức cao sẽ có dạng như sau:
Trong mỗi vòng lặp của quy trình hoạt động, Bot lần lượt sử dụng Crawler và
Extractor để tiến hành thu thập dữ liệu. Ban đầu, Bot sẽ lấy url từ cơ sở dữ liệu, dùng
Crawler để lấy nội dung trang Web, trả nội dung lấy được cho Extractor. Sau đó bot sẽ
tiến hành duyệt qua các Action và dùng Extractor để thực hiên chúng, Kết quả
extractor trả về sẽ được Bot lưu giữ trong cơ sở dữ liệu.
49
Như vậy có thể nói class Robot chính là trung tâm điểu khiển của back-end, điều
khiển mọi hoạt động của Crawler và Extractor, giúp Crawler và Extractor phối hợp,
đan xen với nhau để quá trình thu thập dữ liệu tự động được hoàn thành.
3.3.3 CRAWLER
Hình 3-8. Sơ đồ class của các Crawler
Class Crawler có nhiệm vụ lấy nội dung một trang web từ một url cùng các
options và trả về định nghĩa HTML của nó. Crawler bao gồm hai crawler engine là
Simple Crawler Engine và Advanced Crawler Engine.
Hiện nay chương trình chỉ hỗ trợ sử dụng một trong hai crawler engine, người sử
dụng quyết định chọn lựa engine nào được dùng thông qua thẻ engine của đặc tả cấu
hình XML.
50
Hình 3-9. Sơ đồ tuần tự hoạt động của Simple Crawler
3.3.3.1 Simple Crawler
Sử dụng pHTML Helper, đây là một wrapper của thư viện cURL của PHP, có
khả năng thực hiện các chức năng HTTP cơ bản như: GET, POST, HTTP Auth …
Hình 3-10. Sơ đồ tuần tự hoạt động của Advanced Crawler
3.3.3.2 Advanced Crawler
51
DESSBrowser
Advanced Crawler sử dung DESSBrowser - một browser giả lập được viết bằng
java sử dụng thư viện HTMLUnit, có khả năng thực hiện các đoạn mã javascript,
activeX, java applet…
Khi được cung cấp một url kèm theo các options mô tả các hoạt đông, Advanced
Crawler sẽ tạo một fileInput chứa các hoạt động đó, sau đó sẽ gọi DESSBrowser với
thông số là input và output, DESSBrowser sẽ thực hiện các action được truyền qua và
lấy nội dung cuối cùng ghi vào file output, cũng là file chứa nội dung trang Web cần
lấy.
java –jar DESSBrowser input.txt output.html
DESSBrowser nhận 2 thông số là tập tin đầu vào và tập tin đầu ra.
Khi thực thi, DESSBrowser sẽ tiến hành đọc nội dung của file input, thực hiện
các action được miêu tả trong đó. Sau đó ghi kết quả cuối cùng ra file output.
url trang web
action block
action block
…
Cấu trúc file input
Mỗi action block được miêu tả bằng 3 thành phần nằm trên 3 dòng riêng biệt:
Action Type: loại action. Hiện chương trình hỗ trợ hai loại action cơ bản, tương
tự như trong cấu hình XML:
- Type: thực hiện thao tác nhập giá trị value vào trong target
- Click: thực hiện thao tác click chuột vào target. Value của Action lúc này
chính là option của thao tác:
o Nếu Value: “auto”: chương trình sẽ thực hiện tự động đồng bộ trang
web sau khi click vào đối tượng nếu xảy ra ajax (hiện tại hoạt động
chưa chính xác)
o Nếu Value là số, chương trình đợi một khoảng thời gian là Value
trước khi thực hiện bước tiếp theo hoặc trả về kết quả sau cùng.
o Nếu Value có dạng “[event]xpath”:
Nếu event là “change”: chương trình sẽ đợi cho đến khi phần
tử element được lấy bởi xpath thay đổi hoặc khi event timeout
(5s).
52
Target: đối tượng tác động của action. Target có dạng: [type] search. Hiện
chương trình hỗ trợ 3 kiểu tìm kiếm là:
- Nếu type là “name” thì chương trình sẽ tìm kiếm phần tử có thuộc tính name
là search
- Nếu type là “id” thì chương trình sẽ tìm kiếm phần tử có thuộc tính id là
search
- Nếu type là “xpath” thì lúc này giá trị của search phải có dạng
[number]xpath, chương trình sẽ thực hiện tìm kiếm các phần tử thỏa biểu
thức xpath và lấy phần tử thứ number trong các phần tử tìm kiếm được.
Value: giá trị hoặc option của action
Ví dụ 1:
http://google.com
type
[name]q
project
click
[name]btnG
0
Tập tin input của DESSBrowser:
Chương trình sẽ load trang http://google.com, sau đó thực hiện nhập chuỗi
“project” vào khung search của google, và click chuột vào nút search để lấy nội dung
trang kết quả trả về.
Ví dụ 2:
http://comic.vuilen.com/
click
[xpath][0]//img[@src="images/next_rounded_sidebar2.gif"]
[change]//body
Tập tin input của DESSBrowser
Chương trình thực hiện load trang web, sau đó click vào nút phân trang ajax và
đợi cho đến khi body thay đổi (nghĩa là trang web đã load xong ajax).
53
3.3.4 EXTRACTOR
Class Extractor có nhiệm vụ bóc tách dữ liệu từ nội dung trang web mà crawler trả về
Hình 3-11. Sơ đồ class của các Extractor
Hiện nay chương trình chỉ hỗ trợ xử lý bằng một input là Xpath, tuy nhiên thiết
kế trên cho phép dễ dàng mở rộng thêm các phương pháp lấy dữ liệu như: Perl
Expression, jQuery Selector.
Sử dụng XPATH để lấy dữ liệu thông qua hai helper pDOM và pXPATH.
Khác với Expression Extractor, XPATH cần phải được thực hiện các bước
chuyển đổi từ input do crawler tạo ra trước khi query lấy dữ liệu.
Khi thực hiện lệnh load, Extractor tạo một DOMDocument bằng pDOM, và từ
DOMDocument đó tạo một DOMXPath để query dữ liệu
//div[@class=”title”]|
Ví dụ:
Extractor sẽ thực hiện lệnh query trên DOMDocument hiện tại, tìm kiếm các div
có thuộc tính class là title.
54
KẾT LUẬN
Các kết quả đạt được
Luận văn đã nêu lên được những nét cơ bản của bài toán khai thác dữ liệu trên
web, các kỹ thuật phân tích, bóc tách và trích xuất dữ liệu trên nội dung HTML. Từ đó
đưa ra giải pháp và hiện thực một ứng dụng hỗ trợ người dùng nhập liệu nhằm giải
thiểu tiền bạc, thời gian và công sức mà vẫn đảm bảo được lượng thông tin như mong
muốn.
Các hạn chế của ứng dụng
Mặc dù DESS đã đạt được một số kết quả nhất định nhưng do khả năng cũng như
điều kiện thời gian không cho phép nên vẫn còn tồn tại một vài hạn chế chưa thể khắc
phục:
1. Khó sử dụng: Để có thể giải quyết được một bài toán trích xuất dữ liệu trên
một website cụ thể, người sử dụng DESS cần phải có kiến thức về Web,
HTML, Xpath…
2. Thư viện HtmlInput chưa thật sự hoạt động tốt đối với các trang web phức
tạp, dẫn tới kết quả có thể bị sai lệch.
Hướng phát triển
Các hướng phát triển của đề tài mà ta có thể nghĩ đến:
1. Tích hợp một web browser lên ứng dụng cho phép người dùng lựa chọn thông
tin cần trích xuất mà không cần đặc tả XPath.
2. Áp dụng các kỹ thuật tìm kiếm thông minh giúp ứng dụng thu thập và chắt lọc
thông tin có chất lượng tốt.
55
TÀI LIỆU THAM KHẢO
Tiếng Việt
[1] Đinh Mạnh Tường (2000). Cấu trúc dữ liệu và thuật toán. Nhà xuất bản khoa
học và kỹ thuật.
Tiếng Anh
[2] Michael Schrenk (2007). Webbots, Spiders, and Screen Scrapers. No Starch,
San Francisco, USA.
[3] Sriram Raghavan, Hector Garcia-Molina (2001). Crawling the Hidden Web.
Computer Science Department, Stanford University, USA.
[4] Steve Lawrence, C. Lee Giles (1998). Searching the World Wide Web.
Science, 280(5360):98.
[5] Michael K. Bergman (2001). White Paper: The Deep Web: Surfacing Hidden
Value. University of Michigan, USA.
[6] Stephen Soderland. Learning to Extract Text-based Information from the
World Wide Web. Department of Computer Science & Engineering,
University of Washington.
56
Có thể bạn quan tâm
Tài liêu mới
xuất, ở dạng biểu thức XPath.
- : xác định các helper-function dùng để hậu xử lý dữ
liệu sau khi lấy được từ nội dung trang web (lưu ý rằng các dữ liệu này đều
ở dạng text). Các helper được phân cách bằng ký tự “|”. Người sử dụng có
thể tự định nghĩa nên các helper-function này bằng cách viết các hàm riêng
cho mình. DESS cung cấp 6 helper-function được xây dựng sẵn:
o trim: cắt bỏ các khoảng trắng thừa ở đầu và cuối chuỗi
o replace: cú pháp replace:a,u có ý nghĩa thay thế tất cả sự xuất hiện
của “a” trong chuỗi thành “u”
o entity: chuyển các ký tự đặc biệt thành HTML entity, ví dụ &
chuyển thành &
o strip: lọc bỏ hết tất cả các tag
41
o space: thay thế tất cả các chuỗi nhiều khoảng trắng thành một
khoảng trắng duy nhất
o content: bỏ tag đóng và tag mở, chỉ lấy nội dung bên trong
- : dùng thẻ này khi ta muốn action capture trả về đúng
chuỗi giá trị trong thẻ, chứ không trích xuất dữ liệu từ trang web. Thẻ này
được dùng trong các trường hợp dùng capture action làm parameter giá trị
cố định cho GET, POST (xem ví dụ của Link Action bên dưới). Khi dùng
thẻ này thì không được phép có các thẻ xpath, expression, selector và
list phải là N.
Block Action: block
Khi trên trang web đang xét có nhiều phân vùng dữ liệu khác nhau và ta muốn các data record của các phân vùng này được gom nhóm lại với nhau vào chung một data record lớn có nhiều field, ta cần dùng block action. Block action sẽ bao bọc nhiều capture action con, bản thân block action sẽ trả về một hoặc nhiều phân vùng dữ liệu “cha chung” của các phân vùng dữ liệu con (gọi là các block data). Block action có các thẻ sau:
-
: giá trị Y hoặc N, xác định rằng block action này trả về một
hay nhiều block data (mỗi block data này chứa các phân vùng dữ liệu con)
- : tương tự Capture Action
Các biểu thức XPath của các Capture Action con sẽ phải là tương đối với nội
Link Action:
dung của block data.
Các Link Action trả về danh sách các URL có được nhờ biểu thức tìm kiếm XPath, Expression, Selector tương tự như các action trên. Tuy nhiên Link Action cũng cho phép gửi kèm theo các tham số vào URL, theo phương thức HTTP GET hoặc HTTP POST, thông qua thành phần options, ví dụ:
42
Trong ví dụ trên, thẻ static cũng được dùng cho Link Action và có tác dụng tương tự thẻ static của Capture Action. Ví dụ trên sẽ thể hiện cho thao tác gửi một yêu cầu HTTP POST đến http://www.example.com/index.aspx kèm theo tham số id có giá trị “SW063”. Một ví dụ khác mà tham số truyền có giá trị được trích xuất từ nội dung trang web:
z0-9\$_]*next)"/s
Type Action: type
thì giá
Type Action thể hiện thao tác nhập chuỗi ký tự vào một điều khiển nào đó (một textfield, một textarea, v.v..) cho phép nhập liệu (target). Giá trị nhập vào được thể hiện trong thẻ value, còn target thể hiện bằng thẻ static hoặc xpath. Nếu dùng thẻ static trị của nó phải ở dạng [name]name_to_search hoặc [id]id_to_search. Ví dụ sau sẽ thể hiện thao tác nhập giá trị “minh” vào điều khiển có name là q. Nếu dùng thẻ xpath thì action sẽ nhập giá trị vào điều khiển tìm được bởi biểu thức XPath.
Click Action:
43
Click Action thể hiện thao tác click chuột vào một điều khiển chẳng hạn một nút bấm button. Action cũng hỗ trợ tìm kiếm target bằng name, id hoặc bằng XPath. Ví dụ sau thể hiện thao tác click chuột vào một điều khiển có name là btnG.
Năm loại Action trên có thể kết hợp với nhau, lồng nhau để có thể giải quyết những trường hợp từ đơn giản cho đến phức tạp. Tuy nhiên, Simple crawler engine chỉ sử dụng Link Action, Capture Action và Block Action, trong đó Simple crawler sử dụng các Link Action để chuyển trang, Extractor sử dụng Capture Action và Block Action để trích xuất dữ liệu. Đối với Advanced crawler engine, chỉ có Click Action, Type Action, Capture Action và Block Action là có thể sử dụng, trong đó Advanced crawler sử dụng Click Action và Type Action (thông qua HtmlInput) để giả lập browser, thực thi JavaScript, còn Extractor sử dụng Capture Action và Block Action giống như Simple crawler engine.
3.1.3 ĐẶC TẢ BẢNG CƠ SỞ DỮ LIỆU
Phần này gồm một element duy nhất, đó là thẻ
Tất cả các dữ liệu trích xuất được của DESS sẽ được lưu vào bảng này. Tên của bảng sẽ được sinh tự động và là duy nhất đối với mỗi Bot. Mỗi dữ liệu cần trích xuất được đặc tả trong thẻ data đã được định danh bằng thẻ name trong capture action tương ứng, và chúng sẽ được lưu vào một field tương ứng trong bảng. Người sử dụng phải dùng các tên định danh của các data này làm tên các column để DESS có thể biết mỗi dữ liệu trích xuất được cần lưu vào field nào của bảng.
Ví dụ sau đây đặc tả bảng cơ sở dữ liệu của Bot gồm 2 field, tương ứng với 2
phần dữ liệu cần trích xuất có tên định danh title và description.
44
Hình 3-1. Sơ đồ cấu trúc cơ sở dữ liệu của chương trình
3.2 CẤU TRÚC CƠ SỞ DỮ LIỆU
Mô tả các bảng
STT
Tên
Mô tả
1 wde_crawl
Dữ liệu về Robot (Tên, Cấu hình, Trạng thái…)
2 wde_url
Các link của các trang web mà Robot trích xuất dữ liệu
3 wde_log
Quá trình hoạt động của Robot
4 wde_setting
Cac cấu hình của chương trình
5 wde_data_[num]
Dữ liệu mà Robot thu thập được với [num] tương ứng với ID của Robot, Cấu trúc của bảng phụ thuộc vào khai báo của người sử dụng.
45
3.3 SƠ ĐỒ TUẦN TỰ CHO CÁC CHỨC NĂNG
Hình 3-2. Sơ đồ tuần tự của tác vụ start Bot
Hình 3-3. Sơ đồ tuần tự của tác vụ resume Bot
3.3.1 BOT MANAGER
46
Hình 3-4. Sơ đồ tuần tự của tác vụ pause Bot
Hình 3-5. Sơ đồ tuần tự của tác vụ stop Bot
3.3.2 ROBOT
Class Robot đóng vai trò trung tâm điều khiển của Crawler và Extractor. Mọi
hoạt động của hai đối tượng này đều được điều khiển, phối hợp với nhau bởi Robot.
47
Hình 3-6. Sơ đồ tuần tự thể hiện quá trình hoạt động tổng quát của Robot
3.3.2.1 Quản lý tiến trình của Robot
Chạy Bot: Khi nhận được lênh kích hoạt từ người dùng thông qua Bot
Controller, Robot sẽ tiến hành thực hiện tuần tự các công việc sau:
- Cập nhật trạng thái của Robot thành đang hoạt động (Started).
- Kiểm tra xem Robot có đang được chạy hay không: Mỗi Robot sẽ được chạy trên một process riêng biệt. Robot sẽ kiểm tra Process ID của Robot muốn có đang tồn tại trong danh sách Process của Hệ điều hành hay không.
o Nếu không, Robot sẽ thực hiện một lênh khởi tạo một process mới để
chạy Bot được yêu cầu.
o Nếu có, Robot sẽ dừng lại.
48
Dừng Bot:
- Trong mỗi vòng lặp của quá trình hoạt động, Bot kiểm tra trạng thái của
mình.
- Nếu trạng thái là “Started”, Bot sẽ tiếp tục chạy.
- Nếu trạng thái không là “Started”, Bot sẽ dừng lại.
Việc tạo process mới để chạy và quản lý Robot bằng Process ID đã giúp khắc
phục nhược điểm khách quan của PHP là time limit.
3.3.2.2 Thực hiện quy trình thu thập dữ liệu
Class Robot điều khiển hai thành phần chính là Crawler và Extractor để tiến hành
Hình 3-7. Quá trình thu thập dữ liệu tổng quát
thu thập dữ liệu, quá trình tổng quát nhìn từ mức cao sẽ có dạng như sau:
Trong mỗi vòng lặp của quy trình hoạt động, Bot lần lượt sử dụng Crawler và Extractor để tiến hành thu thập dữ liệu. Ban đầu, Bot sẽ lấy url từ cơ sở dữ liệu, dùng Crawler để lấy nội dung trang Web, trả nội dung lấy được cho Extractor. Sau đó bot sẽ tiến hành duyệt qua các Action và dùng Extractor để thực hiên chúng, Kết quả extractor trả về sẽ được Bot lưu giữ trong cơ sở dữ liệu.
49
Như vậy có thể nói class Robot chính là trung tâm điểu khiển của back-end, điều khiển mọi hoạt động của Crawler và Extractor, giúp Crawler và Extractor phối hợp, đan xen với nhau để quá trình thu thập dữ liệu tự động được hoàn thành.
3.3.3 CRAWLER
Hình 3-8. Sơ đồ class của các Crawler
Class Crawler có nhiệm vụ lấy nội dung một trang web từ một url cùng các options và trả về định nghĩa HTML của nó. Crawler bao gồm hai crawler engine là Simple Crawler Engine và Advanced Crawler Engine.
Hiện nay chương trình chỉ hỗ trợ sử dụng một trong hai crawler engine, người sử dụng quyết định chọn lựa engine nào được dùng thông qua thẻ engine của đặc tả cấu hình XML.
50
Hình 3-9. Sơ đồ tuần tự hoạt động của Simple Crawler
3.3.3.1 Simple Crawler
Sử dụng pHTML Helper, đây là một wrapper của thư viện cURL của PHP, có
khả năng thực hiện các chức năng HTTP cơ bản như: GET, POST, HTTP Auth …
Hình 3-10. Sơ đồ tuần tự hoạt động của Advanced Crawler
3.3.3.2 Advanced Crawler
51
DESSBrowser
Advanced Crawler sử dung DESSBrowser - một browser giả lập được viết bằng java sử dụng thư viện HTMLUnit, có khả năng thực hiện các đoạn mã javascript, activeX, java applet…
Khi được cung cấp một url kèm theo các options mô tả các hoạt đông, Advanced Crawler sẽ tạo một fileInput chứa các hoạt động đó, sau đó sẽ gọi DESSBrowser với thông số là input và output, DESSBrowser sẽ thực hiện các action được truyền qua và lấy nội dung cuối cùng ghi vào file output, cũng là file chứa nội dung trang Web cần lấy.
java –jar DESSBrowser input.txt output.html
DESSBrowser nhận 2 thông số là tập tin đầu vào và tập tin đầu ra.
Khi thực thi, DESSBrowser sẽ tiến hành đọc nội dung của file input, thực hiện
các action được miêu tả trong đó. Sau đó ghi kết quả cuối cùng ra file output.
url trang web
action block
action block
…
Cấu trúc file input
Mỗi action block được miêu tả bằng 3 thành phần nằm trên 3 dòng riêng biệt:
Action Type: loại action. Hiện chương trình hỗ trợ hai loại action cơ bản, tương
tự như trong cấu hình XML:
- Type: thực hiện thao tác nhập giá trị value vào trong target
- Click: thực hiện thao tác click chuột vào target. Value của Action lúc này
chính là option của thao tác:
o Nếu Value: “auto”: chương trình sẽ thực hiện tự động đồng bộ trang web sau khi click vào đối tượng nếu xảy ra ajax (hiện tại hoạt động chưa chính xác)
o Nếu Value là số, chương trình đợi một khoảng thời gian là Value
trước khi thực hiện bước tiếp theo hoặc trả về kết quả sau cùng.
o Nếu Value có dạng “[event]xpath”:
Nếu event là “change”: chương trình sẽ đợi cho đến khi phần tử element được lấy bởi xpath thay đổi hoặc khi event timeout (5s).
52
Target: đối tượng tác động của action. Target có dạng: [type] search. Hiện
chương trình hỗ trợ 3 kiểu tìm kiếm là:
- Nếu type là “name” thì chương trình sẽ tìm kiếm phần tử có thuộc tính name
là search
- Nếu type là “id” thì chương trình sẽ tìm kiếm phần tử có thuộc tính id là
search
- Nếu type là “xpath” thì lúc này giá trị của search phải có dạng [number]xpath, chương trình sẽ thực hiện tìm kiếm các phần tử thỏa biểu thức xpath và lấy phần tử thứ number trong các phần tử tìm kiếm được.
Value: giá trị hoặc option của action
Ví dụ 1:
http://google.com
type
[name]q
project
click
[name]btnG
0
Tập tin input của DESSBrowser:
Chương trình sẽ load trang http://google.com, sau đó thực hiện nhập chuỗi “project” vào khung search của google, và click chuột vào nút search để lấy nội dung trang kết quả trả về.
Ví dụ 2:
http://comic.vuilen.com/
click
[xpath][0]//img[@src="images/next_rounded_sidebar2.gif"]
[change]//body
Tập tin input của DESSBrowser
Chương trình thực hiện load trang web, sau đó click vào nút phân trang ajax và
đợi cho đến khi body thay đổi (nghĩa là trang web đã load xong ajax).
53
3.3.4 EXTRACTOR
Class Extractor có nhiệm vụ bóc tách dữ liệu từ nội dung trang web mà crawler trả về
Hình 3-11. Sơ đồ class của các Extractor
Hiện nay chương trình chỉ hỗ trợ xử lý bằng một input là Xpath, tuy nhiên thiết kế trên cho phép dễ dàng mở rộng thêm các phương pháp lấy dữ liệu như: Perl Expression, jQuery Selector.
Sử dụng XPATH để lấy dữ liệu thông qua hai helper pDOM và pXPATH.
Khác với Expression Extractor, XPATH cần phải được thực hiện các bước
chuyển đổi từ input do crawler tạo ra trước khi query lấy dữ liệu.
Khi thực hiện lệnh load, Extractor tạo một DOMDocument bằng pDOM, và từ
DOMDocument đó tạo một DOMXPath để query dữ liệu
Ví dụ:
Extractor sẽ thực hiện lệnh query trên DOMDocument hiện tại, tìm kiếm các div
có thuộc tính class là title.
54
KẾT LUẬN
Các kết quả đạt được
Luận văn đã nêu lên được những nét cơ bản của bài toán khai thác dữ liệu trên web, các kỹ thuật phân tích, bóc tách và trích xuất dữ liệu trên nội dung HTML. Từ đó đưa ra giải pháp và hiện thực một ứng dụng hỗ trợ người dùng nhập liệu nhằm giải thiểu tiền bạc, thời gian và công sức mà vẫn đảm bảo được lượng thông tin như mong muốn.
Các hạn chế của ứng dụng
Mặc dù DESS đã đạt được một số kết quả nhất định nhưng do khả năng cũng như điều kiện thời gian không cho phép nên vẫn còn tồn tại một vài hạn chế chưa thể khắc phục:
1. Khó sử dụng: Để có thể giải quyết được một bài toán trích xuất dữ liệu trên một website cụ thể, người sử dụng DESS cần phải có kiến thức về Web, HTML, Xpath…
2. Thư viện HtmlInput chưa thật sự hoạt động tốt đối với các trang web phức
tạp, dẫn tới kết quả có thể bị sai lệch.
Hướng phát triển
Các hướng phát triển của đề tài mà ta có thể nghĩ đến:
1. Tích hợp một web browser lên ứng dụng cho phép người dùng lựa chọn thông
tin cần trích xuất mà không cần đặc tả XPath.
2. Áp dụng các kỹ thuật tìm kiếm thông minh giúp ứng dụng thu thập và chắt lọc
thông tin có chất lượng tốt.
55
TÀI LIỆU THAM KHẢO
Tiếng Việt
[1] Đinh Mạnh Tường (2000). Cấu trúc dữ liệu và thuật toán. Nhà xuất bản khoa
học và kỹ thuật.
Tiếng Anh
[2] Michael Schrenk (2007). Webbots, Spiders, and Screen Scrapers. No Starch,
San Francisco, USA.
[3] Sriram Raghavan, Hector Garcia-Molina (2001). Crawling the Hidden Web.
Computer Science Department, Stanford University, USA.
[4] Steve Lawrence, C. Lee Giles (1998). Searching the World Wide Web.
Science, 280(5360):98.
[5] Michael K. Bergman (2001). White Paper: The Deep Web: Surfacing Hidden
Value. University of Michigan, USA.