CHƯƠNG 3. HIỆN THỰC ỨNG DỤNG VÀ ĐÁNH GIÁ KẾT QUẢ

Một phần của tài liệu KHAI THÁC DỮ LIỆU TRÊN WEB VÀ XÂY DỰNG ỨNG DỤNG HỖ TRỢ NHẬP LIỆU (Trang 45)

Tập tin cấu hình XML có thành phần gốc (root element) là cặp thẻ <site></site>, 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

1.7.1 ĐẶC TẢ THÔNG TIN CHUNG CHO ROBOT

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:

• <start></start>: 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ó.

• <engine></engine>: 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.

• <options></options>: 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:

- <sleep></sleep>: 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ụ:<sleep>2</sleep>

- <proxy></proxy>: 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ụ: <proxy>222.253.102.93:8888, 222.253.102.92:8080</proxy>

- <auth></auth>: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. DESS 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ụ: o Với HTTP-Authentication: <auth> <type>basic</type> <user>username</user> <pass>password</pass> </auth>

o Với đăng nhập bằng Form: <auth>

<type>form</type>

<url>url đăng nhập</url> <field> <name>user</name> <value>username</value> </field> <field> <name>pass</name> <value>password</value> </field> </auth> 1.7.2 ĐẶ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ẻ <page></page> 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.

• <level></level>: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.

• <pagination></pagination>:đặ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

• <subpage></subpage>:đặ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

• <data></data>: đặ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à <limit></limit>, thẻ này cho biết số trang tối đa mà Crawler của DESS 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 DESS, tùy thuộc vào giá trị của phần tử type trong action:

Capture Action:<type>capture</type>

Đâ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:

- <name></name>: tên định danh cho phân vùng dữ liệu trích xuất được. Ví dụ “title”, “description”

- <list></list>: 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.

- <xpath></xpath: 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.

- <helper></helper>: 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. DESS cung cấp 6 helper-function được xây dựng sẵn:

o trim: cắt bỏ các khoảng trắng thừa ở đầu và cuối chuỗi

o replace: cú phápreplace:a,ucó ý nghĩa thay thế tất cả sự xuất hiện của “a” trong chuỗi thành “u”

o entity: chuyển các ký tự đặc biệt thành HTML entity, ví dụ & chuyển thành&amp;

o strip: lọc bỏ hết tất cả các tag

o 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

o content: bỏ tag đóng và tag mở, chỉ lấy nội dung bên trong

- <static></static>: 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à listphải làN.

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:

- <list></list>: 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) - <xpath></xpath>: tương tự Capture Action

Các biểu thức XPath của các Capture Action con sẽ phải là tương đối với nội dung của block data.

Link Action: <type>link</type>

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ầnoptions, ví dụ:

<action> <type>link</type> <static>http://www.example.com/index.aspx</static> <options> <get> <action> <type>capture</type> <name>id</name> <static>SW063</static> </action> </get> </options> </action>

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

“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: <action> <type>link</type> <static>http://www.example.com/index.aspx</static> <options> <post> <action> <type>capture</type> <name>__EVENTTARGET</name> <expression>/WebForm_PostBackOptions\("([a- z0-9\$_]*next)"/s</expression> </action> </post> </options> </action>

Type Action: <type>type</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.

<action>

<type>type</type>

<static>[name]q</static> <value>minh</value> </action>

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.

<action>

<type>click</type>

<static>[name]btnG</static> <value>1</value>

</action>

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.

1.7.3 ĐẶC TẢ BẢNG CƠ SỞ DỮ LIỆU

Phần này gồm một element duy nhất, đó là thẻ <database></database>. 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ẻ <column></column>. 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 <name></name> thể hiện tên của column, một thẻ con <type></type> xác định kiểu dữ liệu của column và một thẻ <constraint></constraint> 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 DESS 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 để DESS 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.

<database> <column> <name>title</name> <type>varchar</type> <constraint>100</constraint> </column> <column> <name>description</name> <type>varchar></type> <constraint>500</constraint> </column> </database>

1.8 CẤU TRÚC CƠ SỞ DỮ LIỆU

Hình 3-8. Sơ đồ cấu trúc cơ sở dữ liệu của chương trình

Mô tả 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.

1.9 SƠ ĐỒ TUẦN TỰ CHO CÁC CHỨC NĂNG

1.9.1 BOT MANAGER

Hình 3-9. Sơ đồ tuần tự của tác vụ start Bot

Hình 3-11. Sơ đồ tuần tự của tác vụ pause Bot

Hình 3-12. Sơ đồ tuần tự của tác vụ stop Bot 1.9.2 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 3-13. Sơ đồ tuần tự thể hiện quá trình hoạt động tổng quát của Robot

1.9.2.1Quả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.

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.

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 nhược điểm khách quan của PHP là time limit.

1.9.2.2Thự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 3-14. 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 back-end, đ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.

1.9.3 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 3-15. 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.

1.9.3.1Simple Crawler

Hình 3-16. 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 …

1.9.3.2Advanced Crawler

DESSBrowser

Advanced Crawler sử dung DESSBrowser - một browser giả lập được viết bằng java sử dụng thư viện HTMLUnit, 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 DESSBrowser với thông số là input và output, DESSBrowser 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.

DESSBrowser nhận 2 thông số là tập tin đầu vào và tập tin đầu ra. java –jar DESSBrowser input.txt output.html

Khi thực thi, DESSBrowser 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:

Một phần của tài liệu KHAI THÁC DỮ LIỆU TRÊN WEB VÀ XÂY DỰNG ỨNG DỤNG HỖ TRỢ NHẬP LIỆU (Trang 45)