Tải bản đầy đủ (.docx) (72 trang)

Xây dựng website lọc, trích thông tin từ nhiều nguồn

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.21 MB, 72 trang )

LỜI CẢM ƠN
Trong suốt thời gian nghiên cứu khóa luận này, ngoài sự nỗ lực của bản
thân, em còn nhận được sự giúp đỡ, chỉ bảo tận tình của các thầy giáo, cô giáo
trong khoa Toán – Công Nghệ, trường Đại Học Hùng Vương.
Đặc biệt, em xin bày tỏ lòng biết ơn sâu sắc tới thầy giáo, Th.S Đinh
Thái Sơn- giảng viên trường Đại Học Hùng Vương. Thầy đã giành nhiều thời
gian quý báu tận tình hướng dẫn em trong suốt quá trình thực hiện khóa luận
này, đồng thời, thầy còn là người giúp em lĩnh hội được nhiều kiến thức
chuyên môn và rèn luyện cho em tác phong nghiên cứu đề tài.
Qua đây em xin gửi lời cảm ơn chân thành và sâu sắc tới các thầy giáo
cô giáo trong khoa Toán - Công Nghệ đã nhiệt tình giúp đỡ em trong suốt quá
trình học tập cũng như khi em thực hiện và hoàn thiện khóa luận này.
Mặc dù đã rất cố gắng song khóa luận của em không tránh khỏi những
thiếu sót. Vì vậy em rất mong nhận được sự góp ý của các thầy giáo, cô giáo
và các bạn để khóa luận được hoàn thiện hơn.
Em xin chân thành cảm ơn!
Việt Trì, Tháng 5 năm 2014
Sinh viên

Hà Thị Như Quỳnh


MỤC LỤC


DANH MỤC VIẾT TẮT
Từ viết tắt
API (Application Programming
Interface)
CSS (Cascading Style Sheets)
DOM (Document Object Model)


HTML ( HyperText Markup Language)
HTTP (HyperText Transfer Protocol )
URL (Uniform Resource Locator)
XML (EXtensible Markup Language)
XHTML (Extensible HyperText Markup
Language)

Ý nghĩa
Giao diện lập trình ứng dụng
Tập tin định kiểu theo tầng
Mô hình các đối tượng văn bản
Ngôn ngữ đánh dấu siêu văn bản
Giao thức truyền tải siêu văn bản
Địa chỉ Website
Ngôn ngữ đánh dấu mở rộng
Ngôn ngữ đánh dấu siêu văn bản
mở rộng


DANH MỤC BẢNG BIỂU


DANH MỤC HÌNH ẢNH


MỞ ĐẦU
1.

Lý do chọn đề tài khóa luận
Trong những năm gần đây, sự phát triển vượt bậc của công nghệ thông

tin đã làm tăng số lượng giao dịch thông tin trên mạng Internet một cách đáng
kể đặc biệt là thư viện điện tử, tin tức điện tử. Do đó thông tin, tin tức xuất
hiện trên mạng Internet cũng tăng theo với một tốc độ chóng mặt và liên tục
có sự thay đổi.
Với lượng thông tin đồ sộ như vậy, một yêu cầu lớn đặt ra đối với chúng
ta là làm sao tổ chức và tìm kiếm thông tin có lợi và hiệu quả nhất. Việc thu
thập, phân loại và trích xuất thông tin thông qua các website khác nhau hiện
nay đang có nhu cầu rất lớn. Nhưng một thực tế là khối lượng thông tin quá
lớn, việc thu thập và phân loại dữ liệu thủ công là điều rất khó khăn và
phức tạp. Hướng giải quyết là xây dựng một hệ thống website cho phép thu
thập và phân loại các thông tin trên.
Việc tổng hợp thông tin từ nhiều nguồn khác nhau cung cấp cho người
dùng cái nhìn tổng quát, đa chiều về thông tin mà người dùng quan tâm.
Nhằm tìm hiểu và xây dựng các quá trình tìm kiếm rút trích, bóc tách thông
tin từ nhiều trang web khác nhau. Qua đó xây dựng một website thông tin để
thu thập, đánh giá thông tin tự động trên Internet phục vụ cho người đọc có
thể nắm bắt được thông tin một cách dễ dàng, nhanh chóng và tiết kiệm thời
gian.
Chính vì vậy em chọn đề tài “Xây dựng website lọc, trích thông tin từ

2.

nhiều nguồn”.
Mục tiêu khóa luận
Mục tiêu của khóa luận nhằm tìm hiểu và nghiên cứu cách thức, quá
trình rút trích và bóc tách thông tin tự động từ nội dung của các website trên
internet qua đó xây dựng một website tổng hợp thông tin.

3.


Nhiệm vụ nghiên cứu

6


Sưu tập các tài liệu, giáo trình liên quan đến trình thu thập web, các
phương pháp bóc tách dữ liệu, các kỹ thuật lấy trang tin, để xây dựng website
tổng hợp tin tức từ nhiều nguồn.
4.

