Tìm kiếm chuỗi trong chuỗ i

Một phần của tài liệu tìm hiểu về trình thu thập web và xây dựng trang web tổng hợp thông tin (Trang 41)

Để tìm kiếm một chuỗi bên trong một chuỗi khác, ta có thể sử dụng một trong ba hàm strstr(), strchr(), strrchar() hay stristr().

Hàm strstr() trả về chuỗi str1 nếu chúng tìm thấy chuỗi str1 trong chuỗi str2,

ngược lại hàm trả về giá trị false, nếu có nhiều chuỗi str1 giống nhau, hàm này chỉ tìm kiếm chuỗi str1 đầu tiên.

Cú pháp: string strstr(string str1, string str2);

2.2.1.2.2. Tìm vị trí của chuỗi con

Để tìm kiếm một chuỗi bên trong một chuỗi khác, ta có thể sử dụng một trong ba hàm strstr(), strchr(), strrchar() hay stristr(). Nhưng để tìm kiếm vị trí xuất hiện str1 trong chuỗi str2, ta có thể sử dụng các hàm như: strpos(), strrpos(). Hàm strpos() tr

về vị trí tìm thấy chuỗi str1 trong chuỗi str2, ngược lại hàm trả về giá trị -1. Nếu có nhiều chuỗi str1 giống nhau, hàm này chỉ trả về vị trí chuỗi str1 đầu tiên

Cú pháp: int strpos(string str1, string str2 [int off]); Kí tựđầu tiên của chuỗi tính từ 0.

2.2.1.2.3. Hàm so sánh chuỗi

Để so sánh chuỗi, có thể sử dụng hàm strcmp(), nếu hàm này trả về giá trị 0 khi hai chuỗi này bằng nhau, nếu chuỗi str1 lớn hơn str2 thì hàm trả về giá trị lớn hơn 0, ngược lại nếu str1 nhỏ hơn str2 hàm trả về giá trị nhỏ hơn 0.

35

2.2.1.2.4. Kiểm tra chiều dài của chuỗi

Khi muốn kiểm tra chiều dài của chuỗi, ta có thể sử dụng hàm strlen(str). Ví dụ:

<?

$str="your customer service is excellent."; echo "Length: " .strlen($str); ?>

Kết quả in ra là : Length: 23

2.2.2. MySQL

MySQL [8] là hệ quản trị cơ sở dữ liệu mã nguồn mở phổ biến nhất thế giới và

được các nhà phát triển rất ưa chuộng trong quá trình phát triển ứng dụng. Vì MySQL là cơ sở dữ liệu tốc độ cao, ổn định và dễ sử dụng, có tính khả chuyển, hoạt động trên nhiều hệđiều hành cung cấp một hệ thống lớn các hàm tiện ích rất mạnh.Với tốc độ và tính bảo mật cao, MySQL rất thích hợp cho các ứng dụng có truy cập CSDL trên internet.

• Một sốđặc điểm của MySQL:

MySQL là một phần mềm quản trị CSDL dạng server-based, nó quản lý dữ liệu thông qua các cơ sở dữ liệu, mỗi cơ sở dữ liệu có thể có nhiều bảng quan hệ chứa dữ

liệu.

MySQL có cơ chế phân quyền người sử dụng riêng, mỗi người dùng có thể quản lý được một hay nhiều cơ sở dữ liệu khác nhau, mỗi người dùng có một tên truy cập và mật khẩu tương ứng để truy xuất đến cơ sở dữ liệu.

Khi ta truy vấn tới cơ sở dữ liệu MySQL, ta phải cung cấp tên truy cập và mật khẩu của tài khoản có quyền sử dụng cơ sở dữ liệu đó.

• Các bước xây dựng chương trình kết nối tới cơ sở dữ liệu bằng ngôn ngữ PHP [12] :

Thông thường, trong một ứng dụng có giao tiếp với cơ sở dữ liệu, ta phải làm trình tự các bước sau:

36

