6 Hiện thực
6.3.1 Đặ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:
• <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. 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ụ:
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> 6.3.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 (theo mô hình đề cập ở phần 4.1).
• <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 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: <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> | <expression></expression> | <selector></selector>: 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.
- <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. WDE 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á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”
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à list phải là N.
• Block Action: <type>block</type>
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> | <expression></expression> | <selector></selector>: 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.
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ụ: <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 POST đến http://www.example.com/index.aspx 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:
<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: <type>click</type>
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.
6.3.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 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.
<database> <column> <name>title</name> <type>varchar</type> <constraint>100</constraint> </column> <column> <name>description</name> <type>varchar></type> <constraint>500</constraint> </column> </database>
6.4 Cấu trúc cơ sở dữ liệu
Hình 6-22. Sơ đồ cấu trúc cơ sở dữ liệu của chương trình
6.4.1 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.
6.4.2 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)
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
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
6.5 Front
6.5.1 Bot Manager
Hình 6-23. Sơ đồ tuần tự của tác vụ start Bot
Hình 6-25. Sơ đồ tuần tự của tác vụ pause Bot
6.6 Core
6.6.1 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 6-28. Sơ đồ tuần tự thể hiện quá trình hoạt động tổng quát của Robot
6.6.1.1 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.
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 đá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