Phương pháp nghiên cứu
• Phương pháp nghiên cứu lý luận: Đọc và nghiên cứu tài liệu, giáo trình


có liên quan đến mã nguồn rồi phân hóa, hệ thống hóa các kiến thức.
Phương pháp tổng kết kinh nghiệm: Qua việc nghiên cứu, tham khảo
tài liệu, giáo trình từ đó rút ra kinh nghiệm để áp dụng vào việc nghiên



cứu.
Phương pháp lấy ý kiến chuyên gia: Lấy ý kiến của giảng viên trực tiếp
hướng dẫn, các giảng viên khác để hoàn thiện về mặt nội dung và hình

5.

6.

thức của khóa luận.
Đối tượng và phạm vi nghiên cứu

• Đối tượng: Nghiên cứu về trình thu thập web, các phương pháp bóc
tách dữ liệu, các kỹ thuật lấy trang tin.
• Phạm vi: Xây dựng website tổng hợp tin tức từ nhiều nguồn.
Ý nghĩa khoa học
Qua nghiên cứu đề tài đã bước đầu đề cập đến các giải pháp kỹ thuật
trong thu thập thông tin tự động trên internet, phục vụ cho việc phân tích
thông tin thu thập được theo lĩnh vực, chủ đề khác nhau nhằm giúp cho người
dùng theo dõi thông tin một cách thuận tiện, dễ dàng.
Đề tài nghiên cứu giúp sinh viên có khả năng thực hành tốt hơn khi xây
dựng website. Mặt khác, đề tài là tài liệu tham khảo dành cho các bạn sinh
viên và các thầy cô quan tâm đến vấn đề này.

7.

Bố cục của khóa luận
Ngoài phần mở đầu, kết luận, tài liệu tham khảo, khóa luận được chia
thành các chương.
Chương 1: Tổng quan về kỹ thuật bóc tách thông tin
Chương 2: Thiết kế hệ thống website
7


Chương 3: Xây dựng phần mềm

8


CHƯƠNG 1
TỔNG QUAN VỀ KỸ THUẬT BÓC TÁCH THÔNG TIN
1.1 Giới thiệu về trình thu thập web

Trình thu thập web (Web crawler) là một chương trình khai thác cấu trúc
đồ thị của web di chuyển từ trang này qua trang khác. Thời kỳ đầu nó có
những tên khá tượng hình như bọ web, rô-bốt, nhện và sâu, nhưng ngày nay
tên gọi phổ biến nhất là vẫn là trình thu thập web. Mặc dù vậy cụm từ “thu
thập” không lột tả được hết tốc độ của những chương trình này, vì chúng có
tốc độ làm việc đáng kinh ngạc, có thể thu thập dữ liệu lên đến hàng chục
ngàn trang trong vòng một vài phút.
Từ thời kỳ đầu, một động lực quan trọng thúc đẩy quá trình phát triển
của việc thiết kế trình thu thập web là lấy được nội dung các trang web và
thêm chúng hoặc đường dẫn của chúng vào một kho lưu trữ trang – một kiểu
kho lưu trữ có thể dùng để phục vụ cho các ứng dụng cụ thể trong công cụ tìm
kiếm web (search engine).
Các trình thu thập thường bắt đầu bằng cách chọn một số các đường dẫn
(URL) ứng với các trang web sẽ ghé thăm đầu tiên, các trang này được gọi là
các trang hạt giống.
Quá trình này chỉ dừng lại khi trình thu thập đã thu thập đủ số trang yêu
cầu hoặc frontier là rỗng, tức là không còn URL để duyệt. Tuy mô tả này có
vẻ đơn giản nhưng đằng sau chúng là khá nhiều vấn đề hóc búa liên quan đến
kết nối mạng, bẫy nhện, tiêu chuẩn trích xuất URL, chuẩn hóa các trang
HTML, bóc tách nội dung trang HTML vv...
Sau khi đã có được một danh sách các URL dùng cho việc thu thập, ta sẽ
thực hiện quá trình lấy trang. Tất cả các trang được lấy một lần và được lưu
vào một kho lưu trữ giống như cơ sở dữ liệu của công cụ tìm kiếm, đến đây
không cần thu thập thêm. Tuy nhiên web là một thực thể năng động với các
không gian con liên tục phát triển và thay đổi nhanh một cách chóng mặt, vì
9


thế thông tin phải liên tục được thu thập để giúp các ứng dụng luôn cập nhật,
ví dụ như bổ sung các trang mới loại bỏ các trang đã bị xóa, di chuyển hoặc

