C++爬取网页文本并生成.txt文件

相比较python爬虫,c++的爬虫实现起来要复杂一些,本人查看网上一些资料,对c++爬取网页中的文本数据并将其保存到本地生成的txt文件做一点总结,参考的文章如下:

https://blog.csdn.net/weixin_50964512/article/details/123076248?spm=1001.2014.3001.5506

c++代码如下:

#include<Windows.h>
#include<regex>
#include<iostream>

#include <fstream>
#pragma comment(lib,"Urlmon.lib")
using namespace std;
/// <summary>
/// 从网页中获取指定文本
/// </summary>
/// <param name="url">网页地址</param>
/// <param name="pattern">匹配模式</param>
/// <param name="patternIndex">返回第几个()中的内容</param>
/// <param name="num">返回匹配到的数量</param>
/// <returns>返回的字符串数组</returns>
string* GetTextFromUrlA(const string& url, const string& pattern, int patternIndex, int& num)
{
	HRESULT ret = URLDownloadToFileA(NULL, url.c_str(), ".\\tmp.txt", 0, NULL); //下载网页到tmp.txt文件中
	if (ret != S_OK) { //如果下载失败返回NULL
		return NULL;
	}
	//下载成功,读取文本内容
	FILE* file;
	errno_t err = fopen_s(&file, ".\\tmp.txt", "r");
	if (err != 0) {
		return NULL;
	}
	fseek(file, 0, SEEK_END);
	int nSize = ftell(file);
	fseek(file, 0, SEEK_SET);
	std::string buf;
	buf.resize(nSize + 1);
	fread((char*)buf.c_str(), sizeof(char), nSize, file);
	fclose(file);

	//开始匹配
	regex r(pattern); //初始化匹配模式变量r
	smatch result;	  //保存匹配到的结果result
	string::const_iterator begin = buf.begin(); //获取文本开始的迭代器
	string::const_iterator end = buf.end();		//获取文本结束的迭代器
	int i = 0; //统计可以匹配到的个数
	while (regex_search(begin, end, result, r)) { //匹配成功返回true,继续下一次匹配.失败则退出循环
		i++; //匹配到一个,加一
		begin = result[0].second;  //获取当前匹配到的位置,更新匹配的开始位置
	}
	num = i;
	//知道了有多少个,分配对应内存,重新开始匹配
	begin = buf.begin();
	string* strBuf = new string[i + 1]{};
	int index = 0;
	while (regex_search(begin, end, result, r)) {
		strBuf[index++] = result[patternIndex].str();
		begin = result[0].second;
	}

	//DeleteFileA(".\\tmp.txt"); //匹配完成,可以删除下载的文件了

	return strBuf; //返回匹配到的结果
}

int main() {
	string url; //保存url
	url.resize(1024);

	printf("(输入网址后五位数字)https://celestrak.org/NORAD/elements/gp.php?CATNR=:");
	string urlNumber;
	cin >> urlNumber;
	string u = "https://celestrak.org/NORAD/elements/gp.php?CATNR=" + urlNumber;  //拼接成完整链接

	char U[56];
	strcpy_s(U, u.c_str());  //将网址链接的字符串形式转成数组形式
	
	sprintf_s((char*)url.c_str(), 1024, U, 1); //格式化url
	int nums = 1;
	string* str = GetTextFromUrlA(url.c_str(), "<li><a href=\"(.*?)\"\\s{0,1}title=\"(.*?)\".*?><img src=\"(.*?)\" .*?</li>", 1, nums);

	delete[] str;

	
}

运行结果:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值