5 Thiết kế
6.3.1 Cấu trúc tổng quát của file cấu hình XML
TODO 6.3.2 Chi tiết các thành phần (element) TODO 6.4 Các action 6.5 Cấu trúc Database 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_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 dữ liệu:
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
phân tích từ xml
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
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 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
6.6 Front
6.6.1 Bot Manager
Hình 6-4. Sơ đồ tuần tự của tác vụ start Bot
Hình 6-6. Sơ đồ tuần tự của tác vụ pause Bot
6.7 Core
Hình 6-8. Sơ đồ class giữa Robot - Crawler - Extractor
6.7.1 Robot
Class Robot đóng vai trò trung tâm điều khiển của Crawler và Extractor. Mọi hoạt động
Crawler Extractor Robot load(bot_id) load(content) do_action(action) save_data() Loop
Hình 6-9. Sơ đồ tuần tự thể hiện quá trình hoạt động tổng quát của Robot
6.7.1.1 Quản lý tiến trình của Robot (Robot process)
Chạy Bot: Khi nhận được lênh kích hoạt từ người dùng thông qua Bot Controller, Robot sẽ tiến hành thực hiện tuần tự các công việc sau:
- Cập nhật trạng thái của Robot thành đang hoạt động (Started).
- Kiểm tra xem Robot có đang được chạy hay không: Mỗi Robot sẽ được chạy trên một process riêng biệt. Robot sẽ kiểm tra Process ID của Robot muốn có đang tồn
tại trong danh sách Process của Hệ điều hành hay không.
o Nếu không, Robot sẽ thực hiện một lênh khởi tạo một process mới để chạy Bot được yêu cầu.
o Nếu có, Robot sẽ dừng lại.
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.
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à timeout (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à timeout, sau thời gian timeout này script sẽ
tự động 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:
- Đặ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. Người lập trình khó có thể kiểm tra được tình trạng của script đó.
Cách 2:
- 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:
- 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.
- 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.
6.7.1.2 Thực hiện quy trình thu thập dữ liệu
Class Robot điều khiển hai thành phần chính là Crawler và Extractor để tiến hành 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 6-10. 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.
6.7.2 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ó.
Hai crawler engine của Crawler:
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
Simple_Crawler
+ load(url: string): string + get_status(url: string): string
Advance_Crawler
+ load(url: string): string + get_status(): string - generate_input() - run_browser() Abstract Crawler
# page_content: string + load(url: string): string + get_status(): string
Hình 6-11. 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.
6.7.2.1 Simple Crawler:
Hình 6-12. 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
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);
6.7.2.2 Advanced Crawler:
Hình 6-13. Sơ đồ tuần tự hoạt động của Advanced Crawler
6.7.2.2.1 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…
TODO: Mô hình Advance Crawler -> createInputFile -> run wdeBrowser -> readInputFile -> loop do action -> write out put file -> crawler read output file -> return content
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:
- Type: thực hiện thao tác nhập giá trị value vào trong target
- Click: thực hiện thao tác click chuột vào target. Value của Action lúc này chính là option của thao tác:
o Nếu Value: “auto”: chương trình sẽ thực hiện tự động đồng bộ trang web sau khi click vào đối tượng nếu xảy ra ajax (hiện tại hoạt động chưa chính
xác)
o Nếu Value là số, chương trình đợi một khoảng thời gian là Value trước khi
thực hiện bước tiếp theo hoặc trả về kết quả sau cùng.
o Nếu Value có dạng “[event]xpath”:
Nếu event là “change”: chương trình sẽ đợi cho đến khi phần tử element được lấy bởi xpath thay đổi hoặc khi event timeout (5s).
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.
6.7.2.2.2 Ví dụ
Tập tin input của wdeBrowser: http://google.com type [name]q project click [name]btnG 0
Chương trình sẽ load trang http://google.com, sau đó thực hiện nhập chuỗi “project”
vào khung search của google, và click chuột vào nút search để lấy nội dung trang kết quả trả
về.
Ví dụ 2:
Tập tin input của wdeBrowser
http://comic.vuilen.com/ 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).
6.7.3 Extractor
Expression_Extractor - page_content: string + load(page_content: string) + capture(template: string) Xpath_Extractor - page_dom: DOMDocument() + load(page_content: string) + capture(template: string) - query(template) Extractor + expression: Expression_Extractor(); + xpath: Xpath_Extractor() + selector: Selector_Extractor(); + load(content: string) + do_action(action: array) - capture(template): string - block(template): string Selector_Extractor - page_doc: phpQueryObject() + load(page_content: string) + capture(template: string) Abstract_Extractor - + load(page_content: string) + capture(template: string) Name
Hình 6-14. 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.
6.7.3.1 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ụ:
<expression>/([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})/s</expression>
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.
6.7.3.2 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
TODO: Diagram
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ụ:
<xpath>//div[@class=”title”]|</xpath>
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.
6.7.3.3 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ộng đồng người sử dụng PHP cũng đã xây dựng nên phpQuery - một thư viện dành cho 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ụ:
<selector>a.title_link|attr:href</selector>
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à