利用acl_master的http库进行聚合数据新闻信息的数据抓取

简介: 利用acl_master的http库进行聚合数据新闻信息的数据抓取

1)acl_master是一个跨平台c/c++库,提供了网络通信库及服务器编程框架,同时提供更多的实用功能库及示例。

下载地址:Github: https://github.com/acl-dev/acl

2)聚合数据新闻API接口注册

聚合数据的新闻API接口其官网有提供,本人采用的是阿里云市场->API市场->生活服务栏下提供的,

*注册阿里云,有需要的阿里云产品通用代金券的可以点击下面链接进行领取:

https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=pfb80n4a

阿里云提供聚合数据的新闻API的类似描述

阿里为women提供了该新闻接口10000条免费使用次数并一年内有效,我们在聚合数据新闻API接口需要用到APPCode,其API使用方式可以点击“新闻头条”进入查看其使用介绍

3)acl http实现聚合数据新闻信息的抓取

先定义了http抓取的一些参数

struct HttpApiArg
{
    int startTime;                //开始抓取信息时间(单位小时)
    int endTime;                //结束抓取信息时间(单位小时)
    std::string addr_;            // web 服务器地址  
    std::string path_;            // 本地请求的数据文件  
    int port_;
    std::vector<std::string> stypes_;            // 请求数据的子数据类型
    //std::string charset_;        // 本地请求数据文件的字符集  
    //std::string to_charset_;    // 将服务器响应数据转为本地字符集
    std::string authorization;    // 访问授权

};

目前聚合数据的新闻访问参数

addr_:toutiao-ali.juheapi.com

path_:/toutiao/index

port_:80

stypes_:可从聚合新闻API使用介绍获知,例如"top"

authorization:其格式“APPCODE ***”,***=注册的AppCode

 

下来展示采用acl http库抓取聚合数据新闻信息的伪代码

#include "acl_cpp/lib_acl.hpp"  

void HttpApiAcl::getHttpInfo()
{

    bool accept_gzip = false, send_body = false;

    //acl::log::stdout_open(true);
    acl::string aclurl, acladdr/*,aclContentType*/;
    aclurl.format("http://%s%s", myArgHttp.addr_.c_str(), myArgHttp.path_.c_str());
    acladdr.format("%s:%d", myArgHttp.addr_.c_str(), myArgHttp.port_);
    //aclContentType.format("application/json; charset=%s", myArgHttp.charset_.c_str());

    acl::http_request req(acladdr);//请求

    acl::http_header& header = req.request_header();//
    //
    //header.set_method(acl::HTTP_METHOD_POST);
    header.set_method(acl::HTTP_METHOD_GET);
    //
    //header.set_keep_alive(true);
    header.set_keep_alive(false);

    header.accept_gzip(accept_gzip ? true : false);

    //url
    header.set_url(aclurl);
    //host
    if (header.get_host() == NULL)
    {
        header.set_host(myArgHttp.addr_.c_str());
        printf(">>>set host: %s\r\n", myArgHttp.addr_.c_str());
    }
    else
        printf(">>>host: %s\r\n", header.get_host());
    
    //content_type
    //header.set_content_type(aclContentType);
    //header.set_content_length(1024);
    //param
    for (unsigned int i = 0; i < myArgHttp.stypes_.size(); i++) {
        header.add_param("type", myArgHttp.stypes_.at(i).c_str());
    }
    //entry
    header.add_entry("Authorization", myArgHttp.authorization.c_str());
    //cookie
    //header.add_cookie("x-cookie-name", "cookie-value");

    bool rc = req.request(NULL, 0);//
    // 只所以将 build_request 放在 req.request 后面,是因为
    // req.request 内部可能会修改请求头中的字段
    acl::string hdr;
    header.build_request(hdr);
    CLogger::createInstance()->Log(eTipMessage, "request header:\r\n%s\r\n", hdr.c_str());

    if (rc == false)
    {
        CLogger::createInstance()->Log(eTipMessage, "send request error\n");
        //break;
        return;
    }

    printf("send request ok\r\n");

    // 取出 HTTP 响应头的 Content-Type 字段  

    const char* p = req.header_value("Content-Type");
    if (p == NULL || *p == 0)
    {
        CLogger::createInstance()->Log(eTipMessage, "no Content-Type");
        return;
    }
    // 分析 HTTP 响应头的数据类型  
    acl::http_ctype content_type;
    content_type.parse(p);

    // 响应头数据类型的子类型  
    const char* stype = content_type.get_stype();

    bool ret;
    if (stype == NULL)
        ret = do_plain(req);
    else if (stricmp(stype, "json") == 0)//linux->strcasecmp
        ret = do_json(req);
    else
        ret = do_plain(req);
    if (ret == true)
        CLogger::createInstance()->Log(eTipMessage, "read ok!\r\n");

}

// 处理 text/plain 类型数据  
bool HttpApiAcl::do_plain(acl::http_request& req)
{
    acl::string body;
    if (req.get_body(body/*, to_charset_.c_str()*/) == false)
    {
        CLogger::createInstance()->Log(eTipMessage, "get http body error");
        return false;
    }
    printf("body:\r\n(%s)\r\n", body.c_str());
    return true;
}

