Thứ Hai, 25 tháng 6, 2012

Rút trích nội dung trang web (Web Scraping)


Bạn thấy một số trang web có nội dung hoặc dữ liệu mà bạn cần, bạn sẽ làm gì nhỉ? Nhấn Ctrl + S để lưu lại nội dung trang web đó hoặc copy phần nội dung mình thích sang Word. Vậy giả sử bạn cần lấy dữ liệu của 1 nghìn trang web về lưu vào database trên máy tính thì sao? Cách làm thủ công sẽ không thể nào khả thi trong trường hợp này. Web Scraping chính là phương pháp dùng để rút trích thông tin từ những trang web mà bạn mong muốn
Mục tiêu của bài viết này là giúp bạn hiểu được cách lấy nội dung của trang web cũng như xử lý nội dung đó để chọn lựa thông tin bạn cần từ nội dung đó. Sản phẩm demo là một chương trình cho phép bạn nhập vào một từ tiếng Anh và hiển thị cách phát âm của từ tiếng Anh đó. Chúng ta sẽ sử dụng trang web vdict.com như là nguồn dữ liệu cung cấp cách phát âm cho một từ tiếng Anh bất kỳ.
image
Sau khi bạn nhập từ tiếng Anh và nhấn nút Tìm kiếm, các việc sau sẽ được thực hiện:
  • Một Request được gửi đến trang vdict.com có kèm theo từ vừa được nhập
  • Server gửi về chuỗi HTML tương ứng. Thực hiện việc phân tích chuỗi HTML này để tìm ra vị trí chứa phần phát âm và hiển thị lên giao diện
Chúng ta sẽ lần lượt đi qua từng bước của quá trình này
1. Gửi Request đến vdict.com
vDict.com là trang web từ điển online cho phép bạn tra cứu nghĩa, cách phát âm cũng như là xem ví dụ của những từ ở nhiều ngôn ngữ khác nhau. Trong demo này chúng ta sẽ tập trung vào bộ từ điển Anh-Việt. Việc đầu tiên của Web Scraping là bạn phải biết được cách trang web nhận dữ liệu vào như thế nào. Hãy thử nhập từ “good” vào trong ô tìm kiếm và nhấn nút “Tìm”, bạn sẽ có được trang web sau
image 
Bạn hãy để ý đến URL của trình duyệt lúc này, địa chỉ sẽ là http://vdict.com/good,1,0,0.html, nghĩa là từ tiếng Anh sẽ được truyền như là một GET request thông qua URL. Chỉ cần bạn thay từ good bằng một từ khác thì kết quả trang web trả về cũng thay đổi tương ứng. Như vậy, trong C# chúng ta chỉ cần xây dựng chuỗi có dạng http://vdict.com/{word},1,0,0.html với {word} là vị trí chúng ta sẽ thay bằng từ được người dùng nhập vào.
Việc tiếp theo là phải thực hiện gửi một Request dạng GET đến địa chỉ ở bên trên. Các bạn có thể tham khảo bài viết Gửi Request trong C#để hiểu rõ hơn về cách thực hiện.
Trong ví dụ demo, tôi sử dụng lớp WebClient thay vì WebRequest, WebClient là một lớp ở mức cao hơn của WebRequest cho phép bạn nhanh chóng thực hiện các thao tác gửi Request và nhận dữ liệu từ Server. Cách sử dụng WebClient rất là dễ dàng, bạn có thể tham khảo http://www.dotnetperls.com/webclient hoặc xem code demo.
2. Phân tích chuỗi HTML trả về
Bạn gửi request lên server và nhận được chuỗi HTML từ server dùng để hiển thị trên trình duyệt. Tuy nhiên, thay vì hiển thị cả chuỗi HTML, chúng ta chỉ quan tâm tới thành phần có chứa phát âm của chuỗi HTML này. Bằng cách sử dụng các công cụ soi mã HTML trên Chrome hoặc Firefox, ta có thể dễ dàng biết được chuỗi phát âm đó nằm ở đâu
image
Như trên hình, chúng ta thấy được rằng chuỗi phát âm của từ “good” nằm trong một thẻ
có class là pronounce. Chỉ cần phân tích chuỗi HTML và tìm ra vị trí chính xác của thẻ
này là có thể lấy được nội dung bên trong nó.
Có nhiều cách để tìm kiếm chuỗi theo mẫu, bạn có thể tìm kiếm tuần tự, sử dụng phương thức IndexOf của string hoặc dùng Regular Expression. Tuy nhiên các cách này có thể đòi hỏi bạn thực hiện nhiều thao tác so sánh và kết quả có thể không chính xác. Ở đây, tôi sử dụng thư viện HtmlAgilityPackđể phân tích nội dung trang web. Thư viện này cho phép bạn duyệt qua nội dung HTML như là một tài liệu XML bằng cách sử dụng cú pháp của XPath. Sử dụng HtmlAgilityPack làm cho code của bạn sáng sủa và dễ hiểu hơn rất nhiều. Trong chương trình demo, sau khi đã có được chuỗi HTML, tôi sử dụng đoạn code sau để tìm ra chính xác thẻ
như sau:
Cú pháp XPath: //div[@class=’pronounce’] có nghĩa là: chọn ra thẻ
tại bất kỳ vị trí nào trong chuỗi HTML mà có thuộc tính class là pronounce. Biến divNode là kết quả trả về chứa thông tin của thẻ
tìm thấy. Lưu ý nếu như không tìm thấy thẻ tương ứng thì divNode sẽ có giá trị null.
Các bạn có thể download chương trình demo tại đây: VDictPronunciation

Không có nhận xét nào: