2011-01-29 47 views
48

Trạng thái hiện tại của thư viện để lưu các trang web bằng Haskell là gì?Web Scraping With Haskell

Tôi đang cố gắng làm cho bản thân mình thực hiện nhiều tác vụ nhanh hơn trong Haskell, nhằm giúp tăng mức độ thoải mái của tôi bằng ngôn ngữ.

Trong Python, tôi có xu hướng sử dụng thư viện tuyệt vời PyQuery cho việc này. Có một cái gì đó tương tự đơn giản và dễ dàng trong Haskell? Tôi đã nhìn vào Tag Soup, và trong khi các trình phân tích cú pháp chính nó có vẻ tốt đẹp, thực sự đi qua các trang không có vẻ tốt đẹp như nó là trong các ngôn ngữ khác.

Có tùy chọn nào tốt hơn không?

+1

Bạn thấy thiếu gì trong TagSoup? –

+1

Các chức năng tìm kiếm tài liệu được phân tích cú pháp dường như bị hạn chế hơn so với các thư viện bằng các ngôn ngữ khác. Các chức năng mục đích chung như các phần không có vẻ xấu, nhưng nó vẫn đòi hỏi một số dòng mã cho một số sử dụng thực sự phổ biến. Ví dụ, việc chọn một phần tử theo lớp đòi hỏi ít nhất một vài dòng mã để làm những gì sẽ là một cuộc gọi duy nhất trong jquery. Điều đó sẽ không có hại cho một dự án duy nhất, nhưng trường hợp sử dụng điển hình của tôi cho đây là một dự án nhỏ. Vì vậy, tôi hoặc duy trì một số người giúp đỡ, hoặc lặp lại bản thân mình một bó. Tui bỏ lỡ điều gì vậy? – ricree

Trả lời

22

Từ tìm kiếm của tôi trên danh sách gửi thư của Haskell, có vẻ như TagSoup là lựa chọn thống trị để phân tích các trang. Ví dụ: http://www.haskell.org/pipermail/haskell-cafe/2008-August/045721.html

Theo như các khía cạnh khác của web cào (như bò, bò loang, và bộ nhớ đệm), tôi đã tìm kiếm http://hackage.haskell.org/package/ cho các từ khóa nhưng không tìm thấy bất cứ điều gì hứa hẹn. Tôi thậm chí còn lướt qua các gói đề cập đến "http" nhưng không có gì nhảy ra ngoài với tôi.

Lưu ý: Tôi không phải là người bán hàng thường xuyên, vì vậy tôi hy vọng những người khác có thể kêu vang nếu tôi bỏ lỡ điều gì đó.

+0

Hộp công cụ XML Haskell (HXT) có thể đáng xem: http://en.wikibooks.org/wiki/Haskell/XML –

+7

Tôi có thể xác minh cho TagSoup: Tôi đã sử dụng riêng cho một dự án hoàn toàn dựa trên việc cào HTML . Đối với các gói ứng dụng khách HTTP, tôi đã viết [http-enumerator] (http://hackage.haskell.org/package/http-enumerator) đặc biệt vì tôi không thấy bất kỳ lựa chọn thay thế tốt nào. –

+2

Có dao mổ được xây dựng trên TagSoup https: // github.com/fimad/scalpel – guido

34

http://hackage.haskell.org/package/shpider

Shpider là một thư viện tự động hóa web cho Haskell. Nó cho phép bạn nhanh chóng ghi trình thu thập thông tin và đối với các trường hợp đơn giản ( như các liên kết sau) ngay cả khi không cần đọc nguồn trang.

Nó có nhiều tính năng hữu ích như chuyển liên kết tương đối từ một trang vào liên kết tuyệt đối, tùy chọn cho phép giao dịch chỉ trên một tên miền nhất định, và tùy chọn để chỉ tải html tài liệu.

Nó cũng cung cấp cú pháp tốt đẹp cho điền vào biểu mẫu.

Một ví dụ:

runShpider $ do 
     download "http://apage.com" 
     theForm : _ <- getFormsByAction "http://anotherpage.com" 
     sendForm $ fillOutForm theForm $ pairs $ do 
      "occupation" =: "unemployed Haskell programmer" 
      "location" =: "mother's house" 
+0

Thú vị. Dường như shpider cũng có thể sử dụng để kiểm tra web. –

+0

Michael, bạn đã sử dụng nó để thử nghiệm chưa? – Qrilka

+0

Tôi gặp vấn đề khi cài đặt shpider trên ghc 7.6.2 – Anton

11

Mặc dù tôi vẫn cho bây giờ là một người mới bắt đầu trong Haskell, tôi có ý kiến ​​mạnh mẽ rằng HTML phân tích vào năm 2012 phải được thực hiện bằng bộ chọn CSS, và có vẻ như các thư viện được đề xuất cho đến nay không sử dụng nguyên tắc đó.

Một khả năng là HandsomeSoup, được xây dựng trên đầu trang của HXT:

http://egonschiele.github.com/HandsomeSoup/

http://codingtales.com/2012/04/25/scraping-html-with-handsomesoup-in-haskell

Trang này về HXT, trên đó HandsomeSoup dựa, cũng sẽ rất hữu ích (bạn đang đi cần getText hoặc getText sâu):

http://adit.io/posts/2012-04-14-working_with_HTML_in_haskell.html

Nhưng sự lựa chọn khác là dom-selector:

http://hackage.haskell.org/package/dom-selector

Đó là ngay bây giờ alpha và bảo trì dài hạn của nó có thể là một vấn đề. Lợi thế của bộ chọn dom là tôi không thể có được các ký tự unicode để làm việc với HandsomeSoup. Họ làm việc ra khỏi hộp với bộ chọn dom.

Câu hỏi này có liên quan đến rằng: Is it possible to use Text or ByteString on HXT in Haskell?

dom-selector được dựa trên html-ống dẫn và xml-ống dẫn, mà duy trì xuất hiện đảm bảo.

EDIT: lưu ý câu trả lời mới hơn của tôi về phân tích cú pháp dựa trên ống kính. Tôi đã để lại câu trả lời này vì nó vẫn tốt cho riêng mình, nhưng bây giờ tôi cá nhân thay vì sử dụng cách tiếp cận khác.

+1

HandsomeSoup là một thư viện thực sự gọn gàng. Cảm ơn bạn đã chia sẻ điều này hoặc tôi sẽ không biết nơi để tìm! – thegravian

6

Tôi đã viết một câu trả lời khác cho câu hỏi này, gợi ý phân tích dựa trên bộ chọn CSS, tuy nhiên câu trả lời bây giờ là một năm rưỡi, và ngày nay tôi nghĩ ống kính có thể là cách tiếp cận tốt hơn trong haskell. Trong thực tế bạn nhận được một cái gì đó giống như loại an toàn biên soạn selectors.

Xem this reddit discussion cho một vài tùy chọn trong tĩnh mạch đó. Trong trường hợp liên kết biến mất, tôi sao chép các liên kết trực tiếp:

Tôi đã sử dụng không ai trong số những người nêu ra, nhưng nếu tôi sẽ viết mã mới phân tích cú pháp HTML ngày hôm nay, tôi chắc chắn sẽ đi với một phương pháp dựa trên ống kính.