Thứ Ba, 10 tháng 10, 2006

HTMLParser 2.0 b1

Module đầu tiên của VietSpider 3 build 4 release là VSHTMLParser 2.0 b1.

25 nhận xét:

  1. Bản parser này parse một html document ra thành html tree dom trong đó có hỗ trợ các truy xuất node của tree. Phiên bản mới có tốc độ parse nhanh hơn và khả năng parse tốt hơn phiên bản cũ. VSHTMLParser 2.0 b1 release bao gồm HTMLExplorer cho phép view tree dom của một website hay 1 file html cùng lib và source code đi kèm. Ngoài ra là một crawler đơn giản cho phép download và lấy tin từ VNExpress và BBCNews (English). Các phiên bản tiếp theo của parser 2 sẽ cố gắng support javascript và xhtml thật tốt , hoàn thiện và bug một số lỗi hiện vẫn còn ở b1 này.

    Bản VietSpider 3.0 đang cố gắng hoàn tất phần crawler service trong đó cài đặt một mô hình Pool Executor cố định lượng thread, giải pháp cho phép thêm các plugin khá đơn giản trong đó có dáng dấp closure với sự hỗ trợ cài đặt của chain pattern và generic. RSS Parser đã bắt đầu cài đặt, sử dụng thuần túy các module XML2Object và Object2XML của VietSpider, điều đó có nghĩa là các RSS document trên net chỉ cần mapping vào một bean tương ứng do coder cung cấp mà không qua các bước parse và xử lý riêng. Cách thức mapping thông qua các annotation cùng các setter, getter với sự hỗ trợ của reflection. Mất khá nhiều thời gian vì muốn làm một hệ thống chạy tốt nên cứ rây rưa chưa mãi chưa tung ra VietSpider 3 build 4, có lẽ năm nay đã để lỡ một vài khách hàng cũng béo bở. Thui, kệ, tiền với mình bi chờ cũng chả cần thiết lắm, code được thích hơn mừ. Download

    Trả lờiXóa
  2. Hi, Lần đầu tiên biết đến cái VietSpider, cũng là người học hỏi chưa biết gì về lập trình, muốn hỏi bạn một chút.
    Cái việc phân tích một html document thành tree dom được tiến hành như thế nào vậy? Mình cũng mới đọc sơ qua chút ít về các kiểu phân tích một trang html thành cây DOM, và thấy có rất nhiều phương pháp khác nhau. Vậy ở đây bạn dùng phương pháp nào?
    ^_^ Chương trình này hay lắm đấy, Cố gắng hoàn thành tốt nhé!

    Trả lờiXóa
  3. đầu tiên là load document rồi decode lại thành dữ liệu có thể xử lý, thành char hay string. Một token parser phân tích nguồn dữ liệu này thành các token (tức các tag, comment, content,...) . HTML Parser nhận token collection làm đầu vào và parser ra Tree DOM, đơn giản như Neko thì parser như xml tree dom còn nếu đúng ra các browser hay parser thì phải tuân thủ đúng HTML DTD với version cung cấp ở header. XML là một document có cú pháp chặt chẽ còn html document thì lỏng lẻo hơn rất nhiều, chẳng hạn tr có thể có thể đóng hay không, nếu không thì nó sẽ được đóng như thế nào, những vùng nào nằm trong script và chúng sẽ không được coi là tag,... dùng google search để đọc về html dtd hoặc tham khảo code của html parser có rất nhiều trên mạng, cái hay nhất là mozilla parser viết từ năm 2000 thì phải.

    Trả lờiXóa
  4. Hi, ko hiểu sao từ hôm qua đến h mới vào được cái blog của bạn.
    Many thanks. Mình đang đọc về cái Mozilla (<-- ^_^ cái này cũng sẽ hỏi thêm sau khi đọc)
    Còn về VietSpider, mình muốn hỏi một chút ^_^
    1. Sau khi Parser một trang HTML thành DOM tree -> duyệt DOM tree -> tìm thấy vết (à bạn gọi đó là vùng truy xuấtdẫn tới node chứa khối tin -> output ra khối tin (danh sách các tin có trong trang web đó). Toàn bộ quá trình trên bạn có sử dụng thuật toán nào không?
    2. Với mỗi trang web mình thấy bạn đều có một vùng truy xuất mẫu trước. Cái đó giúp bạn khi duyệt trang web thì đưa ra được ngay vùng chứa tin (List các bài tin). Đúng không?
    3. Khi click chuột vào link dẫn đến một bài tin cụ thể thì mình đã có sẵn link do parser từ trang web trên + vùng truy xuất (cái này luôn cố định đối với từng bài trong các trang của cùng một site). Do đó chỉ cần click chuột vào tiêu đề (link) của bài báo trong danh sách các bài tin (được extract từ phần 2) là có thể trích luôn được bài tin (riêng biệt) đó từ trang web. Đúng không?

    Many thanks for ur help!

    Trả lờiXóa
  5. 1. chả có gì là thuật toán ở đây vì đã có Tree DOM thì việc truy xuất một Node cụ thể sẽ thông qua node path.
    2. trang chủ (trang list) luôn chứa các link đến các trang con chứa nội dung chi tiết, node path là một cách thức chỉ ra vùng trên html document có chứa loạt danh sách các nội dung này thay vì phải duyệt hết.
    3. đúng rồi, nếu bạn hiểu biết một chút về lập trình server site thì bạn sẽ thấy rõ, path truy xuất đến nội dung cụ thể hầu như là ổn định. do đó, có path và có document sẽ dễ dàng lấy được vùng thông tin cần lấy, bất kể là vùng nào.

    Trả lờiXóa
  6. hi,
    Khi bạn parser một trang web sang dạng DOM tree rồi, thì làm cách nào bạn tìm ra được node nào là Node chứa khối tin (danh sách nội dung tin)?

    Many thanks for ur help!

    Trả lờiXóa
  7. cái này phải do user dùng tool định vị trí cần lấy, chẳng hạn như HTMLExplorer đính kèm thư viện cho phép select path cần lấy.

    Trả lờiXóa
  8. Hi,
    Mình có đọc qua một số phương pháp xác định vị trí khối tin.
    Ví dụ sử dụng thuật toán RTDM, hay VIPS, hay nhận dạng thông qua các thuật toán xử lý ngôn ngữ tự nhiên, hay việc tính toán giá trị các block dựa vào việc tính toán các entropy… Còn cách thức của bạn thì dựa vào cái gì? (hic mình chưa thực sự hiểu ý của bạn). Hình thức làm do user dùng tool định vị trí có phải là thủ công không? Tức là sau khi parser một trang thì ban đầu mình phải tự lựa chọn (bằng cách bôi đen vị trị tin cần lấy), rồi từ đó xác định được Node chứa tin trong DOM tree?

    Many thanks for ur help!

    Trả lờiXóa
  9. Thực ra thì có rất nhiều giải pháp bóc tách dữ liệu từ web, nếu không nhầm thì nó thực sự được quan tâm vào năm 1997, mô hình bóc tách của mình tập trung vào các website tương tác động, nghĩa là các trang web tĩnh thì gần như không có khả năng bóc tách chính xác.

    Khi làm website, thông thường chúng được dựng lên theo một teplate có sẵn với nguồn dữ liệu động lấy từ cơ sở dữ liệu , do đó gần như những nội dung cần thiết sẽ nằm trong một cấu trúc ổn định. Mô hình bóc tách của mình là cho user chỉ ra vị trí dữ liệu cần lấy làm thông số đầu vào cho việc bóc tách. Chẳng hạn nếu nhìn qua HTMLExplorer bạn có thể hiểu được phần nào về phương pháp bóc tách. User chọn vị trí node cần lấy (bôi đen chỉ là một cách thức để tìm kiếm vị trí node thay vì cứ phải đi vào từng nấc), sau đó lưu lại lần sau crawler đoán biết vị trí này lấy lại dữ liệu từ website.

    Câu chuyện về tự động mình cũng nghe nhiều, có một vài thuật toán trên thế giới cũng có những đặc điểm giống mô hình bóc tách của mình, một vài trong số chúng cố gắng cài đặt khái niệm learning và auto select, nghĩa là chúng tự động tìm ra phần nội dung qua trọng cần lấy. Một điểm khi xây dựng crawler là các nhà phát triển đều cố gắng xây dựng tính năng phân loại tự động. Hầu như các feature mình đã từng biết hoặc đã làm thử. Tuy nhiên thấy việc không hiệu quả so với công sức và kết quả không thỏa mãn.

    Chẳng hạn, việc phân loại, nếu như một trang xã hội sẽ đưa toàn bộ nội dung vào mục xã hội thì dĩ không phải không làm được (mình xét đến khả năng thôi nhé, chứ hiệu quả đạt được như thế nào lại là chuyện khác) nhưng một số khách hàng lại muốn đưa nội dung này vào mục chính trị xã hội, hay đơn thuần là một chuyên mục nào đó mà họ tự đặt, chuyện đó liệu có nên tự động đoán biết suy nghĩ của user hay không ? Hơn nữa, có cản nghìn vấn đề lớn nhỏ cũng được phân lớn phân nhỏ trên internet, tự động kiểu đó cũng thấy không hiệu quả lắm.

    Trở lại một vấn đề nữa là hệ thống tự động xét duyệt phần nội dung cần lấy, đây là suy nghĩ nhắm đến một mục đích cụ thể , chẳng hạn bóc tách nội dung tin tức, tuy nhiên cọ sát với thực tế , nhiều khách hàng họ chỉ muốn lấy phần title hoặc description, hoặc một số nơi muốn lấy các thông tin sản phẩm của một website thương mại hay đơn thuần là các bức ảnh của một kho dữ liệu hình ảnh nào đó, do vậy tự động ở đây bỗng dưng trở thành một giới hạn ngăn cản tính linh động của một hệ thống.

    Về giải pháp của mình, trong phần mềm xét về mặt cấu hình thì rất thủ công, nghĩa là tôi muốn lấy dữ liệu từ một trang tôi phải được cung cấp thông tin về nó bao gồm mức, địa chỉ, và vị trí nội dung cần lấy. Do trình độ thuộc hàng kém phát triển nên mình không có khả năng gắn được tự động ở phần này. Nghĩa là user vẫn phải cung cấp thông tin cho hệ thống. Xét về chi phí, không mất quá nhiều thời gian cho việc này, thông thường một website chỉ mất khoảng 5-10 phút và hầu như rất lâu họ mới phải cập nhật lại hay sửa đổi các thông tin này (khi cấu trúc web nguồn bị thay đổi). Do đó bước này là bước căn bản đầu tiên cho user, dĩ nhiên mình sẽ cố gắng làm cho chúng gọn, đơn giản càng tốt, chẳng hạn khả năng detect encoding, auto input name,...

    Các vấn đề liên quan hình như mình đã trình bày đâu đó ở blog này, bạn có thể tìm đọc lại.

    Trả lờiXóa
  10. Hi,
    Mình đọc phần mà bạn nói về nhược điểm của việc phân loại tự động, nhưng chưa hiểu gì? Bạn có thể nói thêm về điều này qua thực tiễn của bạn trong quá trình làm VietSpider không?

    Many thanks for ur help!

    Trả lờiXóa
  11. Hi,
    Phương pháp để bạn phân tích một trang Html là gi? DOM tree có ý nghĩa gì trong chương trình của bạn không? Nếu có tìm hiểu về DOM, bạn có thể cho mình biết bản chất của DOM là gì? DOM với DOM tree có khác gì nhau không? DOM được sử dụng như thế nào?

    Many thanks for ur help!

    Trả lờiXóa
  12. Phương pháp phân tích thì trước tiên chuyển html document về một dạng dễ sử dụng là HTML Tree DOM , cách thức parse ra sao thì có thể xem trực tiếp code, kết quả parse thì có thể nhìn thấy bằng tool là HTMLExplorer, cách thức parse thì tốt nhất là tuân thủ đúng đặc tả của HTML DTD (các version khác nhau).

    Khi đã có được HTML Tree DOM thì việc sử dụng như thế nào tùy từng ứng dụng và mục đích cài đặt module, chẳng hạn trong VietSpider, Tree DOM dùng cho mục đích bóc tách dữ liệu.

    Còn về sự khác nhau thì bạn có thể xem thêm tại http://vi.wikipedia.org/wiki/DOM

    Trả lờiXóa
  13. Hi,
    Bạn dùng Java để parse trang html. Mình thấy cũng có một tool có sẵn cũng làm việc này (hình như là HtmlParse). Bạn có dùng tool này ko? Hay viết code khác? Ý tưởng parse của bạn như thế nào? Có thể nói cụ thể không?

    Many thanks for ur help!

    Trả lờiXóa
  14. dĩ nhiên là không rồi, trong java có khoảng gần chục open source để parser html document, tuy nhiên một vài trong số chúng không thỏa mãn mục đích của mình còn một vài lại parse chưa tốt, cái VSHTMLParser release trên sourceforge là do mình tự viết lấy. Từ ngày VietSpider ra đời hoàn toàn không dùng một bộ HTMLParse bên ngoài. Về ý tưởng mình đã trình bày rất nhiều ở các bài trên parse html document thành HTML TRee DOM và theo đúng HTML DTD.

    Trả lờiXóa
  15. chào bạn, mình thấy cái htmlexplore của bạn rất hay. Bạn có thể open source cái tool đó ra đc ko ?

    Trả lờiXóa
  16. Hi,
    Việc nhận dạng các vùng tin cần lấy của bạn xem ra khá hiệu quả và chính xác. Bạn có thể chia sẻ là làm thế nào bạn tính toán được ứng với mỗi trang mẫu có 1, 2 hoặc 3 vùng nội dung cần lấy không?

    Many thanks for ur help!

    Trả lờiXóa
  17. chọn node sau đó click chuột phải nhấn nút add item hoặc chọn nút add ở phía dưới sẽ được một loạt các vùng khác nhau theo thứ tự lấy vào.

    Về Open source, các module chính đã open còn cái GUI thì do code dở tệ viết từ ngày xưa lâu lắm rồi chưa upgrade sợ bị chê nên không open, nhưng chắc sẽ phải open thôi.

    Trả lờiXóa
  18. Hi, bạn khiên tốn quá rồi. Mình cũng làm ứng dụng có chức năng như thế. Tức là từ HTML --> tree, và thực hiện so sánh tree và search node như bạn. Nhưng kết quả chưa đạt như ý muốn lắm nên muốn học hỏi cách làm của bạn thôi. Nếu không phiên bạn có thể giúp mình được không ?
    Thanks!

    Trả lờiXóa
  19. vậy thì bộ parser đã open source thỏa mãn mục đích rồi, còn cái mà bạn nhìn thấy là GUI nên cũng không quan trọng lắm đúng không, tham khảo code đi kèm để có thể xây dựng nên ứng dụng của mình. Mà bạn cũng tự viết parser hả ?

    Trả lờiXóa
  20. Uh, mình viết bằng .net. Parse cũng khác là đơn giản chứ có lẽ không phức tạp và nhiều chức năng như của bạn. Parse sinh ra cấu trúc cây. Còn việc search thì mình làm ở giao diện.

    Trả lờiXóa
  21. Minh cung que o Hai Duong, rat vui duoc biet blog nay cua ban. Keep trying, success to you!

    Trả lờiXóa
  22. Em thay chuong trinh cua anh rat hay. Nhung em muon hoi anh them ve cac tinh nang boc tach khi su dung HTMLParser duoc khong ah? Gia su minh muon lay noi dung o the ben ngoai ma khong muon hien thi ca noi dung the ben trong ay thi lam the nao nhi? Em khong thay anh noi den.
    Thanks for help me!

    Trả lờiXóa
  23. xem code chuong trinh ở đâu vậy bạn sao mình ko thấy nhỉ? hihi

    Trả lờiXóa
  24. Bạn tìm từ Download ở trên đó.

    Trả lờiXóa

nhudinhthuan@gmail.com