TÓM TẮT LUẬN VĂN
Với sự bùng nổ về công nghệ thông tin những năm gần đây, đặc biệt là sự phát triển mạnh mẽ như vũ bão của Internet, cuộc sống của con người đã càng ngày càng trở nên phong phú và đa dạng hơn. Kho tàng tri thức của Internet đã làm thay đổi đáng kể nhiều lĩnh vực, từ học tập, nghiên cứu cho đến kinh doanh và thương mại. Tuy nhiên con người vẫn không dừng lại, họ luôn có những khát khao tìm tòi và phát triển, đặc biệt là đối với chiếc máy tính. Chiếc máy tính cá nhân đã được ra đời để trợ giúp cho con người, và họ vẫn luôn tìm cách làm cho nó có thể hỗ trợ được cho con người nhiều hơn nữa, thậm chí là làm thay cho con người.
Trong thực tế 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 World Wide Web để khai thác thông tin hữu ích, phục vụ cho các mục đích 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 phải có sự thu thập 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.
Đề tài Luận Văn Tốt Nghiệp này sẽ cố gắng giải quyết vấn đề nêu trên, bằng cách xây dựng một công cụ hỗ trợ có khả năng giúp con người trong những bài toán thu thập dữ liệu, một cách tự động. Công cụ sẽ cố gắng làm thay cho con người ở một số công đoạn, giúp giảm thời gian và sức lực của con người trong việc thu thập dữ liệu từ các website. Ý tưởng này nếu thành công sẽ đem lại được rất nhiều lợi ích vì nhu cầu thu thập dữ liệu trên web hiện nay đã trở thành một nhu cầu rất phổ biến và thiết thực.
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ẻ: lvcdongnoi | Lượt xem: 6728 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu 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
bot
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 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
Hiện thực
Môi trường phát triển ứng dụng
Hê điều hành: Microsoft Windows 7, Microsoft Windows XP.
Để có thể quản lý tiến trình của Robot, chương trình sử dụng một số hàm của hệ điều hành để phục vụ cho việc này:
tasklist.exe: theo dõi các process đang chạy.
start.exe: thực thi lệnh, với thông số /B cho phép ứng dụng chạy ngầm (background).
Ngôn ngữ lập trình:
PHP: lập trình cho FRONT và CORE của chương trình.
Java: xây dựng command-line Browser tương tác với chương trình.
C#: chương trình XMLHelper hỗ trợ người dùng.
Nền tảng: Apache – MySQL – PHP, ở đây nhóm phát triển sử dụng XAMPP 1.7.2 với các thành phần:
PHP: phiên bản 5.3.0 với các Extension cần thiết để chạy: CURL, TIDY
MySQL: phiên bản 5.1
Các môi trường thực thi cần thiết cho các chức năng bổ sung của chương trình (Không bắt buộc):
JRE (Java Runtime Environment): chạy Browser của chương trình.
.NET Framework 3.5: chạy XMLHelper.
PHP Framework: CodeIgniter version 1.7.2, được thiết kế theo mô hình MVC, đơn giản dễ sử dụng, ít tốn tài nguyên, hỗ trợ các chức năng cần thiết cho chương trình.
Giao diện sử dụng của WDE
Giao diện màn hình chính cũng là màn hình quản lý Robot:
Hình 61. Giao diện chính của WDE
Giao diện thay đổi / chỉnh sửa Robot:
Hình 62. Giao diện nhập / chỉnh sửa dữ liệu đặc tả đầu vào XML
Giao diện thay đổi / chỉnh sửa Robot gồm có các input:
Name: tên của Robot.
XML: cấu hình của Robot.
Màn hình quản lý dữ liệu:
Hình 63. Giao diện quản lý hoạt động Bot và xem dữ liệu trích xuất được
Màn hình dữ liệu gồm có:
Grid chọn Robot để thể hiện dữ liệu của Robot.
Thông tin về Bot: các thông tin về bot như tên, trạng thái, và các thời gian liên quan.
Dữ liệu của bot.
Đặ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ẻ , tất cả các thẻ khác đều nằm trong cặp thẻ này. Các thẻ con của site có thể chia làm ba phần sau:
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
Đặc tả thông tin chung cho Bot
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
: nếu trang web yêu cầu người dùng đăng nhập để xác thực, ta có thể sử dụng tùy chọn này để Bot có thể tự đăng nhập trước khi tiến hành thu thập dữ liệu. WDE 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ụ:
Với HTTP-Authentication:
basic
username
password
Với đăng nhập bằng Form:
form
url đăng nhập
user
username
pass
password
Đặ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ẻ thể hiện cho các cấp trang của website. Mỗi cặp thẻ page có một cấp duy nhất, cấp của các trang được khai báo phải bắt đầu từ 1 và tăng dần liên tục nếu như có nhiều hơn một trang. Có các yếu tố cần quan tâm đến việc đặc tả trong một cấp trang cụ thể: cách vào những trang phân trang cùng cấp với trang đang xét, cách vào những trang con (những trang detail theo mô hình master-detail) của trang đang xét, cách lấy ra các nội dung cần trích xuất từ nội dung HTML của trang đang xét. Sau đây là các thành phần con của phần tử page.
: 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 (theo mô hình đề cập ở phần 4.1).
: đặ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à , thẻ này cho biết số trang tối đa mà Crawler của WDE sẽ tải về. Cả ba thành phần pagination, subpage và data cùng sử dụng các Action để chỉ ra cách thức chuyển trang cũng như cách thức trích xuất dữ liệu.
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 WDE, 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.
| | : biểu thức dùng để xác định phân vùng dữ liệu cần trích xuất, ở dạng biểu thức XPath (nếu dùng thẻ xpath), biểu thức Perl Expression (nếu dùng thẻ expression) hoặc biểu thức jQuery Selector (nếu dùng thẻ selector). Người sử dụng chỉ có thể chọn một trong ba kiểu này cho mỗi action.
: 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. WDE cung cấp 6 helper-function được xây dựng sẵn:
trim: cắt bỏ các khoảng trắng thừa ở đầu và cuối chuỗi
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”
entity: chuyển các ký tự đặc biệt thành HTML entity, ví dụ & chuyển thành &
strip: lọc bỏ hết tất cả các tag
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
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, Expression hoặc Selector của các Capture Action con sẽ phải là tương đối đối với nội dung của block data.
Link Action: link
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ụ:
link
capture
id
SW063
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 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
capture
__EVENTTARGET
/WebForm_PostBackOptions\("([a-z0-9\$_]*next)"/s
Type Action: type
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 thì giá 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.
type
[name]q
minh
Click Action: click
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.
click
[name]btnG
1
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.
Đặ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 WDE 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 để WDE 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.
title
varchar
100
description
varchar>
500
Cấu trúc cơ sở dữ liệu
Hình 64. Sơ đồ cấu trúc cơ sở dữ liệu của chương trình
Danh sách 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.
Chi tiết các bảng
Bảng Robot (wde_crawl)
STT
Tên cột
Ý nghĩa
Kiểu
Miền GT
Ghi chú
1
id
Mã Robot
int(11)
Khóa chính
2
pid
Mã quá trình (process id) của Robot
int(11)
3
name
Tên Robot
varchar(256)
4
xml
XML người dùng nhập
text
5
settings
Cấu hình Robot được phân tích từ xml
text
6
options
Tùy chọn của Robot
text
7
status
Trạng thái Robot
varchar(1)
[R,S,P,E]
R: Ready
S: Started
P: Paused
E: Error
8
start
Thời gian robot được kích hoạt gần nhất
int(11)
9
stop
Thời gian robot được hủy bỏ gần nhất
int(11)
10
pause
Thời gian robot được được tạm dừng gần nhất
int(11)
11
last
Thời gian robot cập nhật dữ liệu lấy được gần nhất
int(11)
12
created
Thời gian robot được tạo
int(11)
13
modified
Thời gian robot được chỉnh sửa gần nhất
int(11)
Bảng URL (wde_url)
STT
Tên cột
Ý nghĩa
Kiễu dữ liệu
Miền GT
Ghi chú
1
id
Mã URL
int(11)
Khóa chính
2
crawl_id
Mã Robot
int(11)
Quan hệ với bảng Robot
3
parent_id
Mã URL cha
int(11)
Quan hệ với bảng URL
4
pagination_id
Mã URL phân trang
int(11)
Quan hệ với bảng URL
5
hash
MD5 Hash để kiểm tra trùng
varchar(32)
6
url
URL của trang
text
7
level
Cấp đô sâu của trang
mediumint(8)
8
options
Tùy chọn
text
9
status
Trạng thái
varchar(1)
[W,D]
W: Wating
D: Done
10
child_status
Trạng thái của trang con
varchar(1)
[W,D]
W: Wating
D: Done
11
created
Thời gian URL được tạo
int(11)
12
modified
Thời gian URL được thay đổi
int(11)
Bảng Setting (wde_setting)
STT
Tên cột
Ý nghĩa
Kiễu dữ liệu
Miền GT
Ghi chú
1
id
Mã Setting
int(11)
Khóa chính
2
crawl_id
Mã Robot
int(11)
Quan hệ với bảng Robot
3
setting
Tên cấu hình
Varchar(256)
4
value
Giá trị
Varchar(256)
Bảng Log (wde_log)
STT
Tên cột
Ý nghĩa
Kiễu dữ liệu
Miền GT
Ghi chú
1
id
Mã Log
int(11)
Khóa chính
2
crawl_id
Mã Robot
int(11)
Quan hệ với bảng Robot
3
message
Thông tin
Text
4
created
Thời gian tạo log
int(11)
Front
Bot Manager
Hình 65. Sơ đồ tuần tự của tác vụ start Bot
Hình 66. Sơ đồ tuần tự của tác vụ resume Bot
Hình 67. Sơ đồ tuần tự của tác vụ pause Bot
Hình 68. Sơ đồ tuần tự của tác vụ stop Bot
Core
Hình 69. Sơ đồ class giữa Robot - Crawler - Extractor
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.
Hình 610. Sơ đồ tuần tự thể hiện quá trình hoạt động tổng quát của Robot
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.
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.
Nếu có, Robot sẽ dừng lại.
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 đáng kể nhược điểm khách quan của ngôn ngữ PHP chính là time limit, (trong PHP, khi một script được chạy nó luôn có một thời gian giới hạn gọi là time limit, sau thời gian này script sẽ tự động dừng lại và ngừng chạy). Để khắc phục tình trạng này, có 3 cách phổ biến nhất là:
Cách 1:
Giải pháp: Đặt lại thời gian chạy của PHP script: set_time_limit(0);
Ưu điểm: Sau khi được đặt lại thời gian, script có thể chạy mãi mãi,
Nhược điểm: Khó quản lý tình trạng hoạt động của script. Script mặc dù có thể chạy mãi mãi, nhưng vẫn có thể dừng lại nếu gặp lỗi phát sinh, sự cố từ server hay các nguyên nhân bất khả kháng.
Cách 2:
Giái pháp: Dùng cron job của linux hay schedule tasks của windows để khắc phục tình trạng timeout của script.
Ưu điểm: Đảm bảo script luôn luôn được chạy sau một khoảng thời gian nhất định.
Nhược điểm: Dễ xảy ra tình trạng script trước chưa dừng lại thì script sau lại hoạt động, dễ xảy ra xung đột đối với nhau.
Cách 3:
Giải pháp: Kết hợp cả hai cách trên: Đặt thời gian chạy của Script và đặt thời gian chạy cron/schedule task thích hợp.
Ưu điểm: khắc phục được nhược điểm trên của hai cách trên.
Nhược điểm: Script phải chạy và dừng liên tục. Có thể ảnh hưởng đến hiệu suất hoạt động.
Nhận thấy những nhược điểm đó dễ ảnh hưởng đến hiệu quả chương trình, nhóm đã nghiên cứu và đi đến giải pháp như sau:
Giải pháp quản lý tiến trình các Robot của nhóm:
Đăt thời gian chạy cho bot là vô hạn.
Đồng thời dùng cron/schedule để định thời gian thực thi bot.
Kết hợp với việc kiểm tra Process ID của bot để tránh được tình trạng một Bot chạy song song nhiều hơn một lần.
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 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:
Hình 611. Quá trình thu thập dữ liệu tổng quát
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.
Như vậy có thể nói class Robot chính là trung tâm điểu khiển của Core, đ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.
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.
Hình 612. Sơ đồ class của các Crawler
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.
Simple Crawler:
Hình 613. Sơ đồ tuần tự hoạt động của 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 …
Khai báo:
$crawler = new Simple_Crawler();
Lấy nội dung một trang bình thường
$crawler->load($url);
Lấy nội dung một trang có post, va http auth
$options = array(
‘post’ => array(
‘field1’ => ‘value1’,
‘field2’ => ‘value2’,
),
‘auth’ => array(
‘type’ => ‘basic’,
‘user’ => ‘user’,
‘pass’ => ‘password’,
)
);
$crawler->load($url, $options);
Advanced Crawler:
Hình 614. Sơ đồ tuần tự hoạt động của Advanced Crawler
wdeBrowser
Advanced Crawler sử dung wdeBrowser - một browser giả lập được viết bằng java do nhóm thực hiện. Chương trình sử dụng thư viện HTMLUnit để giả lập một browser, 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 wdeBrowser với thông số là input và output, wdeBrowser 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.
wdeBrowser nhận 2 thông số là tập tin đầu vào và tập tin đầu ra.
java –jar wdeBrowser input.txt output.html
Khi thực thi, wdeBrowser 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.
Cấu trúc file input
url trang web
action block
action block
…
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:
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)
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.
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).
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ụ
Ví dụ 1:
Tập tin input của wdeBrowser:
type
[name]q
project
click
[name]btnG
0
Chương trình sẽ load trang 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:
Tập tin input của wdeBrowser
click
[xpath][0]//img[@src="images/next_rounded_sidebar2.gif"]
[change]//body
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).
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 615. Sơ đồ class của các Extractor
Hiện nay chương trình hỗ trợ xử lý bằng nhiều input khác nhau: XPath, Perl Expression và jQuery Selector. Tương ứng có 3 extractor:
Expression Extractor
Sử dụng Perl Expression để lấy dữ liệu. Extractor thưc hiện match các expression trực tiêp từ input do crawler tạo ra.Ví dụ:
/([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})/s
Extractor sẽ thực hiện lệnh match expression với nội dung trang web hiện tại, kết quả trả về là danh sách địa chỉ email.
XPath Extractor
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ụ:
//div[@class=”title”]|
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.
Selector Extractor
Sử dụng cú pháp jQuery Selector để lấy dữ liệu dưới sự hỗ trợ của thư viện phpQuery.
jQuery là một JavaScript framework đang được sử dụng khá rộng rãi trong các ứng dụng Web trong thời gian gần đây. jQuery cung cấp chức năng jQuery Selector - một cách thức tìm kiếm các phần tử trên trang web dựa vào cú pháp CSS. Còn phpQuery là một thư viện của PHP, đem lại các tính năng của jQuery vào ngay trong code PHP.
Mỗi template của selector có dạng: expression | function:argument. Trong đó expression là mẫu tìm kiếm, function là hàm thực hiện với tham số argument sau khi tìm kiếm.
Sau khi phpQuery thực hiện tìm kiếm phần tử thỏa mản expression, kết quả trả về là một tập hợp các phpQuery object, Extractor sẽ tiếp tục thực hiên function trong action trả về các giá trị tương ứng. Hiện nay Extractor hỗ trợ 4 function:
attr: lấy thuộc tính.
value: lấy giá trị.
html: lấy nội dung html.
text: lấy nội dung text.
Ví dụ:
a.title_link|attr:href
Extractor sẽ thực hiện lệnh select trên văn bản hiện tại, kết quả trả về là các anchor có class là “title_link”, sau đó sẽ lấy thuộc tính href của anchor.
Sử dụng và đánh giá
Các bước cơ bản để sử dụng ứng dụng
Robot hoạt động dựa trên cấu hình do người sử dụng thiết lập thông qua XML, do đó để có thể sử dụng ứng dụng để thu thập dữ liệu thì việc xây dựng cấu trúc XML đúng và phù hợp với mục đích là điều cơ bản và quan trọng nhất.
Trước hết, trước khi bắt xây dựng input, ta sẽ sử dụng các công cụ hỗ trợ lấy xây dựng XML sau (đây đều là phần mềm miễn phí, có thể dễ dàng tìm kiếm trên web hoặc thông qua phần tài liệu tham khảo):
Trình duyệt Firefox
Các Addon của Firefox
NoScript: giúp tắt/bật javascript của trang web một cách dễ dàng.
Firebug: theo dõi cấu trúc trang web, xác định các phần tử của trang Web thông qua cây thể hiện các tag của trang Web.
FireXpath: lấy xpath và thực hiện xpath trên trang web hiện tại.
Để cho tăng tính thực tế và cụ thể cho quá trình xây dựng cấu hình cho Robot, ta dùng trang web để làm ví dụ cụ thể với mục tiêu là từ trang chủ, WDE robot vào từng đề mục ngành nghề lấy tên công ty.
Xác định trang web cần thu thập dữ liệu
Xác định kiểu lấy dữ liệu (crawler engine) cho Robot
Việc xác định kiểu lấy dữ liệu cho Robot hết sức quan trọng vì có ảnh hưởng rất nhiều đến tính chính xác và tốc độ thu thập dữ liệu.
Nếu các link của trang web hoàn toàn là đường dẫn tĩnh, không có sự can thiệp của javascript thì ta sẽ chọn engine cho Robot là “simple”. Ngược lại, nếu các link của trang web có sự can thiệp của javascript thì ta sẽ sử dụng engine “advanced” cho Robot.
Với ví dụ ta chọn, trang web có các link dạng tĩnh, do đó ta sẽ sử dụng engine “simple” cho Robot, có thể khai báo như sau hoặc không cần nhập thông tin về engine, robot sẽ mặc định hiểu người sử dụng dùng “simple”
simple
Ghi chú: Để có thể xác định chính xác trang Web muốn lấy dữ liệu có sự chuyển trang phụ thuộc vào JavaScript hay không, ta có thể tắt chức năng chạy JavaScript của trình duyệt hoặc dùng các Addon để tạm thời vô hiệu hóa JavaScript cho trang Web. Ở đây ta dùng NoScript của trình duyệt Firefox.
Xác định các tùy chọn cho Robot
Các tùy chọn cho Robot được khai báo trong thẻ “” .Có 3 tùy chọn cho Robot rất có ích cho người sử dụng đó là sleep, proxy và authentication (đã đề cập ở phần 6.3.1).
Với ví dụ hiện tại, trang web không có chức năng chống Flood, cũng như Authentication, do đó ta không khai báo các tùy chọn này.
Như vậy ta đã xây dựng xong cấu hình khởi tạo cho Robot. Cấu trúc XML được xây dựng cho tới giai đoạn này:
simple
Xây dựng cấu hình cụ thể cho từng trang con
Có 4 vấn đề cần quan tâm:
Độ sâu của trang: độ sâu của trang hiện tại tính từ trang bắt đầu.
Ở trang đầu tiên ta khai báo:
1
Xác định dữ liệu cần lấy: dữ liệu cần lấy sẽ được khai báo trong các action (xem phần 6.3.2 để biết công dụng của các action)
Ở trang đầu tiên, ta không cần lấy dữ liệu do đó không phải khai báo phần này
Xác định link phân trang: tương tự data, ở trang đầu tiên cũng chưa cần khai báo phần này
Xác định link trang con: do mục tiêu của ví dụ là vào trong từng đề mục ngành nghề để lấy dữ liệu. Do đó ta xác định nó như là trang con của trang đầu tiên này, ta dùng action link để lấy danh sách các link:
link
//td[@valign="middle"]/a[@class='lMenu']/@href
Sau giai đoạn này ta có nội dung XML như sau:
simple
1
link
//td[@valign="middle"]/a[@class='lMenu']/@href
Sau khi vào được trang con, ta bắt đầu đầu lấy dữ liệu theo như mục tiệu của ví dụ:
Để lấy tiêu đề của nội dung:
capture
title
//a[@class='colCom']/b/node()
Xác định cấu trúc cơ sở dữ liệu lưu trữ:
Sau khi xác định nội dung cần lấy, ta xác định cấu trúc cơ sở dữ liệu lưu trữ các dữ liệu thu thập được. Các cột của cơ sở dữ liệu phải có tên trùng với tên được khai báo trong phần định nghĩa dữ liệu ở trên.
title
varchar
100
Đây cũng là giai đoạn cuối cùng, ta có kết quả XML cấu hình cho Robot:
simple
1
link
//a[@class='lMenu']/@href
2
capture
title
//a[@class='colCom']/b/node()
title
varchar
100
Các ví dụ cụ thể từ đơn giản đến phức tạp
Ví dụ 1
Lấy tiêu đề các tin tức thuộc mục “Viễn thông, bưu chính” của trang web www.raovat.vn
Phân tích
Đường dẫn đến mục “Viễn thông, bưu chính” của trang web là
Trang web sử dụng link trực tiếp, không xử lý javascript hay dùng COOKIE hoặc SESSION để điều khiển. Do đó ta sử dụng engine “simple”
simple
Dữ liệu mà ta muốn lấy nằm ngay trang đề mục “Viễn thông, bưu chính” do đó ta chỉ tạo page có level là 1 và có template của dữ liệu là
//*[@class='pointer']/a/node()
Trang có phân trang, do đó cần phải xác định đường dẫn phân trang
//*[@class='button']/@href
Nội dung dữ liệu XML:
simple
1
capture
title
Y
//*[@class='pointer']/a/node()
1
link
Y
//*[@class='button']/@href
title
varchar
100
Kết quả
Ví dụ 2:
Lấy tiêu đề tin tức mục “Chính trị xã hội” của báo điện tử Thanh Niên www.thanhnien.com.vn
Phân tích
Đường dẫn đến mục “Chính trị xã hội” của trang web là:
Trang web sử dụng link các trang con là link trực tiếp, phân trang lại dùng javascript. Tuy nhiên thực chất của phân trang là dùng POST để phân trang. Sau khi nghiên cứu thì nhóm thấy có thể giả lập POST để thực hiện việc này, nên chọn engine “simple” để tối ưu tốc độ lấy dữ liệu
simple
Dữ liệu mà ta muốn lấy nằm ngay trang đề mục “Viễn thông, bưu chính” do đó ta chỉ tạo page có level là 1 và có template của dữ liệu là
//div[@class='cm-title']/a
Trang có phân trang bằng javascript, sau khi nghiên cứu cách thức hiện thực đoạn code javascript cũng như dữ liệu POST truyền đi, nhóm nhận thấy chỉ cần 4 dữ liệu sau là cần thiết để phân trang:
__EVENTTARGET: thông số thứ nhất trong phần javascript của đường dẫn phân trang.
__EVENTARGUMENT: thông số thứ hai trong phần javascript của đường dẫn phân trang.
__VIEWSTATE: giá trị input dạng hidden.
__EVENTVALIDATION: giá trị input dạng hidden.
Do đó, có thể giả lập bằng cách tìm kiếm và gửi các thông tin trên theo phương thức POST cho trang web, ví dụ lấy dữ liệu EVENTVALIDATION và gửi theo theo phương thức POST.
__EVENTVALIDATION
capture
/name="__EVENTVALIDATION"[^<]*value=[^"]*"([^"\r\n]*)"/s
Nội dung dữ liệu XML
simple
1
capture
title
Y
//div[@class='cm-title']/a
strip
link
Y
capture
__EVENTTARGET
/WebForm_PostBackOptions\("([a-z0-9\$_]*next)"/s
entity
__EVENTARGUMENT
capture
/WebForm_PostBackOptions\(".*?", "(.*?)",/s
entity
__VIEWSTATE
capture
/name="__VIEWSTATE"[^<]*value=[^"]*"([^"\r\n]*)"/s
__EVENTVALIDATION
capture
/name="__EVENTVALIDATION"[^<]*value=[^"]*"([^"\r\n]*)"/s
title
varchar
100
Kết quả
Ví dụ 3
Lấy các tiêu đề các tin tức mục “Thế giới trẻ” của trang báo điện tử: www.thanhnien.com.vn
Phân tích
Đường dẫn đến mục “Thế giới trẻ” của trang web là:
>
Trang web sử dụng link vào trang con trực tiếp, phân trang bằng javascript, thay vì cách làm ở ví dụ trên, ta có thể dùng engine “advanced”:
advanced
Dữ liệu mà ta muốn lấy nằm ngay trang đề mục “Thế giới trẻ” do đó ta chỉ tạo page có level là 1 và có template của dữ liệu là
//div[@class='cm-title']/a
Trang có phân trang, do đó cần phải xác định đường dẫn phân trang, link phân trang có ID, do đó ta sẽ sử dụng ID để mô tả link phân trang cho action, sau khi phân trang phần DIV có class là “home21” sẽ thay đổi, nên ta sẽ sử dụng phần tử này để theo dõi tình trạng load của trang.
click
//div[@class='cm-next']/a
1
Nội dung dữ liệu XML
advanced
1
capture
title
Y
//div[@class='cm-title']/a/node()
click
//div[@class='cm-next']/a
0
title
varchar
100
Kết quả
Đánh giá chung
Các kết quả đạt được
Nhìn chung, ứng dụng nhóm xây dựng được đã đạt được các kết quả như sau:
Về phạm vi ứng dụng trong thực tế, WDE sử dụng được với các trang web như sau:
Những trang không có các mã client-side như JavaScript (hoặc có nhưng không ảnh hưởng đến việc chuyển trang và nội dung của trang web), bao gồm:
Các trang web đơn giản, có liên kết đến các trang khác là hyperlink đơn thuần, không có sự thực thi của các chương trình server-side khi chuyển trang đến một trang khác.
Các trang web đơn giản, có liên kết đến các trang khác là các hyperlink đơn thuần, có sự thực thi của các chương trình server-side khi chuyển trang đến một trang khác.
Các trang web có liên kết đến trang khác thông qua một form (có thể cần nhập giá trị vào các thành phần của form), sử dụng phương thức là GET hoặc POST.
Các trang web có sự chuyển trang phụ thuộc vào cookie.
Những trang có các mã client-side như JavaScript, ảnh hưởng đến việc chuyển trang và nội dung của trang web, bao gồm:
Các trang web dùng JavaScript để GET hoặc POST tương tự như form, có hoặc không có các tham số (các tham số có thể lấy từ chính nội dung HTML của trang web).
Các trang sử dụng công nghệ Ajax để cập nhật, thay đổi dữ liệu trên trang với dữ liệu được truyền nhận giữa client và server.
Các trang web dùng JavaScript để thay đổi cấu trúc DOM của HTML, làm thay đổi nội dung của trang Web.
Trong những trường hợp khác mà nhóm chưa có điều kiện thử nghiệm, WDE vẫn có thể giả lập web browser để duyệt các trang web này.
Về các khả năng nâng cao, hỗ trợ xử lý các trường hợp khác, WDE còn hỗ trợ:
Tự động đăng nhập, vượt qua các kiểm tra xác thực (authentication) theo hai kiểu: Basic authentication và Form-based authentication.
Sử dụng proxy khi crawl các trang web:
Một số trang web sử dụng các kỹ thuật chống flood để hạn chế các web crawler, bot. Các web server của các trang web này sẽ kiểm tra hoạt động của các IP truy cập, nếu một IP nào truy cập liên tục trong một khoảng thời gian nhất định thì sẽ bị block IP hoặc chuyển hướng IP. Crawler của WDE có thể sử dụng proxy để tránh các kỹ thuật này.
Dùng proxy để vượt các tường lửa, crawl các trang web mà IP của WDE không được phép truy cập.
Thời gian cách giữa hai lần crawl liên tiếp: cũng dùng để tránh các kỹ thuật chống flood.
Thêm các xử lý trên dữ liệu trích xuất được, trước khi lưu vào cơ sở dữ liệu. Đây cũng là một khả năng mở rộng của WDE, cho phép người sử dụng tự định nghĩa được các hàm xử lý này cho mình, bằng cách viết các helper-function mới.
Các hạn chế của ứng dụng
Mặc dù WDE đã đạt được một số kết quả nhất định nhưng nhóm thực hiện vẫn còn chưa giải quyết được một số mặt hạn chế của ứng dụng, do khả năng cũng như điều kiện thời gian chưa cho phép. Một số các hạn chế của WDE có thể nhận thấy được như sau:
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 WDE cần phải có kiến thức về Web, HTML, cũng như phải phân tích tìm hiểu cấu trúc template, kỹ thuật chuyển trang, thay đổi nội dung của trang web. Người sử dụng cũng cần phải biết về XPath, hoặc Perl Expression, hoặc jQuery Selector để có thể chỉ ra được chính xác nội dung thông tin cần trích xuất.
Việc viết đặc tả đầu vào XML không dễ dàng: WDE chưa cung cấp cơ chế kiểm tra nội dung file đặc tả XML có đúng cấu trúc hay không nên người dùng phải nắm rõ cấu trúc này để có thể đặc tả đúng.
Khi sử dụng crawler engine Advanced, tốc độ crawl và trích xuất dữ liệu bị giảm do việc lấy nội dung các trang web bằng cách giả lập Browser chậm hơn so với sử dụng trực tiếp các HTTP method qua thư viện cURL.
Mặc dù hỗ trợ khá tốt JavaScript và khá nhiều các thư viện của JavaScript, tuy nhiên HtmlInput vẫn chưa thật sự hoạt động trên các trang web phức tạp, do đó có thể khiến chương trình bị lỗi.
Hướng phát triển
Các hướng phát triển của đề tài mà nhóm có thể nghĩ đến:
Giải quyết hạn chế thứ nhất: Một số các công cụ scraper thương mại như Mozenda [6] đã có thể giải quyết phần nào hạn chế này, bằng cách tích hợp một web browser ngay trong công cụ và cho phép người sử dụng dùng chuột chỉ ra các phân vùng dữ liệu cần trích xuất một cách trực quan. Giải pháp này sẽ giúp người dùng không cần viết các biểu thức XPath, Expression hoặc jQuery Selector nữa, tuy nhiên độ chính xác khi ứng dụng trích xuất dữ liệu trên các trang khác có thể sẽ bị giảm.
Giải quyết hạn chế thứ hai: Sử dụng DTD (Document Type Definition [1]) hoặc XML Schema [1] để đảm bảo cấu trúc tập tin đặc tả đầu vào luôn đúng. Hoặc một giải pháp tốt hơn đó là xây dựng một module cho phép người dùng đặc tả file XML này thông qua giao diện trực quan.
Đối với hạn chế thứ ba, nhóm chưa có giải pháp khắc phục.
Tổng kết
Với những nỗ lực trong thời gian qua của nhóm và sự hướng dẫn tận tình của Thầy Đặng Trần Trí, đề tài Luận Văn Tốt Nghiệp của nhóm cũng đã đạt được một số kết quả nhất định, tuy rằng không thể tránh khỏi một vài hạn chế do điều kiện thời gian không cho phép.
Về mặt lý thuyết, nhóm cũng đã tìm hiểu được một lượng kiến thức khá rộng và bao quát. Nhóm đã tìm hiểu được các kiến thức về World Wide Web, các kỹ thuật sử dụng của các web crawler và web scraper; tìm hiểu các kỹ thuật thiết kế, lập trình web phổ biến hiện nay, cụ thể là các kỹ thuật phân trang, chuyển trang cũng như các phương thức giao tiếp, truyền nhận dữ liệu giữa máy chủ và máy khách trong các ứng dụng web.
Về mặt hiện thực, nhóm cũng đã hiện thực được các kỹ thuật crawl web, thông qua thư viện cURL, hỗ trợ khả năng crawl một phần Web ẩn mà các web crawler phổ biến thường ít có, như ajax, form submission, authentication và sử dụng proxy, thực thi mã client-side như JavaScript. Nhóm cũng hiện thực được 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, sử dụng Perl Expression, XPath hoặc jQuery Selector.
Về mặt ứng dụng, WDE đem lại khả năng ứng dụng với khá nhiều loại website khác nhau do nó hỗ trợ nhiều cách thức chuyển trang, lấy dữ liệu khác nhau, dựa theo sự phân loại của nhóm, các kỹ thuật này cũng đều là các kỹ thuật phổ biến hiện nay. WDE cũng giúp giả lập một web browser cho những trường hợp phức tạp mà cURL không giải quyết được, như thực thi mã JavaScript để lấy nội dung trang Web. Ứng dụng cũng đem lại khả năng mở rộng cho người dùng nếu muốn bổ sung các xử lý trên dữ liệu trích xuất được, thông qua các helper-function mà người dùng có thể tự viết cho mình.
Tài liệu tham khảo
Website
Wikipedia, (01-Tháng Một-2010)
World Wide Web Consortium (W3C), (01-Tháng Một-2010)
HTML Tidy project, (01-Tháng Một-2010)
cURL project, (01-Tháng Một-2010)
CodeIgniter Framework, (01-Tháng Một-2010)
Mozenda software, (01-Tháng Một-2010)
Tài liệu viết
Michael Schrenk (2007). Webbots, Spiders, and Screen Scrapers. No Starch, San Francisco, USA.
Sriram Raghavan, Hector Garcia-Molina (2001). Crawling the Hidden Web. Computer Science Department, Stanford University, USA.
Steve Lawrence, C. Lee Giles (1998). Searching the World Wide Web. Science, 280(5360):98.
Michael K. Bergman (2001). White Paper: The Deep Web: Surfacing Hidden Value. University of Michigan, USA.
Stephen Soderland. Learning to Extract Text-based Information from the World Wide Web. Department of Computer Science & Engineering, University of Washington.
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