Bước 1: Thiết lập kết nối tới cơ sở dữ liệu

Để kết nối tới MySQL, ta sử dụng hàm mysql_connect() Cú pháp: mysql_connect (host, tên_truy_cập, mật_khẩu); Ví dụ:

<?php

$link= mysql_connect("localhost","root",""); If(!link)

{

echo "Không thể kết nối tới cơ sở dữ liệu"; } ?> Bước 2: Lựa chọn cơ sở dữ liệu Để lựa chọn một cơ sở dữ liệu nào đó ta dùng hàm mysql_select_db() Cú pháp : mysql_select_db (tên_CSDL) Ví dụ: <?php $connect = mysql_connect("localhost","root","") or die ("Không thể kết nối tới cơ sở dữ liệu");

mysql_select_db("luan_van",$connect) or die ("Không tìm thấy cơ sở dữ liệu"); ?>

Bước 3: Tiến hành các truy vấn SQL Bước 4: Đóng kết nối tới cơ sở dữ liệu

37

2.2.3. Một số công nghệ và tiện ích khác 2.2.3.1. Add-ons firebug của firefox 2.2.3.1. Add-ons firebug của firefox

Firebug là một tiện ích rất hữu ích của trình duyệt firefox, hoàn toàn miễn phí, hỗ

trợ người dùng theo dõi cấu trúc của trang web, xác định các phần tử của trang web thông qua mô hình thẻ tag dạng cây. Dưới đây là hình minh họa khi sử dụng firebug để

tìm thẻ tag của tiêu đề bài viết trên trang vnexpress.net

Hình 9: Add-ons firebug của trình duyệt firefox 2.2.3.2. Ajax

Ajax [8] là một nhóm các công nghệ phát triển web được sử dụng để tạo các ứng dụng web động. Ưu điểm của ajax là:

Trong nhiều trường hợp, các trang web chứa rất nhiều nội dung thông thường trong trang. Nếu sử dụng các phương pháp truyền thống, những nội dung đó sẽ phải nạp lại toàn bộ với từng yêu cầu. Tuy nhiên, nếu sử dụng Ajax, một ứng dụng web có thể chỉ yêu cầu cho các nội dung cần thiết phải cập nhật, do đó giảm lượng lớn băng thông và thời gian nạp trang.

Việc dùng các yêu cầu không đồng bộ (asynchronous request) cho phép giao diện người dùng của ứng dụng hiển thị trên trình duyệt giúp người dùng trải nghiệm sự

38

2.3. PHÂN TÍCH

Để hiện thực hóa việc xây dựng trang web tổng hợp các bài viết từ trang Dân trí trước tiên chúng ta cần nắm được cấu trúc các bài viết trong một trang báo điện tử, từ đó phân tích và đưa ra các giải pháp nhằm giúp cho việc thu thập thông tin đạt hiệu quả cao.

2.3.1. Cấu trúc bài viết trong trang báo điện tử

Cấu trúc bài viết trong các trang báo điện tử luôn được xây dựng giống nhau có thể chia ra làm các phần chính là: phần nội dung bài viết, phần nội dung chuyên mục và phần nội dung trang chủ.

- Phần nội dung bài viết:

Phần nội dung bài viết có thể chia thành bốn trường thông tin chính bao gồm : + Trường tiêu đề (title): Chứa tiêu đề bài viết.

+ Trường giới thiệu (introduction): Chứa nội dung phần giới thiệu bài viết. + Trường nội dung (content): Chứa nội dung bài viết bao gồm văn bản và hình

ảnh.

+ Trường thời gian (date time): Chứa ngày tháng và thời gian bài viết được

39

Hình 10: Cấu trúc phần bài viết

- Phần nội dung chuyên mục (category):

Chuyên mục bao gồm các bài viết về cùng một chủ đề. Phần nội dung chuyên mục sẽ hiển thị ra phần mô tả các bài viết này. Phần mô tả bài viết bao gồm: trường tiêu đề, trường giới thiệu, trường hình ảnh.

