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-Alive
	struct 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 
 

喜欢的欢迎关注我的公众号

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++是一种通用的编程语言,可以用于开发各种类型的应用程序,包括网络爬虫网络爬虫是一种自动化程序,用于从互联网上获取数据。下面是一个简单的C++网络爬虫的源码示例: ```cpp #include <iostream> #include <string> #include <curl/curl.h> // 回调函数,用于处理获取到的数据 size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) { size_t totalSize = size * nmemb; output->append((char*)contents, totalSize); return totalSize; } int main() { CURL* curl; CURLcode res; std::string output; // 初始化libcurl curl_global_init(CURL_GLOBAL_DEFAULT); // 创建一个curl句柄 curl = curl_easy_init(); if (curl) { // 设置要爬取的网址 curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com"); // 设置回调函数 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &output); // 执行请求 res = curl_easy_perform(curl); // 检查请求是否成功 if (res != CURLE_OK) { std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl; } else { // 输出获取到的数据 std::cout << output << std::endl; } // 清理curl句柄 curl_easy_cleanup(curl); } // 清理libcurl curl_global_cleanup(); return 0; } ``` 这个示例使用了libcurl库来进行网络请求,并通过回调函数将获取到的数据保存到一个字符串中。你可以根据自己的需求对这个源码进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值