cập nhật các trang bị sửa đổi.
Các trang web chủ yếu được viết bằng các ngôn ngữ đánh dấu như
HTML, XHTML và được nhắm đến đối tượng sử dụng là con người chứ
không phải máy tính.
Các trang web lại chứa đựng nhiều thông tin có ích mà con người có thể
muốn thu thập và lưu trữ lại, chính vì thế mà cần phải có những kỹ thuật bóc
tách và trích xuất thông tin theo một cơ chế tự động. Các kỹ thuật bóc tách dữ
liệu (parsing) có thể ở mức đơn giản như việc bóc tách các siêu liên kết, hoặc
ở mức phức tạp hơn một chút là bóc tách bất kỳ phần nội dung nào trong một
trang web.
Về bản chất, quá trình thu thập web chính là quá trình duyệt đệ quy một
đồ thị. Các web được xem như một đồ thị với các trang là các đỉnh (node) và
các siêu liên kết là các cạnh. Quá trình lấy trang và trích xuất các liên kết bên
trong nó tương tự như việc mở rộng tìm kiếm một đỉnh trong đồ thị. Trình thu
thập sử dụng kỹ thuật tìm kiếm khác nhau sẽ cho kết quả tìm kiếm khác nhau,
so sánh hiệu suất của các kỹ thuật tìm kiếm này từ đó rút ra đánh giá về hiệu
suất của các trình thu thập.
Trình thu thập web là thành phần đầu tiên trong toàn bộ hệ thống search
engine. Mục đích của các hệ thống search engine là số lượng trang web đầu
vào đạt giá trị cao nhất có thể, trong đó trình thu thập web làm công việc
chính là duy trì cơ sở dữ liệu được đánh chỉ mục, trả về giá trị của bộ thu thập
và bộ lập chỉ mục cho hàng triệu truy vấn nhận được từ người dùng. Các trang
được đánh chỉ mục dựa trên các thuật toán ưu tiên hoặc các phương pháp dựa
trên kinh nghiệm (heuristic). Ngoài ra, chúng ta có thể sử dụng trình thu thập
web để xây dựng các phần mềm tập trung thông tin, các trang web tổng hợp
thông tin, dựa trên cơ chế tự động tìm và phát hiện tài nguyên.
 10 


1.2 Cách xây dựng một hạ tầng thu thập web

Trình thu thập chứa một danh sách các URL chưa được thăm gọi là biên
giới frontier. Danh sách được khởi tạo bởi một số các URL hạt giống - các
URL này được cung cấp bởi một người dùng hoặc một chương trình khác.
Mỗi vòng lặp là một quá trình gồm các bước:
-

Lấy một URL tiếp theo từ frontier ra để thu thập.
Lấy trang tương ứng với URL thông qua HTTP.
Bóc tách trang vừa lấy để trích xuất ra các URL và các nội dung thông tin cụ

-

thể.
Cuối cùng là thêm các URL chưa thăm vào frontier.
Trước khi các URL được thêm vào frontier chúng có thể được đánh chỉ
mục dựa trên số lượng truy cập vào trang web ứng với URL. Quá trình thu
thập sẽ chấm dứt ngay khi trình thu thập đạt đủ số lượng trang nhất định hoặc
frontier rỗng, đây được gọi là trạng thái kết thúc (dead-end) của trình thu
thập.
1.3 Frontier
Frontier là một danh sách chứa các URL của các trang chưa thăm. Trong
thuật ngữ tìm kiếm đồ thị, frontier là một danh sách mở các đỉnh chưa được
mở rộng. Đối với một trình thu thập lớn frontier có thể chứa hàng chục ngàn
đến hàng trăm ngàn trang và phải lưu trữ trong ổ cứng. Tuy vậy frontier nào
cũng có một miền giới hạn nhất định, miền giới hạn này lớn hay nhỏ phụ
thuộc vào bộ nhớ của máy tính. Khi số lượng URL thu thập được vượt quá
giới hạn này chúng ta sẽ cần một cơ chế để loại bỏ các URL ứng với các trang
ít quan trọng và giữ lại các URL ứng với các trang quan trọng. Lưu ý rằng tốc
độ thêm các URL vào frontier nhanh gần bằng tốc độ thu thập thông tin. Nó
có thể thêm tới 60000 URL ngay khi trình thu thập thu thập dữ liệu của 60000

trang, giả định trung bình mỗi trang có khoảng 7 liên kết.
Frontier có thể coi như một hàng đợi làm việc theo cơ chế FIFO (First In
First Out) nghĩa là vào trước ra trước trong trường hợp chúng ta sử dụng thuật
 11 