40

Hình 11: Cấu trúc phần chuyên mục

- Phần nội dung trang chủ:

Trang chủ bao gồm các chuyên mục lớn (còn gọi là các chuyên mục cha). Phần nội dung trang chủ sẽ hiển thị ra phần mô tả các chuyên mục cha. Trong mỗi phần mô tả này sẽ có phần mô tả bài viết mới nhất trong chuyên mục và tiêu đề các bài viết khác trong chuyên mục.

41

Hình 12: Cấu trúc phần trang chủ

Thông qua cấu trúc bài viết ở trên ta thấy rằng để xây dựng thành công trang web thu thập tin tựđộng ta cần phải thu thập được phần nội dung bài viết và phần nội dung các chuyên mục. Cách làm phổ biến hiện nay là thu thập toàn bộ nội dung bài viết lưu vào cơ sở dữ liệu để tiện cho việc xây dựng trang web, tôi gọi đây là cách làm truyền thống. Trong quá trình tìm hiểu và xây dựng trang web, tôi đã nhận ra một số khuyết

điểm của cách làm này, từđó đã tìm ra một cách làm mới có một số cải tiến sáng tạo có thể hạn chếđược các khuyết điểm của cách làm truyền thống. Ở phần sau của khóa luận tôi sẽ lần lượt trình bày hai cách làm và phân tích ưu nhược điểm của chúng.

42

2.3.2. Các cách thu thập bài viết 2.3.2.1. Cách làm truyền thống 2.3.2.1. Cách làm truyền thống 2.3.2.1.1. Các bước thực hiện

Quá trình thu thập bài viết được chia thành các bước: Bước 1: Thu thập URL bài viết

Ở bước này chúng ta sẽ thu thập tất cả các đường dẫn URL ứng với các trang bài viết. Tất cả các trang báo điện tử hiện nay đều lưu trữ các bài viết theo các chuyên mục (category), việc làm này làm cho trang báo trực quan và thuận tiện cho người dùng khi muốn tìm kiếm thông tin. Với trang báo điện tử lớn như Dân trí thì ngoài các bài viết còn có rất nhiều các chuyên mục quảng cáo, các đường dẫn javascrips, các mục bài viết lồng nhau (ví dụ như phần tiêu điểm, tin nổi bật ...) chính vì thế vấn đề đặt ra trước hết là phải lọc được các URL bài viết theo các category, sau đó phải có một cơ

chếđể tránh lấy một URL nhiều lần.

Để lấy ra các đường dẫn URL ta có thể dùng hàm preg_math với $pattern là một biểu thức chính quy lấy ra các siêu liên kết. Kết quả thu được là một mảng với các phần tử

là các URL.

Sau đây là một ví dụ minh họa việc lấy ra các URL trong danh mục phapluat của trang Dân trí:

<?php

$crawler=file_get_contents('http://dantri.com.vn/c20s170/skphapluat/trang- 1.htm'); // duyệt nội dung của trang phapluat gán vào biến $crawler $pattern='/href="([^"]*)/is'; // biểu thức chính quy lấy ra các siêu liên kết preg_match_all($pattern ,$crawler,$matches);

print_r($matches[1]); ?>

43

Tiếp theo để lọc ra các URL bài viết trong danh mục pháp luật ta sẽ xử dụng các hàm tìm kiếm chuỗi trong PHP.

Ví dụ :

$result = array_unique($matches[1]); // đưa kết quả vào mảng unique foreach ($result as $url){ // duyệt từng phần tử

$find1= '.htm';

$find2= 's170'; // s170 là mã category

if ((strpos($link,$find1)==true) //lọc ra chuỗi có chứa chuỗi .htm &&(strpos($link,$find2)==true)) { //lọc ra chuỗi có chứa chuỗi s170 $content=file_get_contents('http://dantri.com.vn'.$url);

echo $content.'<hr>'; // in ra nội dung URL bài viết }

}

Bước 2: Bóc tách nội dung bài viết

