网页抓取选项 - 仅限 C++ 版本

Posted

技术标签:

【中文标题】网页抓取选项 - 仅限 C++ 版本【英文标题】:Options for web scraping - C++ version only 【发布时间】:2010-10-24 12:02:05 【问题描述】:

我正在寻找一个用于网页抓取的优秀 C++ 库。 它必须是 C/C++ 和 什么都没有,所以请不要将我引导至 Options for html scraping 或其他未提及 C++ 的 SO 问题/答案。

【问题讨论】:

是否可以先将 HTML 转换为 XML?那里没有很多好的 C++ 的 HTML 解析器,但是有用于 XML 的。 【参考方案1】: libcurl 下载 html 文件 libtidy 转换为有效的 xml libxml 解析/导航 xml

【讨论】:

+1 正是我想要的,我在 cli 中经常使用 curl,但我从未想过将其用作库 :) 您可以跳过第 2 步,因为 libxml 能够处理 HTML。 @el.pescado 根据this issue,libxml 似乎不支持 HTML5,只支持 HTML4,所以您可能仍然需要将其转换为 xml【参考方案2】:

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

【讨论】:

【参考方案3】:

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

    高级、直观、异步网络 API,例如 QNetworkAccessManager、QNetworkReply、QNetworkProxy 等 QRegularExpression 等强大的正则表达式类 像 QtWebEngine 这样不错的 Web 引擎 像 QWidgets 一样强大、成熟的 gui 大部分 Qt5 api 都经过精心设计,signal 和 slot 也让编写异步代码变得更加容易 出色的 unicode 支持 功能丰富的文件系统库。无论是创建、删除、重命名还是查找保存文件的标准路径在 Qt5 中都是小菜一碟 QNetworkAccessManager 的异步 api 使得一次产生多个下载请求变得容易 跨主要桌面平台、windows、mac os 和 linux,一次编写,随处编译,一个代码库。 易于在 windows 和 mac 上部署(linux?也许 linuxdeployqt 可以为我们省去很多麻烦) 易于安装在 windows、mac 和 linux 上 等等

我已经用 Qt5 写了一个图像抓取应用程序,这个应用程序可以抓取几乎所有被谷歌、必应和雅虎搜索到的图像。

如需了解更多详情,请访问my github project。 我写了关于如何通过 Qt5 抓取数据的高级概述 我的博客(在堆栈溢出时发布太长)。

Download Bing images by Qt5

Create a better images downloader(Google, Bing and Yahoo) by Qt5

【讨论】:

为什么推荐5.6.2版本而不是最新版本(目前是5.9.0)? @PiotrDobrogost 主要原因是我不知道Qt5.9.0有多稳定,另一个原因是Qt5.6.2支持windows xp 您好,目前我正在使用 C++,但据我所知,Qt 只完成了一半的工作,您仍然需要一个体面且宽容的 Html 解析器(假设我们不想加载每个页面在qwebengineview 并使用javascript引擎来抓取网页)。无论如何,当您需要在 GUI 中显示抓取的数据时,这个答案特别值得一票。【参考方案4】:
// 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));

【讨论】:

没有解释的代码是个坏主意,你能解释一下吗?

以上是关于网页抓取选项 - 仅限 C++ 版本的主要内容,如果未能解决你的问题,请参考以下文章

Java网页抓取技术HtmlUnit

phpCURL抓取网页内容

爬虫--1

[python 2.7抓取网页]如何抓取.js里面的内容(下拉框里面的中文字符列表)

如何用python 爬虫抓取金融数据

请教网页里的特定数据怎么抓取?