// 处理 text/json 类型数据  
bool HttpApiAcl::do_json(acl::http_request& req)
{
    acl::json body;
    if (req.get_body(body/*, to_charset_.c_str()*/) == false)
    {
        CLogger::createInstance()->Log(eTipMessage, "get http body error");
        return false;
    }
    //add to cache
    std::vector<std::string> initdata;
    m_MutexNewsData.Lock();
    std::swap(initdata, this->newsData);
    m_MutexNewsData.Unlock();
    curIndex = 0;
    acl::json_node* node = body.first_node();
    while (node)
    {
        if (node->tag_name())
        {
            std::string tagStr = std::string(node->tag_name());
            std::string valStr = std::string(node->get_text());
            valStr = UTF_82ASCII(valStr);//转换ASCII格式,方便显示输出
            if ("title" == tagStr) {//标题
                m_MutexNewsData.Lock();
                newsData.push_back(valStr);
                m_MutexNewsData.Unlock();
                printf("tag: %s", node->tag_name());
                if (!valStr.empty())
                    printf(", value: %s\r\n", valStr.c_str());
                else
                    printf("\r\n");
            }
        }
        node = body.next_node();
    }
    return true;
}

运行效果链接信息可参考聚合数据新闻API使用介绍页面的调试工具进行细节求证,下面给出我获取“top”新闻的标题信息输出显示

 

 

 

 

目录
相关文章
|
11天前
|
存储 JSON Rust
【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest
【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest
358 0
|
11天前
|
Web App开发 存储 缓存
三、《图解HTTP》- 报文内的 HTTP信息
三、《图解HTTP》- 报文内的 HTTP信息
46 0
|
11天前
|
存储 网络协议 Go
7天玩转 Golang 标准库之 http/net
7天玩转 Golang 标准库之 http/net
14 2
|
11天前
|
JSON 数据格式 Python
Python 的 requests 库是一个强大的 HTTP 客户端库,用于发送各种类型的 HTTP 请求
【5月更文挑战第9天】`requests` 库是 Python 中用于HTTP请求的强大工具。要开始使用,需通过 `pip install requests` 进行安装。发送GET请求可使用 `requests.get(url)`,而POST请求则需结合 `json.dumps(data)` 以JSON格式发送数据。PUT和DELETE请求类似,分别调用 `requests.put()` 和 `requests.delete()`。
36 2
|
11天前
|
存储 数据采集 运维
DataWorks产品使用合集之DataWorks创建HTTP触发器节点背景信息的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
32 0
|
11天前
|
中间件 Go API
Golang深入浅出之-Go语言标准库net/http:构建Web服务器
【4月更文挑战第25天】Go语言的`net/http`包是构建高性能Web服务器的核心,提供创建服务器和发起请求的功能。本文讨论了使用中的常见问题和解决方案,包括:使用第三方路由库改进路由设计、引入中间件处理通用逻辑、设置合适的超时和连接管理以防止资源泄露。通过基础服务器和中间件的代码示例,展示了如何有效运用`net/http`包。掌握这些最佳实践,有助于开发出高效、易维护的Web服务。
32 1
|
11天前
|
JSON 测试技术 API
Python的Api自动化测试使用HTTP客户端库发送请求
【4月更文挑战第18天】在Python中进行HTTP请求和API自动化测试有多个库可选:1) `requests`是最流行的选择,支持多种请求方法和内置JSON解析;2) `http.client`是标准库的一部分,适合需要低级别控制的用户;3) `urllib`提供URL操作,适用于复杂请求;4) `httpx`拥有类似`requests`的API,提供现代特性和异步支持。根据具体需求选择,如多数情况`requests`已足够。
20 3
|
11天前
|
数据采集 监控 前端开发
使用Python打造爬虫程序之入门探秘:掌握HTTP请求,开启你的数据抓取之旅
【4月更文挑战第19天】本文介绍了爬虫技术的基本概念和用途,阐述了HTTP协议的重要性。在Python中,借助requests库可轻松发送HTTP请求,如GET和POST。文章还展示了如何设置请求头、处理cookies和session。通过学习这些基础知识,读者将能够开始网络数据抓取,为进一步的数据分析奠定基础。后续文章将探讨HTML解析、动态内容处理及反爬虫策略。
|
11天前
|
数据采集 存储 数据安全/隐私保护
拓展网络技能:利用lua-http库下载www.linkedin.com信息的方法
本文介绍如何使用Lua和lua-http库抓取LinkedIn信息,强调了Lua在爬虫开发中的应用。通过配置亿牛云爬虫代理解决IP封锁问题,实现步骤包括安装库、配置代理、发送HTTP请求、解析响应及提取信息。提供的Lua代码示例展示了下载和存储LinkedIn信息的过程。实验成功展示了Lua爬虫的可行性,但也指出需考虑反爬虫策略以应对实际挑战。
拓展网络技能:利用lua-http库下载www.linkedin.com信息的方法
|
11天前
|
安全 网络安全 开发工具
对象存储oss使用问题之flutter使用http库进行post请求文件上传返回400如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
56 1