Trước khi bóc tách thông tin ta sẽ sử dụng firebug – một add-ons của firefox, để xác

định các phần tử của trang web thông qua mô hình thẻ tag dạng cây.

Thông tin của một bài viết sẽđược bóc tách bằng cách sử dụng biểu thức chính quy và các hàm xử lý chuỗi trong PHP. Một bài viết sẽđược chia thành các trường thông tin

44

bao gồm : tiêu đề bài viết, giới thiệu bài viết, ảnh trong bài viết, nội dung bài viết, thời gian đăng bài viết và mã category tương ứng. Toàn bộ nội dung bài viết sau khi bóc tách xong sẽđược lưu vào cơ sở dữ liệu.

Sau đây là một ví dụ việc bóc tách nội dung một bài viết bất kỳ trên Dân trí lấy ra trường date time:

$link=”...” ; //$link là một URL bài viết bất kỳ

$crawler=file_get_contents("$link");

//duyệt nội dung của bài viết gán vào biến content $pattern = '/<div\sclass="neo-dtdate">(.*?)<\/div>/is';

// biểu thức chính quy lấy ra thời gian đăng bài viết preg_match_all($pattern ,$crawler,$matches);

foreach ($matches[1] as $date) {

echo "<b><h4>".$date."</h4></b>" ; // in ra kết quả

}

2.3.2.1.2. Nhận xét

Cách làm này có một số nhược điểm như sau: - Tốc độ thu thập chậm

Tốc độ thu thập chậm do phải duyệt nội dung hai lần. Lần đầu tiên là phải duyệt nội dung chuyên mục để lấy ra các URL bài viết, lần thứ hai là phải duyệt nội dung các bài viết để lấy ra các trường thông tin.

- Cơ sở dữ liệu quá lớn

Cơ sở dữ liệu lớn do phải lưu toàn bộ nội dung bài viết. Ta thử tưởng tượng chỉ với trang Dân trí đã có tới gần 400 nghìn bài viết, để lưu trữ cũng cần vài Gigabyte cơ sở

dữ liệu. Việc lưu trữ này sẽ vô cùng vất vả khi ta muốn tổng hợp thêm tin tức từ nhiều trang báo điện tử khác nhau. Vì là trang web tổng hợp thông tin nên nếu chỉ lấy nội dung từ một trang Dân trí thì không khả thi, trang web phải có khả năng tổng hợp thông tin từ nhiều nguồn thì mới có giá trị thương mại.

45

- Ngoài hai nhược điểm quan trọng kể trên thì còn một số nhược điểm khác trong quá trình hiển thị bài viết. Ví dụ như trong một bài viết có thể có nhiều ảnh đặc biệt là những bài phóng sự qua ảnh, khi đó cần cơ chế chung để chọn ra một ảnh đại diện để hiển thị ở phần mô tả bài viết. Mà các cơ chế này là khác nhau tùy vào từng trang báo. Do đó phần mô tả bài viết trong trang web tổng hợp thông tin sẽ không đảm bảo được tính toàn vẹn so với bài viết ở trang gốc.

Trong quá trình xây dựng trang web tôi đã nhận ra được các nhược điểm trong cách làm này, vì thế tôi đã tìm ra cách làm mới. Cách làm này có tốc độ thu thập nhanh hơn, cơ sở dữ liệu gọn nhẹ và đảm bảo được tính toàn vẹn của bài viết.

2.3.2.2. Cách làm mới

2.3.2.2.1. Các bước thực hiện

Quá trình thu thập bài viết được thực hiện qua các bước: Bước 1: Thu thập và bóc tách nội dung phần mô tả bài viết

Phần mô tả bài viết được minh họa ở hình 11. Trong phần này chúng ta sẽ thu thập các phần mô tả bài viết ứng với từng chuyên mục. Để làm được điều này ta cũng dùng hàm preg_math giống như cách làm truyền thống, trong đó $pattern là biểu thức chính quy để lấy ra phần mô tả. Sau đó ta sẽ thực hiện việc bóc tách nội dung phần mô tảđể