toán tìm kiếm theo chiều rộng để thu thập thông tin. Trình thu thập sử dụng
kỹ thuật tìm kiếm này gọi là trình thu thập theo chiều rộng. Các URL được lấy
ra thu thập được chọn từ trên xuống dưới trong danh sách và các URL mới
được thêm vào đuôi của danh sách. Do miền giới hạn của frontier, ta phải đảm
bảo các URL chỉ được lấy một lần. Để tìm kiếm xem một URL mới được
trích xuất đã có trong danh sách chưa là khá phức tạp vì số lượng trang là rất
lớn mỗi lần tìm kiếm là một lần chạy vòng for điều này là khá bất cập. Vì vậy
có một giải pháp là sử dụng một phần bộ nhớ để duy trì một hàm băm với
URL là khóa. Hàm băm này sẽ sinh ra các giá trị băm tương ứng với mỗi
URL. Sở dĩ sử dụng hàm băm sẽ tìm kiếm nhanh hơn vì việc so sánh các giá
trị băm nhanh hơn nhiều việc so sánh một giá trị với một khối dữ liệu lớn.
Hiện nay do bộ nhớ máy tính là rất lớn nên vấn đề về bộ nhớ là không
mấy quan trọng so với vấn đề về tốc độ. Do vậy, cách sử dụng hàm băm được
sử dụng rộng rãi, mặc dù là tốn bộ nhớ hơn nhưng tốc độ tìm kiếm lại được
cải thiện đáng kể.
Khi frontier đạt đến miền giới hạn, thì các trình thu thập theo chiều rộng
sẽ làm việc theo cơ chế sau: sau khi đưa một URL ra khỏi frontier để tiến
hành quá trình thu thập trang tương ứng thay vì việc lấy tất cả URL trong
trang này trình thu thập sẽ chỉ lấy URL chưa thăm đầu tiên và thêm vào
frontier.
Frontier có thể coi như một hàng đợi ưu tiên trong trường hợp chúng ta
sử dụng thuật toán tìm kiếm theo lựa chọn tốt nhất. Trình thu thập sử dụng kỹ
thuật tìm kiếm này gọi là trình thu thập ưu tiên. Hàng đợi ưu tiên là một mảng
với các phần tử là các URL được sắp xếp theo điểm đánh giá.

Trình thu thập ưu tiên sẽ làm việc theo cơ chế sau: URL được lấy ra khỏi
frontier để tiến hành thu thập luôn là URL tốt nhất. Sau khi thu thập trang
tương ứng, các URL được trích xuất ra, được đưa vào frontier và các danh
sách URL được sắp xếp lại theo điểm đánh giá. Để tránh việc trùng lặp URL
 12 


chúng ta cũng duy trì một hàm băm với các khóa là URL để tra cứu.
Khi frontier đạt đến miền giới hạn, cơ chế làm việc của trình thu thập tối
ưu cũng giống với trình thu thập theo chiều rộng chỉ khác là các URL được
lấy là các URL tốt nhất (tức là URL có điểm đánh giá cao nhất).
Trong trường hợp trình thu thập nhận thấy frontier là danh sách rỗng
(không thể lấy ra các URL tiếp theo để thu thập) thì quá trình thu thập sẽ kết
thúc. Tuy vậy trường hợp rất hiếm xảy ra vì với một số URL hạt giống và
miền giới hạn khá lớn frontier hiếm khi đạt trạng thái rỗng.
1.4 Lược sử và kho lưu trữ trang
Lược sử thu thập dữ liệu là một danh sách đánh dấu theo thời gian các
URL được lấy bởi trình thu thập. Một URL được đưa vào lược sử chỉ sau khi
đã trả về các URL bên trong nó. Lược sử có thể sử dụng để phân tích và đánh
giá thông tin. Lược sử được lưu trữ nhằm cung cấp cho một tra cứu nhanh để
kiểm tra xem một trang đã được thăm hay chưa. Kiểm tra này là khá quan
trọng nhằm tránh các trang bị thăm lại và tránh thêm việc thu thập lại các
trang này. Do kích thước của frontier có hạn và bộ nhớ của máy tính hiện nay
là vô cùng lớn nên việc duy trì một lược sử cần thiết nhằm nâng cao hiệu quả
hoạt động của trình thu thập. Một điều cần chú ý là phải chuẩn hóa URL trước
khi đưa vào lược sử.
Khi một trang được lấy nó phải được lưu trữ và lập chỉ mục nhằm mục
đích phục vụ cho các ứng dụng sau này (chẳng hạn như công cụ tìm kiếm).
Đây là công việc mà một kho lưu trữ trang phải làm. Một kho lưu trữ trang ở
dạng đơn giản sẽ chứa các trang thu thập theo từng file riêng biệt. Trong

trường hợp đó, mỗi trang phải đặt trong một tệp tin duy nhất. Một cách để làm
điều này là đặt mỗi trang URL tương ứng với một chuỗi sau đó sử dụng một
vài dạng của hàm băm với xác suất xung đột thấp để mã hóa. Giá trị kết quả
của hàm băm được sử dụng làm tên của tập tin. Bằng cách này chúng ta có độ
dài tên tập tin luôn cố định cho dù có bao nhiêu URL đi nữa. Tất nhiên nếu
 13 


