Việc lấy trang web về là công tác đơn giản nhất trong 3 công tác của wrapper. Trong công việc này, wrapper sẽ thực hiện lấy trang web về theo một địa chỉ cho trước, phân tích cú pháp của trang web lấy về được và chuyển cho modul tiếp theo.
Vấn đề chủ yếu của việc lấy nội dung trang web về là vấn đề xử lí lỗi.Trong phạm vi phân tán rộng lớn như WWW và một cơ sở hạ tầng về mạng như hiện nay, việc mắc lỗi trong quá trình lấy nội dung một site về rất dễ xảy ra. Khi lỗi đã
xảy ra thì hệ thống sẽ không làm việc được vì modul lấy web về là cửa ngõ của hệ thống, cung cấp dữ liệu cho hệ thống.
Ngôn ngữ WebL đã đề ra một cơ chế xử lí lỗi nhằm cải thiện, tăng cường tính tin cây trong công tác này. Cơ chế này mang tên Service Combinator (bộ tổ hợp dịch vụ). Trong cơ chế này chúng ta sẽ bàn về các dịch vụ (service) – các phép tính toán phụ thuộc vào các web server ở xa.
Vậy thì Service Combinator là gì?
Service Combinator là một cơ chế cho phép một vài dịch vụ phối hợp với nhau theo một cách nào đó để sao cho các tính toán tin cậy hơn và trong một số trường hợp, có thể cải thiện được tốc độ. Cỏc cỏch phối hợp với nhau đó là:
Thực hiện tuần tự Thực hiện cạnh tranh Time-out
Lặp
Thực hiện không kết thúc
Để minh hoạ cơ chế cùng với cách phối hợp của chúng, chúng tôi giả sử có hai dịch vụ thực hiện kéo trang web về
Dịch vụ:
GetURL(url, [. param1=val1, param2=val2, ... .]) PostURL(url, [. param1=val1, param2=val2, ... .])
Hàm (dịch vụ) GetURL sẽ kéo trang web có địa chỉ url theo phương thức GET của giao thức HTTP. Hàm sẽ thất bại hay nói cách khác dịch vụ sẽ thất bại nếu việc kéo trang web về có lỗi. Tham số thứ hai của hàm sẽ cung cấp cho web server các tham số truy vấn.
PostURL cũng hoàn toàn tương tự GetURL. Nó là phương thức POST của giao thức HTTP, được sử dụng để điền vào form dữ liệu vào dựa trên web.
page = GetURL("http://www.digital.com")
// Chương trình này sẽ tìm từ “java” trờn mỏy tìm kiếm AltaVista page = GetURL(
"http://www.altavista.digital.com/cgiưbin/query", [. pg="q", what="web", q="java" .])
Thực hiện tuần tự S ? T
Toán tử phối hợp “?” cho phép dịch vụ thứ hai được thực hiện trong trường hợp dịch vụ thứ nhất bị lỗi vì một lí do nào đó. Như vậy, dịch vụ S ? T đóng vai trò như dịch vụ S ngoại trừ S có lỗi thỡ nó sẽ thực hiện dịch vụ T.
//Đoạn chương trình này sec thử connect vào máy AltaVista ở //California, và trong trường hợp có lỗi, nó sẽ thử connect vào //một site tương tự ở Australia.
page = GetURL("http://www.altavista.digital.com") ? GetURL("http://www.altavista.yellowpages.com.au")
Thực hiện cạnh tranh S | T
Toán tử cạnh tranh “|” cho phép hai dịch vụ đồng thời thực hiện. Dịch vụ ( S | T ) sẽ khởi động cả hai dịch vụ S và T cùng một lúc và trả lại kết quả của bất cứ dịch vụ nào kết thúc thành công trước. Nếu cả hai dịch vụ con bị lỗi thì dịch vụ phối hợp của chúng cũng bị lỗi. trường hợp một dịch vụ thực hiện xong sớm hơn thì dịch vụ thực hiện chậm hơn phải kết thúc.
//Chương trình này sẽ cố gắng kéo một trang từ một trong //hai site tuỳ chọn. Cả hai site được kéo về một cách đồng thời //và kết quả trả về là bất kì một trang nào được lấy về sớm hơn page = GetURL("http://www.altavista.digital.com") |
Thực hiện trong vòng thờI gian giớI hạn timeout(t,S)
Bộ phốI hợp giới hạn thời gian này cho phép áp đặt một thờI gian hữu hạn t lên dịch vụ S. Dịch vụ timeout(t,S) sẽ đóng vai trò như dịch vụ S nhưng có điều dịch vụ sẽ kết thúc nếu trong khoảng thờI gian t S chưa hoàn thành.
// Chương trình này sẽ đồng thời truy cập đến hai site //có nội dung tương tự nhau. Nhưng phảI kết thúc trước //10 giây nếu không muốn bị tự động ngắt.
page = Timeout(10000,
GetURL("http://www.altavista.digital.com") |
GetURL("http://www.altavista.yellowpages.com.au "))
Repetition Retry(S)
Bộ phối hợp lặp Retry cung cấp một cách kích hoạt một dịch cho đến khi nó thực hiện thành công. Dịch vụ Retry(S) đóng vai trò như dịch vụ S, trừ trường hợp S bị lỗi thì nó sẽ tự động khởi động lại S. Một vấn đề dễ thấy rằng nếu S luôn lỗi thì dịch vụ lặp sẽ không dừng. Do đó để kết thúc dịch vụ lặp ta có thể sử dụng bộ phối hợp giới hạn thời gian Timeout(t,Retry(S)).
//Chương trình này sẽ thực hiện lạI lần lượt //hai dịch vụ con nếu cả hai dịch vụ này đều //bị lỗi.
page = Retry(
GetURL("http://www.x.com") ? GetURL("http://www.y.com")) Non-termination Stall()
Bộ phối hợp Stall sẽ không bao giờ kết thúc hay lỗi.
//sau mỗI lần lấy không được thì sẽ dừng nghỉ 10 giây //và lạI lặp lạI cho đến khi lấy về được.
page = Retry(getpage("http://www.digital.com") ? Timeout(10000, Stall())