MỤC LỤC
1 Giới thiệu 11
1.1 Mở đầu 11
1.2 Yêu cầu và mục tiêu của đề tài 11
1.2.1 Yêu cầu 11
1.2.2 Mục tiêu 12
1.3 Bố cục báo cáo 12
2 Tìm hiểu và phân tích sơ bộ 13
2.1 Tìm hiểu các kiến thức tổng quan 13
2.1.1 World Wide Web 13
2.1.2 Web Crawler 14
2.1.3 Web Scraper 15
2.1.4 Phân loại Web 16
2.1.4.1 Phân loại dựa vào sự thể hiện của tính động 16
2.1.4.2 Phân loại dựa vào cách thức tạo ra tính động 17
2.1.4.3 Khả năng của các web crawler 18
2.2 Phân tích sơ bộ 18
3 Các kiến thức nền tảng và các công nghệ liên quan 22
3.1 HTML 22
3.2 XML 23
3.3 XHTML 24
3.3.1 Tính chuẩn của một tài liệu XML (well-formed) 24
3.3.2 Tên các phần tử và tên các thuộc tính của phần tử phải ở dạng chữ in thường 24
3.3.3 Các thẻ không rỗng bắt buộc phải có thẻ đóng 24
3.3.4 Các thuộc tính luôn phải ghi rõ giá trị 25
3.3.5 Các phần tử rỗng 25
3.4 XPath 26
3.4.1 Cú pháp và ngữ nghĩa 26
3.4.1.1 Cú pháp rút gọn 26
3.4.1.2 Cú pháp đầy đủ 27
3.4.2 Axis specifier 27
3.4.3 Node test 28
3.4.4 Predicate 28
3.4.5 Các hàm và toán tử 29
3.5 Các công nghệ và thư viện hỗ trợ khác 29
3.5.1 HTML Tidy 29
3.5.2 cURL 31
4 Phân tích 33
4.1 Một ví dụ tổng quát của bài toán thu thập dữ liệu 33
4.2 Phân loại các trang Web dựa vào cách thức chuyển trang 36
4.3 Phân tích và các giải pháp 37
5 Thiết kế 41
5.1 Sơ đồ Use Case 41
5.2 Kiến trúc tổng quan 42
5.3 Thành phần FRONT 44
5.3.1 Mô hình MVC 44
5.3.2 Bot Manager 46
5.3.2.1 Các trạng thái của Bot 46
5.3.2.2 Các lệnh tạo mới, xóa, sửa thông tin Robot 48
5.4 Thành phần CORE 50
5.4.1 Crawler 51
5.4.2 Extractor 53
5.4.3 Các Helper 54
6 Hiện thực 56
6.1 Môi trường phát triển ứng dụng 56
6.2 Giao diện sử dụng của WDE 57
6.3 Đặc tả dữ liệu đầu vào bằng XML 60
6.3.1 Đặc tả thông tin chung cho Bot 60
6.3.2 Đặc tả các trang 61
6.3.3 Đặc tả bảng cơ sở dữ liệu 66
6.4 Cấu trúc cơ sở dữ liệu 67
6.4.1 Danh sách các bảng 67
6.4.2 Chi tiết các bảng 67
6.5 Front 70
6.5.1 Bot Manager 70
6.6 Core 72
6.6.1 Robot 73
6.6.1.1 Quản lý tiến trình của Robot 73
6.6.1.2 Thực hiện quy trình thu thập dữ liệu 75
6.6.2 Crawler 77
6.6.2.1 Simple Crawler: 78
6.6.2.2 Advanced Crawler: 79
6.6.2.2.1 wdeBrowser 79
6.6.2.2.2 Ví dụ 81
6.6.3 Extractor 82
6.6.3.1 Expression Extractor 82
6.6.3.2 XPath Extractor 83
6.6.3.3 Selector Extractor 83
7 Sử dụng và đánh giá 85
7.1 Các bước cơ bản để sử dụng ứng dụng 85
7.1.1 Xác định trang web cần thu thập dữ liệu 87
7.1.2 Xác định kiểu lấy dữ liệu (crawler engine) cho Robot 87
7.1.3 Xác định các tùy chọn cho Robot 87
7.1.4 Xây dựng cấu hình cụ thể cho từng trang con 88
7.1.5 Xác định cấu trúc cơ sở dữ liệu lưu trữ: 89
7.2 Các ví dụ cụ thể từ đơn giản đến phức tạp 90
7.2.1 Ví dụ 1 90
7.2.2 Ví dụ 2: 92
7.2.3 Ví dụ 3 95
8 Đánh giá chung 98
8.1 Các kết quả đạt được 98
8.2 Các hạn chế của ứng dụng 99
8.3 Hướng phát triển 100
9 Tổng kết 101
10 Tài liệu tham khảo 102
101 trang |
Chia sẻ: netpro | Lượt xem: 3634 | Lượt tải: 5
Bạn đang xem trước 20 trang tài liệu Luận văn Xây dựng ứng dụng thu thập dữ liệu tự động từ các Website, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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ư John 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 John phải làm có thể sẽ như sau:
Từ trang chủ website, John 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.
Sau khi đã vào được phân mục của lĩnh vực John mong muốn, John 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.
Ở trang thông tin chi tiết này (một trang cấp N, cấp thấp nhất), John 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à John muốn, có thể là một tài liệu Microsoft Excel.
Sau khi lấy được thông tin của doanh nghiệp này, John 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 đến trang chi tiết của doanh nghiệp thứ hai. John lại lặp lại công việc của bước thứ 3.
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 John đã 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 John 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à John 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 [1]). 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, John 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 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 John, 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.
Phân loại các trang Web dựa vào cách thức 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:
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ụ:
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.
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.
Phân tích và các giải pháp
Từ những phân tích trên, nhóm 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à WDE – Web Data Extractor)
Người sử dụng có thể cho WDE 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 WDE 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 WDE 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.
Người sử dụng có thể cho WDE 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ư WDE 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, WDE sẽ có thể trích xuất dữ liệu một cách tự động và hiệu quả. Nhóm đã 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 điểm 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… WDE 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, nhóm thực hiện đề tài đư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
Nội dung XHTML “sạch” sẽ giúp hạn chế được các lỗi xảy ra ngay cả khi sử dụng phương pháp tìm kiếm so trùng, điều này đem lại một lựa chọn khác đó là Perl Expression.
Ngôn ngữ XPath tuy mạnh mẽ nhưng đôi khi hơi dài dòng. Nhóm quyết định hỗ trợ thêm một lựa chọn nữa đó là jQuery Selector, có cú pháp đơn giản hơn, nhưng vẫn giữ lại khả năng tìm kiế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ế, nhóm đã đư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.
Đố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 nhóm đó 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, nhóm 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
Nhóm 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
Nhóm đã chọn PHP làm ngôn ngữ phát triển chính cho WDE, vì:
WDE 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ữ.
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.
Nhóm 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.
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 đó, WDE 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. Một số các khả năng mở khác sẽ được đề cập chi tiết hơn ở các phần sau của báo cáo này.
Thiết kế
Sơ đồ Use Case
Hình 51. Sơ đồ Use Case của ứng dụng WDE
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 họat 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
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
Xuất dữ liệu thu thập được ra tập tin để người dùng có thể sử dụng về sau
Các định dạng tập tin hỗ trợ: SQL, CSV, XLS, XLSX
9
Thay đổi connection
Thay đổi đường đi có sẵn
10
Statistic
Thống kê Robot
Kiến trúc tổng quan
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 và CORE.
FRONT là thành phần front-end của ứng dụng, còn CORE là thành phần cốt lõi của ứng dụng (back-end), thực hiện các công việc crawl và trích xuất dữ liệu. Hai thành phần này tương tác với nhau để cùng vận hành.
Hình 52. Kiến trúc tổng quan của WDE
Bản thân thành phần FRONT sử dụng kiến trúc Model-View-Controller (MVC) [1] cho module con. Trong FRONT 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 này.
Thành phần CORE 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.
Thành phần FRONT
Thành phần FRONT hàm chứa một thành phần con duy nhất đó là Bot Manager. Bot Manager sử dụng mô hình MVC làm thiết kế chính.
Hình 53. Kiến trúc của thành phần FRONT
Mô hình MVC
MVC (Model-View-Controller) là một mẫu kiến trúc phần mềm được sử dụng rất rộng rãi trong công nghệ phần mềm. MVC đem lại sự tách bạch giữa logic ứng dụng (domain logic) với dữ liệu bên dưới và giao diện thể hiện, tạo nhiều thuận lợi cho việc phát triển, kiểm thử và bảo trì do giao diện thể hiện và dữ liệu bên dưới thường ít liên quan đến nhau.
Model đại diện cho các dữ liệu bên dưới của ứng dụng, bao đóng các trạng thái của ứng dụng (application state). Các dữ liệu này thường được thể hiện như các cấu trúc dữ liệu. Trong các ứng dụng lớn sử dụng mô hình MVC, các dữ liệu trong model được quản lý, truy xuất, thay đổi bởi Data Access Layer [1], tuy nhiên MVC không ràng buộc điều này và việc có hiện thực các data access object trong model hay không là do quyết định của người lập trình. Trong thành phần FRONT các lớp model không sử dụng các data access object. Ví dụ trong module Bot Manager của FRONT, model là một class duy nhất có các function giúp xóa, sửa, tạo mới các bot, hoặc thực hiện các công việc liên quan đến database.
View: khi model có sự thay đổi, nó sẽ thông báo đến các view liên quan để các view này có thể cập nhật. Một model có thể có nhiều view tương ứng với nó, các View này giúp thể hiện model dưới dạng phù hợp để có thể tương tác với người sử dụng. Ví dụ trang giao diện giúp quản lý các Bot chính là view của Bot Manager module.
Controller tạm gọi là phần “điều khiển”, đảm nhiệm việc nhận yêu cầu từ các view và chuyển thành các lời gọi hàm gọi xuống model object, sau đó controller cũng giúp chọn view đích để hoàn tất việc phản hồi của yêu cầu (response). Controller thể hiện cho cách ứng xử của ứng dụng (application behavior). Trong Bot Manager, controller là cầu nối giữa giao diện quản lý Bot và model object, ngoài ra cũng là cầu nối giữa người sử dụng với thành phần CORE của ứng dụng.
Hình 54. Mô hình MVC
Bot Manager
Các trạng thái của Bot
Một trong những trách nhiệm của việc quản lý Bot đó là 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:
Hình 55. 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
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.
Các lệnh tạo mới, xóa, sửa thông tin Robot
Tạo mới Robot: Khi tạo mới một Robot (Bot), WDE sẽ yêu cầu người sử dụng nhập dữ liệu đặc tả đầu vào dưới dạng XML. Sau khi người sử dụng submit, đặc tả đầu vào được lưu vào cơ sở dữ liệu và trạng thái của Bot vừa tạo sẽ ở trạng thái Ready.
Hình 56. Quá trình tạo mới một Bot
Chỉnh sửa thông tin Robot: Người sử dụng có thể thay đổi đặc tả đầu vào sau khi đã tạo Bot. Nếu Bot đang chạy thì ứng dụng sẽ tự ngừng Bot để Bot trở về trạng thái Ready. Sau khi chỉnh sửa, ứng dụng sẽ đọc lại đặc tả XML và cập nhật lại vào cơ sở dữ liệu.
Hình 57. Quá trình chỉnh sửa một Bot
Xóa Bot: khi xóa một Bot, toàn bộ thông tin cũng như dữ liệu trích xuất được trong các lần chạy trước của Bot trong cơ sở dữ liệu sẽ bị xóa.
Hình 58. Quá trình xóa một Bot
Hình 59. Quá trình nhận dữ liệu đặc tả đầu vào XML
Thành phần CORE
CORE là thành phần cốt lõi của WDE, 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 CORE thực hiện các tác vụ này và cũng là đối tượng quan trọng nhất trong CORE, đó 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.
Hình 510. Kiến trúc thành phần CORE
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.
Hình 511. 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.
Hình 512. Crawler gồm có 2 crawler engine là Simple và Advanced
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 parse 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. Nhóm đã quyết định sử dụng 3 cách thức để giúp việc đặc tả này, đó là Perl Expression, XPath và jQuery Selector. Điều này đem lại sự mềm dẻo cho WDE vì người sử dụng có thể lựa chọn cách thức nào cảm thấy thuận lợi nhất.
Từ 3 cách thức trên, nhóm đã thiết kế Extractor như một Wrapper của 3 extractor con, mỗi extractor sử dụng một cách thức khác nhau để bóc tách, trích xuất dữ liệu:
Expression Extractor: dùng Perl Expression để lấy dữ liệu
XPath Extractor: dùng XPath để lấy dữ liệu
Selector Extractor: dùng jQuery Selector để lấy dữ liệu
Các extractor này về chức năng đều giống nhau, chỉ khác về dữ liệu đặc tả đầu vào để chúng có thể trích xuất ra được đúng thông tin cần thiết. Các đặc tả đầu vào này được thể hiện thông qua các Action, chi tiết về khái niệm Action trong WDE sẽ được trình bày chi tiết ở phần Hiện thực.
Hình 513. Extractor gồm có 3 Extractor con
Các Helper
Các helper trong CORE 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ư:
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
Các file đính kèm theo tài liệu này:
- Xây dựng ứng dụng thu thập dữ liệu tự động từ các Website.doc