chỉ cần lưu trữ vài nghìn trang thì ta có thể sử dụng một hàm băm đơn giản
hơn. Trong một số trường hợp các kho lưu trữ trang cũng có thể dùng để kiểm
tra xem một URL đã được thu thập hay chưa trước khi chuyển đổi sang tên
tập tin 32 ký tự. Trong những trường hợp này có thể bỏ đi cấu trúc dữ liệu
lược sử.
1.5 Cách lấy trang
Để lấy một trang web, chúng ta cần một máy khách HTTP (HTTP client)
gửi một yêu cầu HTTP (HTTP request) cho trang đó và đọc các phản hồi.
Client cần có thời gian trễ để đảm bảo rằng không bị mất thời gian không cần
thiết vào các máy chủ chậm hoặc đọc các trang lớn. Trong thực tế chúng ta
thường hạn chế vấn đề này bằng cách cho client tải về khoảng 10-20 KB đầu
tiên của trang. Client cần bóc tách được tiêu đề phản hồi cho các mã trạng thái
và chuyển hướng.
Kiểm tra lỗi và xử lý ngoài luồng là rất quan trọng trong quá trình lấy
trang vì chúng ta phải đối phó với hàng triệu máy chủ. Trong quá trình lấy
trang, trình thu thập không thể tự quyết định tài liệu nào được lập chỉ mục và
tài liệu nào không, do đó nó lấy tất cả những gì có thể. Thậm chí dù xác định
được tài liệu vô ích thì nó cũng đã bỏ ra một chi phí đáng kể cho hoạt động
thu thập.
1.6 Bóc tách trang
Khi một trang đã được lấy, chúng ta cần phân tích nội dung của nó để
trích xuất thông tin, lấy ra các URL để mở ra hướng đi tiếp theo của các trình

thu thập.
Phân tích nội dung có thể là quá trình khai thác hyperlink/URL đơn giản
hoặc nó có thể bao gồm quá trình phức tạp hơn như lọc nội dung HTML để
phân tích thành mô hình thẻ HTML dạng cây (HTML tag tree). Phân tích nội
dung cũng có thể bao gồm các bước chuyển đổi URL được trích xuất thành
dạng tiêu chuẩn, loại bỏ những từ ở phần đầu nội dung của trang và lấy các từ
 14 


còn lại ở phần thân.


Tiêu chuẩn trích xuất URL
Hàm bóc tách HTML có sẵn cho nhiều ngôn ngữ khác nhau. Chúng cung
cấp các chức năng để dễ dàng xác định các tag HTML và cặp các giá trị thuộc
tính liên quan trong một tài liệu HTML. Để trích xuất siêu liên kết URL từ
một trang Web, chúng ta có thể sử dụng các hàm bóc tách để tìm thẻ anchor
(thẻ <a>) và lấy các giá trị các thuộc tính href liên quan. Trước tiên chúng ta
phải chuyển đổi tất cả các đường dẫn URL sang đường dẫn URL tuyệt đối vì
có nhiều đường dẫn URL viết không đúng quy chuẩn có thể cùng dẫn tới một
trang. Điều này là quan trọng để tránh lấy một trang nhiều lần. Dưới đây là
một số bước điển hình được sử dụng trong thủ tục chuẩn hóa URL:

-

Chuyển đổi giao thức và tên máy chủ thành dạng chữ thường.
Loại bỏ phần “tham khảo” trong URL.
Thực hiện mã hóa URL cho một vài những ký tự thường sử dụng như ’~’.

-


Điều này sẽ tránh được việc thu thập lại 1 trang.
Đối với một vài URL, thêm ký tự ‘/’.
Sử dụng để nhận ra các trang web mặc định. Những tên file như index.html
hoặc index.htm có thể được loại bỏ trong đường dẫn URL với thừa nhận rằng

-

đó là những trang mặc định.
Loại bỏ ‘..’ và đường dẫn trước nó trong phần URL.
Điều quan trọng là đảm bảo tính nhất quán trong khi áp dụng các luật
chuẩn hóa. Có thể hai luật khác nhau lại cho kết quả tốt như nhau miễn là ta
áp dụng các luật chuẩn hóa URL một cách nhất quán.


Mô hình thẻ HTML dạng cây
Các trình thu thập có thể lấy ra giá trị của các URL hoặc một nội dung

bất kỳ trong một trang web bằng cách kiểm tra phạm vi thẻ tag HTML chứa
chúng. Để làm được điều này, trình thu thập có thể sử dụng mô hình thẻ
HTML dạng cây và phân tích cấu trúc DOM (Document Oject Model) của mô
hình này. Phân tích cấu trúc DOM giúp trình thu thập có thể duyệt các node

 15 


trên cây này và chỉ lấy ra phần nội dung mà nó cần. Hình dưới đây cho ta thấy
một mô hình cây tương ứng với một mã nguồn URL

Hình 1.1 Mô hình cây tương ứng với một mã nguồn HTML

