c\c++写网络爬虫,curl+gumbo配合使用
是的,你没有听错。就是用c++或者说c语言写爬虫。
其实不难,虽然没有Python写起来那么简单。但是也不是那么复杂啦,毕竟好多大佬都写了那么多库,我们只要会用大佬写的库就行。
网址:https://acm.sjtu.edu.cn/OnlineJudge/status
我们就爬取这个页面的评审状态的所有内容。
代码如下:
#include <iostream>
#include <fstream>
#include "gumbo/Document.h"
#include "gumbo/Node.h"
#include "MyStringFormat.h"
#include "curl/curl.h"using namespace std;#define URL_REFERER "https://acm.sjtu.edu.cn/OnlineJudge/"void printFunc(string page)
{CDocument doc;doc.parse(page.c_str());CSelection c = doc.find("#status tr");for (int i = 0; i < c.nodeNum(); i++){for (int j = 0; j < c.nodeAt(i).childNum(); j++){CNode nd = c.nodeAt(i).childAt(j);cout << MyStringFormat::UTF_82ASCII(nd.text()).c_str() << " ";}cout << endl;}
}static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
{string* str = dynamic_cast<string*>((string *)lpVoid);if (NULL == str || NULL == buffer){return -1;}char* pData = (char*)buffer;str->append(pData, size * nmemb);return nmemb;
}bool HttpRequest(const char* url,string& strResponse,bool get/* = true*/,const char* headers/* = NULL*/,const char* postdata/* = NULL*/,bool bReserveHeaders/* = false*/,int timeout/* = 10*/)
{CURLcode res;CURL* curl = curl_easy_init();if (NULL == curl){return false;}curl_easy_setopt(curl, CURLOPT_URL, url);//响应结果中保留头部信息if (bReserveHeaders)curl_easy_setopt(curl, CURLOPT_HEADER, 1);curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);//设定为不验证证书和HOST//curl_easy_setopt(curl, CURLOPT_PROXY, "127.0.0.1:8888");//设置代理//curl_easy_setopt(curl, CURLOPT_PROXYPORT, 9999); //代理服务器端口curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);//设置超时时间curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout);curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout);curl_easy_setopt(curl, CURLOPT_REFERER, URL_REFERER);curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36");//不设置接收的编码格式或者设置为空,libcurl会自动解压压缩的格式,如gzip//curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "gzip, deflate, br");//设置hostConnection: Keep-Alivestruct curl_slist *chunk = NULL;chunk = curl_slist_append(chunk, "Host: acm.sjtu.edu.cn");chunk = curl_slist_append(chunk, "Connection: Keep-Alive");curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);//添加自定义头信息if (headers != NULL){chunk = curl_slist_append(chunk, headers);curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);}if (!get && postdata != NULL){curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata);}res = curl_easy_perform(curl);bool bError = false;if (res == CURLE_OK){int code;res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);if (code != 200 && code != 302){bError = true;}}else{bError = true;}curl_easy_cleanup(curl);return !bError;
}int main(int argc, char * argv[])
{string response;HttpRequest("https://acm.sjtu.edu.cn/OnlineJudge/status", response, true, NULL, NULL, false, 10);printFunc(response);system("pause");return 0;
}
我知道,我贴出这些代码,也没法运行,所以我把工程文件也发出来。为了不被大家说我骗积分,我的所有东西都贴出百度云链接。
链接:https://pan.baidu.com/s/1jBZ-6tT-4ne0uTMw4jFvKA
提取码:pmg6
喜欢的欢迎关注我的公众号
c\c++写网络爬虫,curl+gumbo配合使用相关推荐
- 网页爬虫python代码_《用python写网络爬虫》完整版+源码
原标题:<用python写网络爬虫>完整版+源码 <用python写网络爬虫>完整版+附书源码 本书讲解了如何使用Python来编写网络爬虫程序,内容包括网络爬虫简介,从页面中 ...
- 《用Python写网络爬虫》——1.5 本章小结
本节书摘来自异步社区<用Python写网络爬虫>一书中的第1章,第1.5节,作者 [澳]Richard Lawson(理查德 劳森),李斌 译,更多章节内容可以访问云栖社区"异步 ...
- 用Python写网络爬虫pdf
下载地址:网盘下载 作为一种便捷地收集网上信息并从中抽取出可用信息的方式,网络爬虫技术变得越来越有用.使用Python这样的简单编程语言,你可以使用少量编程技能就可以爬取复杂的网站. <用Pyt ...
- 用python写网络爬虫 第2版 pd_用Python写网络爬虫(第2版)
用Python写网络爬虫(第2版)电子书 畅销的Python网络爬虫发实战图书全新升级版,上一版年销量近40000册. 针对Python 3.6版本编写. 提供示例完整源码和实例网站搭建源码,确保用户 ...
- 网络爬虫python的特点有哪些_为什么写网络爬虫天然就是择Python而用
关于这个问题,老猿就先从自己的经历讲起吧.很多年前,大约11年前,老猿我接手了一个搜索引擎的网络爬虫,那是一个用C++写的通用搜索引擎的爬虫.C++的语言,多线程的实现,爬虫的运行效率非常高.但是,找 ...
- python爬取微博恶评_详解用python写网络爬虫-爬取新浪微博评论
新浪微博需要登录才能爬取,这里使用m.weibo.cn这个移动端网站即可实现简化操作,用这个访问可以直接得到的微博id. 分析新浪微博的评论获取方式得知,其采用动态加载.所以使用json模块解析jso ...
- 《用Python写网络爬虫第2版》PDF中英文+代码分析
互联网包含了迄今为止最有用的数据集,并且大部分可以免费公开访问.但是,这些数据难以复用.它们被嵌入在网站的结构和样式当中,需要抽取出来才能使用.从网页中抽取数据的过程又称为网络爬虫,随着越来越多的信息 ...
- 用Python写网络爬虫:推荐这本书看看。
<用Python写网络爬虫>讲解了如何使用Python来编写网络爬虫程序,内容包括网络爬虫简介,从页面中抓取数据的三种方法,提取缓存中的数据,使用多个线程和进程来进行并发抓取,如何抓取动态 ...
- python网络爬虫网易云音乐_手把手教你写网络爬虫(1):网易云音乐歌单
大家好,<手把手教你写网络爬虫>连载开始了!在笔者的职业生涯中,几乎没有发现像网络爬虫这样的编程实践,可以同时吸引程序员和门外汉的注意.本文由浅入深的把爬虫技术和盘托出,为初学者提供一种轻 ...
- python爬虫教程:Python写网络爬虫的优势和理由
在本篇文章里小编给各位整理了一篇关于选择Python写网络爬虫的优势和理由以及相关代码实例,有兴趣的朋友们阅读下吧. 什么是网络爬虫? 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页 ...
最新文章
- ndk 路径修改 超简单的方法
- 单击“登录”后,用户名和密码显示在地址栏中,不安全
- Direct交换器-编写消费者
- String的常用方法(java)
- Tips--Multisim中压电传感器与电荷源的替代方案
- php 2个时间查询差几天,PHP怎么计算2个日期差
- 来自一个从事单片机工作中遇到的真人真事,单片机从业者可以借鉴
- 【原创】Nginx+PHP-FPM优化技巧总结
- idea 配置maven插件
- oracle按月统计按季度统计,Oracle数据库按月统计(候,旬,月,季,年)
- iOS Extension调试 无法在Xcode上进行调试
- Wav2KWS: Transfer Learning From Speech Representations for Keyword Spotting(2021)
- 查询同名同性学生名单,并统计同名人数
- 1-甲基-3-丁基咪唑四卤化铁([C4mim]FeX4,X=Cl,Br)磁性离子液体
- JS中.foucus()方法给入力框赋上焦点后,将焦点移动到入力值后面
- C++之 system(“pause“); 与 getchar(); 防止控制台闪退
- 网络上游戏制作相关学习站点的网址
- Dusk network 生态图
- Java == equals() hashCoed()的区别
- Could not find action or result No result defined for action