2009-05-07 30 views
26

Tôi đang tìm một thư viện C++ tốt cho việc cào web.
phải là C/C++ và không có gì khác vì vậy vui lòng không chuyển hướng tôi đến Options for HTML scraping hoặc các câu hỏi/câu trả lời khác mà C++ thậm chí không được đề cập.Tùy chọn cho việc cào web - Phiên bản C++ chỉ

+0

được chuyển đổi HTML sang XML đầu tiên một lựa chọn? không có nhiều trình phân tích cú pháp HTML tốt cho C++ ngoài đó, tuy nhiên, có XML. –

Trả lời

34
  • libcurl để tải về các tập tin html
  • libtidy chuyển đổi sang xml hợp lệ
  • libxml để phân tích/điều hướng xml
+1

liên kết thứ hai của bạn có lẽ nên truy cập http://tidy.sourceforge.net/? –

+0

+1 Chính xác những gì tôi đang tìm kiếm, tôi đã sử dụng curl rất nhiều từ cli nhưng tôi không bao giờ nghĩ đến việc sử dụng nó như một thư viện :) – rflood89

1
// download winhttpclient.h 
// -------------------------------- 
#include <winhttp\WinHttpClient.h> 
using namespace std; 
typedef unsigned char byte; 
#define foreach   BOOST_FOREACH 
#define reverse_foreach BOOST_REVERSE_FOREACH 

bool substrexvealue(const std::wstring& html,const std::string& tg1,const std::string& tg2,std::string& value, long& next) { 
    long p1,p2; 
    std::wstring wtmp; 
    std::wstring wtg1(tg1.begin(),tg1.end()); 
    std::wstring wtg2(tg2.begin(),tg2.end()); 

    p1=html.find(wtg1,next); 
    if(p1!=std::wstring::npos) { 
     p2=html.find(wtg2,next); 
     if(p2!=std::wstring::npos) { 
      p1+=wtg1.size(); 
      wtmp=html.substr(p1,p2-p1-1); 
      value=std::string(wtmp.begin(),wtmp.end()); 
      boost::trim(value); 
      next=p1+1; 
     } 
    } 
    return p1!=std::wstring::npos; 
} 
bool extractvalue(const std::wstring& html,const std::string& tag,std::string& value, long& next) { 
    long p1,p2,p3; 
    std::wstring wtmp; 
    std::wstring wtag(tag.begin(),tag.end()); 

    p1=html.find(wtag,next); 
    if(p1!=std::wstring::npos) { 
     p2=html.find(L">",p1+wtag.size()-1); 
     p3=html.find(L"<",p2+1); 
     wtmp=html.substr(p2+1,p3-p2-1); 
     value=std::string(wtmp.begin(),wtmp.end()); 
     boost::trim(value); 
     next=p1+1; 
    } 
    return p1!=std::wstring::npos; 
} 
bool GetHTML(const std::string& url,std::wstring& header,std::wstring& hmtl) { 
    std::wstring wurl = std::wstring(url.begin(),url.end()); 
    bool ret=false; 
    try { 
     WinHttpClient client(wurl.c_str()); 
     std::string url_protocol=url.substr(0,5); 
     std::transform(url_protocol.begin(), url_protocol.end(), url_protocol.begin(), (int (*)(int))std::toupper); 
     if(url_protocol=="HTTPS") client.SetRequireValidSslCertificates(false); 
     client.SetUserAgent(L"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); 
     if(client.SendHttpRequest()) { 
      header = client.GetResponseHeader(); 
      hmtl = client.GetResponseContent(); 
      ret=true; 
     } 
    }catch(...) { 
     header=L"Error"; 
     hmtl=L""; 
    } 
    return ret; 
} 
int main() { 
    std::string url = "http://www.google.fr"; 
    std::wstring header,html; 
    GetHTML(url,header,html)); 
} 
+5

mã không có lời giải thích là một ý tưởng tồi, bạn có thể giải thích điều này? –

2

Tôi khuyên bạn nên Qt5. 6.2, thư viện mạnh mẽ này tắt er chúng tôi

  1. cấp cao, trực quan, không đồng bộ mạng api như QNetworkAccessManager, QNetworkReply, QNetworkProxy vv
  2. lớp regex mạnh mẽ như QRegularExpression
  3. engine web Decent như QtWebEngine
  4. mạnh mẽ, gui trưởng thành như QWidgets
  5. Hầu hết các api Qt5 đều được thiết kế tốt, tín hiệu và khe làm cho các mã không đồng bộ viết trở nên dễ dàng hơn quá
  6. Hỗ trợ unicode tuyệt vời
  7. Tính năng thư viện hệ thống tệp phong phú. Cho dù tạo, xóa, đổi tên hoặc tìm đường dẫn tiêu chuẩn để lưu tệp là miếng bánh trong Qt5
  8. api không đồng bộ của QNetworkAccessManager giúp dễ dàng sinh ra nhiều yêu cầu tải xuống cùng một lúc
  9. Cross lớn nền tảng máy tính để bàn, windows, mac os và linux , viết một khi được biên dịch ở bất cứ đâu, chỉ một cơ sở mã.
  10. Dễ triển khai trên Windows và Mac (linux? Có lẽ linuxdeployqt có thể cứu chúng ta tấn rắc rối)
  11. Dễ dàng để cài đặt trên Windows, Mac và Linux
  12. Và vân vân

Tôi đã viết một ứng dụng scraper hình ảnh của Qt5, ứng dụng này có thể cạo hầu như mọi hình ảnh được tìm kiếm bởi Google, Bing và Yahoo.

Để biết thêm chi tiết về nó, vui lòng truy cập my github project. Tôi đã viết tổng quan cấp cao về cách xóa dữ liệu theo Qt5 trên blog của tôi (quá dài để đăng lúc tràn ngăn xếp).

+0

Tại sao bạn đề xuất phiên bản 5.6.2 và không phải phiên bản mới nhất (hiện tại là 5.9.0)? –

+0

@PiotrDobrogost Lý do chính là tôi không biết Qt5.9.0 ổn định như thế nào, một lý do khác là Qt5.6.2 hỗ trợ windows xp – StereoMatching

Các vấn đề liên quan