Có thể thấy thẻ <html> là gốc của cây, các thẻ bên trong nó là các node
mở rộng, và dữ liệu text là lá của cây.
Trên thực tế, không phải văn bản HTML nào cũng được viết đúng quy
chuẩn như ví dụ trên. HTML là ngôn ngữ không phân biệt chữ hoa hay chữ
thường (hai thẻ <tr> và <TR> đều là một). Các phần tử HTML cần có một thẻ
mở và một thẻ đóng, tuy nhiên điều này không phải luôn luôn đúng, có nhiều
phần tử không cần thẻ đóng, ví dụ các thẻ
, <hr> và <li>. Ngoài ra khi
lồng nhau, các phần tử HTML cũng không cần thiết phải lồng nhau theo đúng
thứ tự (tức là thẻ nào mở trước thì phải đóng sau).

 16 


Vì vậy trước khi lập mô hình cây cho một mã nguồn HTML chúng ta cần
một quá trình chuyển đổi các tài liệu HTML ban đầu thành các tài liệu HTML
tiêu chuẩn, quá trình này gọi là chuẩn hóa các trang HTML. Quá trình này
bao gồm việc chuyển đổi các thẻ sang dạng chữ thường, chèn thêm các thẻ và
sắp xếp lại thứ tự các thẻ trong tài liệu HTML. Chuẩn hóa trang HTML là rất
cần thiết để việc lập mô hình cây được chính xác. Nếu như trình thu thập chỉ
cần lấy các liên kết hoặc văn bản hoặc một phần văn bản thì có thể ta không
cần sử dụng tới mô hình cây mà chỉ cần sử dụng kỹ thuật bóc tách HTML đơn
giản. Trình bóc tách như vậy cũng được hỗ trợ trong nhiều ngôn ngữ lập trình.
1.7 Các kỹ thuật thu thập web
Trong phần này chúng ta sẽ thảo luận về một số kỹ thuật thu thập dữ liệu
bao gồm:
- Kỹ thuật thu thập dữ liệu theo chiều sâu.
- Kỹ thuật thu thập dữ liệu theo chiều rộng.
- Kỹ thuật thu thập dữ liệu theo ngẫu nhiên.
Như đã nói ở phần trước về bản chất, quá trình thu thập web chính là quá
trình duyệt đệ quy một đồ thị. Các web được xem như một đồ thị với các

trang là các đỉnh (node) và các siêu liên kết là các cạnh. Chính vì thế các kỹ
thuật thu thập dữ liệu cũng được xây dựng dựa trên các thuật toán tìm kiếm
trên đồ thị. Các thuật toán tìm kiếm trên đồ thị bao gồm:
- Tìm kiếm theo chiều sâu (Depth-First Search): Là thuật toán tìm kiếm
bằng cách mở rộng nút đồ thị theo chiều sâu.
- Tìm kiếm theo chiều rộng (Breath-First Search): Là thuật toán tìm
kiếm bằng cách mở rộng nút đồ thị theo chiều rộng.
- Tìm kiếm theo lựa chọn tốt nhất (Best-First Search): Là một thuật toán
tìm kiếm tối ưu bằng cách mở rộng nút hứa hẹn nhất theo một quy tắc nào đó.
1.7.1 Kỹ thuật thu thập dữ liệu theo chiều sâu
Quá trình thực hiện:
 17 


Bước 1: Lấy URL đầu tiên trong danh sách (frontier) để thu thập.
- Nếu có qua bước 2.
- Nếu không qua bước 5.
Bước 2: Lấy trang tương ứng với URL qua HTTP.
- Nếu có qua bước 3.
- Nếu không quay lại bước 1.
Bước 3: Kiểm tra xem trang này đã được được thăm chưa?
- Nếu chưa qua bước 4.
- Nếu rồi quay lại bước 1.
Bước 4: Đánh dấu trang này đã được thăm. Bóc tách trang và tìm các
liên kết có trong trang này.
- Nếu có, thêm các liên kết vào đầu danh sách. Quay lại bước 3.
- Nếu không, quay lại bước 1.
Bước 5: Kết thúc.
1.7.2 Kỹ thuật thu thập dữ liệu theo chiều rộng
Quá trình thực hiện:

Bước 1: Lấy URL đầu tiên trong danh sách để thu thập.
- Nếu có qua bước 2.
- Nếu không qua bước 5.
Bước 2: Lấy trang tương ứng với URL qua HTTP.
- Nếu có qua bước 3.
- Nếu không quay lại bước 1.
Bước 3: Kiểm tra xem trang này đã được được thăm chưa?
- Nếu chưa qua bước 4.
- Nếu rồi quay lại bước 1.
Bước 4: Đánh dấu trang này đã được thăm. Bóc tách trang và tìm các
liên kết có trong trang này.
- Nếu có, thêm các liên kết vào cuối danh sách. Quay lại bước 3.
 18 


