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 đế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 [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à hồn tồ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 tồ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 tồn bộ trang web, chúng ta hồn tồ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 tố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.
1.5.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ụ:
- 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.
1.5.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 Suppor 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.
- 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ả. 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 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.
Ngồ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ả hồn tồ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 tố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
- 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 Ngồ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 tố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.
1.6 THIẾT KẾ ỨNG DỤNG
1.6.1 SƠ ĐỒ USE CASE
Hình 2-5. Sơ đồ Use Case của ứng dụng DESS