6 Hiện thực
6.6.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:
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.6.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ó. Crawler bao gồm hai crawler engine là Simple Crawler Engine và Advanced Crawler Engine.
Hiện nay chương trình chỉ hỗ trợ sử dụng một trong hai crawler engine, người sử dụng quyết định chọn lựa engine nào được dùng thông qua thẻ engine của đặc tả cấu hình XML.
6.6.2.1 Simple Crawler:
Hình 6-31. 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);
6.6.2.2 Advanced Crawler:
Hình 6-32. Sơ đồ tuần tự hoạt động của Advanced Crawler
6.6.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…
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.
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:
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.
Ví dụ
• Ví dụ 1:
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.6.3 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 6-33. 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:
6.6.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.6.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 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ụ:
<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.6.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ò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ụ:
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.