- Nếu không, quay lại bước 1.
Bước 5: Kết thúc.
1.7.3 Kỹ thuật thu thập dữ liệu ngẫu nhiên
Bước 1: Lấy URL ngẫu nhiên trong danh sách để thu thập.
- Nếu có qua bước 2.
- Nếu không qua bước 5.
Bước 2: Lấy trang tương ứng với URL qua HTTP.
- Nếu có qua bước 3.
- Nếu không quay lại bước 1.
Bước 3: Kiểm tra xem trang này đã được được thăm chưa?
- Nếu chưa qua bước 4.
- Nếu rồi quay lại bước 1.
Bước 4: Đánh dấu trang này đã được thăm. Bóc tách trang và tìm các
liên kết có trong trang này.
- Nếu có, thêm các liên kết vào cuối danh sách. Quay lại bước 3.

- Nếu không, quay lại bước 1.
Bước 5: Kết thúc.
1.8

Kỹ thuật lấy nội dung trang web bằng CURL trong PHP
CURL: là một hàm trong PHP. Hàm này cho phép đọc các trang web tải

tệp tin lên trang, sử dụng CURL để tự động cập nhật dữ liệu từ nhiều trang
web. Đặc biệt CURL có khả năng lấy dữ liệu được cả những trang bị chặn
bằng proxy thông qua curl_proxy(). Một CURL cần bao gồm các phần:
Khởi tạo CURL: để khởi tạo một curl ta sử dụng hàm curl_init() hàm
này có thể có đối số hoặc không có đối số với đối số là một địa chỉ tham
chiếu.
Thiết lập các tùy chọn cho CURL: để thiết lập tùy chọn ta sử dụng cú
pháp lệnh : curl_setopt ($biến khởi tạo curl, $option , $giá trị).

 19 


