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.
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.
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 phân tích 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 bằng cách sử dụng XPath.
Các Helper
Các helper trong back-end 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ố)
• 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
CHƯƠNG 3. HIỆN THỰC ỨNG DỤNG VÀ ĐÁNH GIÁ KẾT QUẢ
1.7 ĐẶ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ẻ <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&
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