lấy ra các trường thông tin bao gồm : tiêu đề bài viết, giới thiệu bài viết, ảnh đại diện, URL bài viết. Trong URL bài viết ta lại lấy ra các trường: mã bài viết, mã chuyên mục, đường dẫn chuyên mục sau đó lưu tất cả vào cơ sở dữ liệu.

Sau đây là đoạn mã chương trình minh họa trình thu thập thực hiện việc thu thập phần mô tả bài viết:

function crawler($url){

$crawler = file_get_contents($url); // duyệt nội dung của trang ứng với url $pattern = '/<div\sclass=\"cat-headline\sclearfix\">(.*?)Xem\stiếp<\/a>/is';

//biểu thức chính quy lấy ra phần mô tả

preg_match_all($pattern ,$crawler,$matches); //kỹ thuật so trùng để lấy kết quả

46

$find1= '.htm'; // tìm kiếm chuỗi có đuôi htm if (strpos($link,$find1)==true) { add_into_db($link); // gọi hàm bóc tách nội dung } } }

Bước 2: Hiển thị nội dung bài viết

Sau khi đã lấy được nội dung các phần mô tả và lưu vào cơ sở dữ liệu, lúc này ta sẽ

thực hiện bước hiển thị nội dung ra trang web. Vì phần mô tả bài viết được lấy hoàn toàn từ trang gốc nên ta chỉ quan tâm đến việc hiển thị nội dung các bài viết. Do nội dung các bài viết không được lưu trong cơ sở dữ liệu nên khi ấn vào một đường dẫn bài viết thay vì lấy nội dung từ cơ sở dữ liệu ta sẽ gọi hàm bóc tách nội dung bài viết. Hàm bóc tách nội dung bài viết được xây dựng giống như trong cách làm truyền thống. Ý tưởng sáng tạo ở đây là: Trình thu thập lúc này không cần phải thu thập mà chỉ có nhiệm vụ bóc tách nội dung bài viết mà tốc độ bóc tách một bài viết của trình thu thập là rất nhanh nên ta không cần lưu vào cơ sở dữ liệu.

2.3.2.2.2. Nhận xét

Cách làm mới có một sốưu điểm sau: - Tốc độ thu thập nhanh hơn đáng kể

Tốc độ thu thập nhanh do hai lý do: thứ nhất là trình thu thập chỉ phải duyệt nội dung một lần (duyệt nội dung category) và thứ hai là lượng dữ liệu thu thập ít hơn nhiều. - Cơ sở dữ liệu gọn nhẹ

Cơ sở dữ liệu giảm khoảng hơn 10 lần do không phải lưu nội dung các bài viết, kiểm thử bằng cách thu thập 15000 bài viết, ở cách làm truyền thống cơ sở dữ liệu là hơn 100Mb trong khi cách làm này cơ sở dữ liệu chỉ có 9Mb.

- Đảm bảo tính toàn vẹn cho tài liệu gốc

Phần mô tả bài viết và phần nội dung bài viết mới là giống với bài viết gốc do đó đảm bảo được tính toàn vẹn của bài viết gốc.

47

2.4. THIẾT KẾ

Một sốđặc điểm của website:

- Website được viết bằng ngôn ngữ lập trình PHP tương tác với cơ sở dữ liệu MySQL.

- Website là một trang web tích cực.

- Website thực hiện việc thu thập bài viết từ trang báo điện tử lớn là Dân trí (http://dantri.com.vn). Tên các chuyên mục được lấy giống như trang Dân trí. Quá trình thu thập và bóc tách bài viết là tựđộng.

- Thuật toán sử dụng để thu thập dữ liệu là thuật toán tìm kiếm theo chiều rộng.

Một phần của tài liệu tìm hiểu về trình thu thập web và xây dựng trang web tổng hợp thông tin (Trang 41)

Tải bản đầy đủ (PDF)

(60 trang)