Thực hiện một CURL: để thực hiện một CURL ta sử dụng hàm
curl_exec ($ten curl). Sau khi một CURL được thực thi ta sẽ kết thúc phiên
làm việc này với hàm curl_close($ten curl).
Kỹ thuật lấy nội dung: Có hai cách sử dụng CURL để lấy dữ liệu
Cách 1: sử dụng GET để lấy dữ liệu từ một trang
function getPage($url, $referer, $timeout, $header){
if(!isset($timeout))
$timeout=30;
$curl = curl_init();
if(strstr($referer,"://")){
curl_setopt ($curl, CURLOPT_REFERER, $referer);

}
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt ($curl, CURLOPT_USERAGENT, sprintf("Mozi
lla/%d.0",rand(4,5)));
curl_setopt ($curl, CURLOPT_HEADER, (int)$header);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0);
$html = curl_exec ($curl);
curl_close ($curl);
return $html;
}

 20 


Cách 2: sử dụng POST để lấy dữ liệu
Function postPage($url,$pvars,$referer,$timeout){
if(!isset($timeout))
$timeout=30;
$curl = curl_init();
$post = http_build_query($pvars);
if(isset($referer)){
curl_setopt ($curl, CURLOPT_REFERER, $referer);
}
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt ($curl, CURLOPT_USERAGENT, sprintf("Mozilla
/%d.0",rand(4,5)));
curl_setopt ($curl, CURLOPT_HEADER, 0);

curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt ($curl, CURLOPT_POST, 1);
curl_setopt ($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt ($curl, CURLOPT_HTTPHEADER,
array("Content-type: application/x-www-formurlencoded"));
$html = curl_exec ($curl);
curl_close ($curl);
return $html;
}

Lưu ý: Ngoài cách trên ra chúng ta có thể sử dụng hàm
file_get_contents() có sẵn trong thư viện của PHP để thực hiện. Tuy nhiên sử
dụng hàm này sẽ có nhiều nhược điểm hơn so với phương pháp sử dụng
CURL để thực hiện, đó là:


1.9

Tốc độ tải chậm hơn so với CURL.
Không thể thực hiện được việc tải trang khi trang web đó có thiết lập proxy.
Phương pháp tổng hợp thông tin
Có một số phương pháp bóc tách, thu thập thông tin đó là: Biểu thức
chính quy, DOM XML, JQUERY- Ajax.
1.9.1 Biểu thức chính quy
Biểu thức chính quy (regular expressions hay regex): là một chuỗi
miêu tả một bộ chuỗi khác, theo những quy tắc và cú pháp nhất định, hay có

 21 



thể hiểu một cách đơn giản hơn nó là một mẫu (pattern) dùng để mô tả một
lớp ký tự nào đó.
Áp dụng vào trong vấn đề thu thập thông tin, biểu thức chính quy đóng
một vai trò quan trọng trong việc bóc tách thông tin, sử dụng thành thạo biểu
thức chính quy ta có thể áp dụng để bóc tách được nội dung của một trang
HTML.
Trong PHP, ta có thể sử dụng biểu thức chính quy thông qua hàm regex.
PHP cung cấp 3 nhóm hàm regex tên của chúng được bắt đầu bởi Ereg,
Mb_ereg và Preg. Dưới đây chúng ta chỉ đề cập đến nhóm hàm Preg. Một số
hàm phổ biến trong nhóm hàm Preg là:


Preg_match: sử dụng khi muốn lấy ra một chuỗi trong một chuỗi nguồn

khác, cấu trúc hàm như sau:
Preg_match($pattern,$string, $match)
Trong đó:
$pattern: Biểu thức chính quy.
$string: Chuỗi nguồn.
$match: Lưu kết quả trả về.


Preg_match_all: hoàn toàn tương tự như đối với preg_match nhưng có
sự khác biệt duy nhất đó là nó sẽ thực hiện cho đến khi so khớp hết với
chuỗi nguồn.
Biểu thức chính quy bao gồm 11 ký tự, cặp ký tự mang ý nghĩa đặc biệt,

được thể hiện ở bảng dưới đây:
Bảng 1.1 Các ký tự trong biểu thức chính quy

Ký tự
{a,b}

Ý nghĩa
Thể hiện ký tự

Ví dụ
a{1,3}

đúng trước nó phải
xuất hiện ít nhất a

 22 

Kết quả
a,aa,aaa,


lần và nhiều nhất là
b lần
Bắt đầu và kết thúc

[…]

một lớp ký tự.
Bắt đầu và kết thúc

(…)

[a-z]


Tập hợp tất các ký
tự từ a- z

một so khớp con
Giải phóng ký tự

\

đặc biệt
Quy định ký tự
đằng sau nó phải
xuất hiện đầu tiên

^

trong chuỗi. nếu nó

Tập hợp tất cả các
[^a-z]

nằm trong […] thì

ký tự không phải là
các ký tự a-z

có ý phủ định
Quy định ký tự
$


trước nó phải kết

(.*)basic$

thúc ở vị trí cuối
Ký tự thay thế cho
.

bất kỳ ký tự nào trừ

.*

|
?

ký tự xuống dòng
Hoặc
Tồn tại hoặc không
Lặp nhiều lần hoặc

a(c|d)b
ab?c

*

không lặp
Lặp ít nhất một lần

+


a*
a+

Chuỗi phải kết thúc
bởi từ basic
Lấy tất cả các ký tự
trên 1 dòng
acb,adb
abc,ac
Không có,
a,aa,aaaa,….
a,aa,aaa…

Ngoài các ký tự trên thì trên thực tế còn có những ký tự không in được
như: esc, space… Để giải quyết vấn đề này chúng ta sử dụng tổ hợp phím như
trong bảng sau:
Bảng 1.2 Tổ hợp phím trong biểu thức chính quy

 23 


Ký tự
\t
\n
\e
\s
\d
\v

Ý nghĩa

Tab
Xuống dòng
Esc
Space
Thay thế cho cách ký tự là số
Thay thế cho tất cả các ký tự là chữ thường và chữ in hoa.

 24 


1.9.2 DOM và XML


Phương pháp sử dụng DOM XML
DOM (Document Object Model) là mô hình các đối tượng văn bản,

trong trường hợp này ta có thể tạm hiểu nó như là một "cây" mô tả cấu trúc
của văn bản.
DOM là phần quan trọng trong định nghĩa các thành phần của một tài
liệu XML. DOM trong HTML ngoài việc thể hiện các thành phần một trang
web còn cung cấp các phương pháp đặc thù của HTML tùy vào hỗ trợ của
trình duyệt (IE hay FireFox) như bẫy sự kiện hay thay đổi classCSS. DOM
giờ đây được dùng nhiều bởi thư viện DOMXML của PHP.
Cấu trúc của DOM: Trước khi bắt đầu làm việc với DOM, chúng ta cần
hình dung thực sự DOM là gì?
DOM là một tập của các nút, hay những mẩu thông tin, được tổ chức
trong một hệ phân cấp. Hệ phân cấp này cho phép một người phát triển điều
hướng quanh biểu đồ hình cây để tìm kiếm thông tin cụ thể. Phân tích cấu trúc
thường đòi hỏi toàn bộ tài liệu phải được nạp và hệ phân cấp cần được xây
dựng trước khi công việc được hoàn thành. Bởi vì nó được dựa trên một hệ

phân cấp của thông tin.
Đối với các tài liệu tương đối lớn, việc phân tích và nạp toàn bộ tài liệu
có thể rất chậm và chiếm nhiều tài nguyên, nên các phương tiện khác sẽ tốt
hơn khi làm việc với dữ liệu này. Những mô hình dựa trên sự kiện, như là API
đơn giản dành cho XML sẽ làm việc trên luồng của dữ liệu bằng cách xử lý
dữ liệu khi nó đi qua. Một API dựa trên sự kiện không cần phải xây dựng cây
dữ liệu trong bộ nhớ, nhưng nó không cho phép một người phát triển thay đổi
dữ liệu trong tài liệu gốc.
Theo cách khác, DOM cũng cung cấp một API cho phép một người phát
triển thêm, sửa, di chuyển, hay xóa các nút tại bất cứ vị trí nào trên cây dữ
liệu để tạo ra một ứng dụng.
 25 


×