网页抓取选项-C++;仅版本 我正在寻找一个很好的用于Web擦除的C++库。 它 >为C/C++, > < >请不要直接向我或其他问题/答案提出,这里甚至没有提到C++。 下载html文件 转换为有效的xml 解析/浏览xml //下载winhttpclient.h // -------------------------------- #包括 使用名称空间std; typedef无符号字符字节; #定义foreach BOOST\u foreach #定义反向\u foreach增压\u反向\u foreach bool substrexvealue(const std::wstring&html、const std::string&tg1、const std::string&tg2、std::string&value、long&next){ 长p1,p2; std::wstring wtmp; std::wstring wtg1(tg1.begin(),tg1.end()); std::wstring wtg2(tg2.begin(),tg2.end()); p1=html.find(wtg1,下一步); if(p1!=std::wstring::npos){ p2=html.find(wtg2,下一步); if(p2!=std::wstring::npos){ p1+=wtg1.size(); wtmp=html.substr(p1,p2-p1-1); value=std::string(wtmp.begin(),wtmp.end()); boost::trim(值); next=p1+1; } } 返回p1!=std::wstring::npos; } bool extractvalue(const std::wstring&html、const std::string&tag、std::string&value、long&next){ 长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“

网页抓取选项-C++;仅版本 我正在寻找一个很好的用于Web擦除的C++库。 它 >为C/C++, > < >请不要直接向我或其他问题/答案提出,这里甚至没有提到C++。 下载html文件 转换为有效的xml 解析/浏览xml //下载winhttpclient.h // -------------------------------- #包括 使用名称空间std; typedef无符号字符字节; #定义foreach BOOST\u foreach #定义反向\u foreach增压\u反向\u foreach bool substrexvealue(const std::wstring&html、const std::string&tg1、const std::string&tg2、std::string&value、long&next){ 长p1,p2; std::wstring wtmp; std::wstring wtg1(tg1.begin(),tg1.end()); std::wstring wtg2(tg2.begin(),tg2.end()); p1=html.find(wtg1,下一步); if(p1!=std::wstring::npos){ p2=html.find(wtg2,下一步); if(p2!=std::wstring::npos){ p1+=wtg1.size(); wtmp=html.substr(p1,p2-p1-1); value=std::string(wtmp.begin(),wtmp.end()); boost::trim(值); next=p1+1; } } 返回p1!=std::wstring::npos; } bool extractvalue(const std::wstring&html、const std::string&tag、std::string&value、long&next){ 长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“,c++,screen-scraping,C++,Screen Scraping,我推荐Qt5.6.2,这个强大的库为我们提供了 高级、直观、异步的网络api,如QNetworkAccessManager、QNetworkReply、QNetworkProxy等 强大的正则表达式类,如QRegularExpression 像QtWebEngine这样体面的web引擎 健壮、成熟的gui类QWidgets 大多数QT5API都设计得很好,信号和插槽使编写异步代码变得更加容易 非常好的unicode支持 功能丰富的文件系统库。创建、删除、重命名或查找保存文件的标准路径在Qt5中都

我推荐Qt5.6.2,这个强大的库为我们提供了

  • 高级、直观、异步的网络api,如QNetworkAccessManager、QNetworkReply、QNetworkProxy等
  • 强大的正则表达式类,如QRegularExpression
  • 像QtWebEngine这样体面的web引擎
  • 健壮、成熟的gui类QWidgets
  • 大多数QT5API都设计得很好,信号和插槽使编写异步代码变得更加容易
  • 非常好的unicode支持
  • 功能丰富的文件系统库。创建、删除、重命名或查找保存文件的标准路径在Qt5中都是小菜一碟
  • QNetworkAccessManager的异步api使一次生成多个下载请求变得容易
  • 跨主要桌面平台,windows、mac os和linux,在任何地方编写一次编译,只需一个代码库
  • 易于在windows和mac上部署(linux?也许linuxdeployqt可以为我们节省大量麻烦)
  • 易于在windows、mac和linux上安装
  • 等等
  • 我已经在Qt5写了一个图像刮刀应用程序,这个应用程序可以刮刀谷歌、必应和雅虎搜索到的几乎所有图像

    欲了解更多详情,请访问。 我写下了关于如何在Qt5上抓取数据的高级概述 我的博客(太长,无法在堆栈溢出时发布)


    使用myhtml C/C++解析器;非常简单,速度非常快。除了C99之外没有依赖项。并且内置了CSS选择器(示例)

    首先将HTML转换成XML?一个选项?C++中没有很多优秀的HTML解析器,但是对于XML来说,1正是我所要寻找的,我已经使用了CLI大量的CURL,但是我从来没有想过把它用作一个库:您可以跳过步骤2,因为libxml能够处理HTML。@el.pescado根据,libxml似乎不支持HTML5,只支持HTML4,因此您可能仍然需要将其转换为xmlcode而不进行解释是个坏主意,您能解释一下吗?为什么推荐版本5.6.2而不是最新版本(目前是5.9.0)主要原因是我不知道Qt5.5.0是多么稳定,另一个原因是Qt5.5.2支持Windows XPHI,目前我的知识在C++中被润湿了,但是我的知识QT只做了一半的工作,你仍然需要一个体面的、宽容的HTML解析器。(假设我们不想在
    qwebengineview
    中加载每个页面,并使用javascript引擎对该页面进行scrpae)。无论如何,当您需要在GUI中显示刮取的数据时,这个回答值得一次投票。
    // 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));
    }