VS实现一个爬虫程序<c++>获取网页源代码

news2024/11/27 10:20:41

目的:写一个爬虫程序,可以进入http开头的网页,将网页的源代码显示出来.

结果展示:

思路:

1.解析网址

2.连接服务器->发请求

3.接收源代码并存储起来

函数:

1.解析网址函数:

http://......./......

//....../之间的字符我们将其存储到urlAddr[]当中

/......之后的字符我们将其存储到urlPath[]当中

//存放网址
char urlAddr[256];
//存放网址后面的路径
char urlPath[256];
//解析网址
void analysisAddr(char* str)
{
	//每次解析之前先把数组清空
	memset(urlAddr,0,256);
	memset(urlPath,0, 256);
	//找str字符串当中的 "http://" 如果找到则输出"http://"地址给了*p
	char* p = strstr(str, "http://");
	if (p == NULL)
	{
		return;
	}
	p += 7;
	//scanf 从cmd输入  sscanf 从第一个参数输入
	sscanf(p, "%[^/]%s", urlAddr,urlPath);

	printf("网站:%s\n",urlAddr);
	printf("网站后面:%s\n", urlPath);

}

strstr(str,"http://");的含义在于,先找到str字符串当中"http://"的位置

如果str字符串当中不存在"http://"字符 则返回

否则+7,因为"http://"是7个字符

sscanf从p当前的第一个参数输入,urlAddr字符串的内容一直从p的开端到"/"字符

urlPath字符串的内容是从/之后

然后将两个字符串打印在窗口上.

2.连接服务器->发请求

void connectAddr(char* urlAddr) 
{
	//设置网络协议版本
	//选中按下f12可以看这个函数的内容
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2,2),&wsaData);

	//创建socket
	s_socket = socket(AF_INET, SOCK_STREAM, NULL);

	//绑定
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;

	int r = bind(s_socket, (sockaddr*)&addr, sizeof addr);
	if (r == -1)
	{
		printf("绑定失败!\n");
		return;
	}
	printf("绑定成功!\n");

	//获取主机的IP地址
	//从字符串变成一个IP地址

	struct hostent* p = gethostbyname(urlAddr);

	if (NULL == p)
	{
		printf("获取主机地址失败!\n");
		return;
	}
	printf("获取主机地址成功!\n");
	//把服务器的协议地址zu设置好
	memcpy(&addr.sin_addr, p->h_addr, 4);
	addr.sin_port = htons(80);

	//连接主机 
	r = connect(s_socket,(sockaddr*)&addr, sizeof addr);
	if (-1 == r)
	{
		printf("连接服务器失败!\n");
	}
	printf("连接服务器成功!\n");
	//发请求
	string reqInfo = "GET " + (string)urlPath + "HTTP/1.1\r\nhost:"+
		(string)urlAddr + "\r\nConnection:Close\r\n\r\n";
	r = send(s_socket, reqInfo.c_str(), reqInfo.size(), NULL);
	if (r <= 0)
	{
		printf("发送失败!\n");
		return;
	}
	printf("发送请求到服务器成功!\n");
}

3.接收源代码并存储起来

//接收源代码并存储起
void getHtml()
{
	string allHtml;//存放网页源代码的字符串
	int r;
	char buff[1024];
	while (1)
	{
		//从服务器接收数据并放到buff里
		r = recv(s_socket, buff, 1023, NULL);
		if (r > 0)
		{
			buff[r] = 0;//添加结束符号
			allHtml += buff;
		}
		else//没有接到
		{
			break;
		}
	}
	printf("------------------我们获得的网页源代码如下--------------------");
	cout << allHtml << endl;

}

 可以将上面三个函数封装在一个函数当中

//爬
void snapJpg(char* begAddr)\
{
	//解析网址 -> http:// -> pic.yesky.com 网络的IP地址别名  网站的地址和二级地址<二级地址也就是路径>
	analysisAddr(begAddr);

	//连接服务器
	//发请求
	connectAddr(urlAddr);

	//接收源代码并存储起
	getHtml();

}

 主函数:

int main()
{
	char buff[256] = { 0 };//安放网页链接
	printf("请输入一个网页链接:");
	scanf("%s",buff);

	snapJpg(buff);
	while (1);
	return 0;
}

 总代码:


#include<graphics.h>
#include<cstdio>
#include<stdio.h>
#include<cstring>
#include<stdlib.h>


#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include<windows.h>

#include<iostream>
#include<string.h>
using namespace std;

#pragma warning(disable:4996)//忽略4996错误提示

//服务器套接字
SOCKET s_socket;
//存放网址
char urlAddr[256];
//存放网址后面的路径
char urlPath[256];

//连接服务器
//发请求
void connectAddr(char* urlAddr);

//接收源代码并存储起
void getHtml();


//解析网址
void analysisAddr(char*str);
//封装一个爬图片的函数
void snapJpg(char* begAddr);

int main()
{
	char buff[256] = { 0 };//安放网页链接
	printf("请输入一个网页链接:");
	scanf("%s",buff);

	snapJpg(buff);
	while (1);
	return 0;
}
//爬图片
void snapJpg(char* begAddr)\
{
	//解析网址 -> http:// -> pic.yesky.com 网络的IP地址别名  网站的地址和二级地址<二级地址也就是路径>
	analysisAddr(begAddr);

	//连接服务器
	//发请求
	connectAddr(urlAddr);

	//接收源代码并存储起
	getHtml();


}
//解析网址
void analysisAddr(char* str)
{
	//每次解析之前先把数组清空
	memset(urlAddr,0,256);
	memset(urlPath,0, 256);
	//找str字符串当中的 "http://" 如果找到则输出"http://"地址给了*p
	char* p = strstr(str, "http://");
	if (p == NULL)
	{
		return;
	}
	p += 7;
	//scanf 从cmd输入  sscanf 从第一个参数输入
	sscanf(p, "%[^/]%s", urlAddr,urlPath);

	printf("网站:%s\n",urlAddr);
	printf("网站后面:%s\n", urlPath);

}

//连接服务器
void connectAddr(char* urlAddr) 
{
	//设置网络协议版本
	//选中按下f12可以看这个函数的内容
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2,2),&wsaData);

	//创建socket
	s_socket = socket(AF_INET, SOCK_STREAM, NULL);

	//绑定
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;

	int r = bind(s_socket, (sockaddr*)&addr, sizeof addr);
	if (r == -1)
	{
		printf("绑定失败!\n");
		return;
	}
	printf("绑定成功!\n");

	//获取主机的IP地址
	//从字符串变成一个IP地址

	struct hostent* p = gethostbyname(urlAddr);

	if (NULL == p)
	{
		printf("获取主机地址失败!\n");
		return;
	}
	printf("获取主机地址成功!\n");
	//把服务器的协议地址zu设置好
	memcpy(&addr.sin_addr, p->h_addr, 4);
	addr.sin_port = htons(80);

	//连接主机 
	r = connect(s_socket,(sockaddr*)&addr, sizeof addr);
	if (-1 == r)
	{
		printf("连接服务器失败!\n");
	}
	printf("连接服务器成功!\n");
	//发请求
	string reqInfo = "GET " + (string)urlPath + "HTTP/1.1\r\nhost:"+
		(string)urlAddr + "\r\nConnection:Close\r\n\r\n";
	r = send(s_socket, reqInfo.c_str(), reqInfo.size(), NULL);
	if (r <= 0)
	{
		printf("发送失败!\n");
		return;
	}
	printf("发送请求到服务器成功!\n");
}


//接收源代码并存储起
void getHtml()
{
	string allHtml;//存放网页源代码的字符串
	int r;
	char buff[1024];
	while (1)
	{
		//从服务器接收数据并放到buff里
		r = recv(s_socket, buff, 1023, NULL);
		if (r > 0)
		{
			buff[r] = 0;//添加结束符号
			allHtml += buff;
		}
		else//没有接到
		{
			break;
		}
	}
	printf("------------------我们获得的网页源代码如下--------------------");
	cout << allHtml << endl;

}

爬虫 :
限制:http网页服务器
主要知识点:http协议  广度优先遍历算法   stl之map,vector,queue    正则表达式  文件操作
思路:  http://.....进入网站页面
获取这个网页的源代码
 

注意:
搜索http://pic.yesky.com/     会导致403 Forbidden
403 Forbidden错误一般在爬虫采集数据时出现的频率比较多,在爬虫使用代理IP的时候因为不停地访问服务器终端,频发请求时,服务器终端压力过大,触发了反爬虫机制,导致服务器会拒绝这个IP的访问请求,这个时候如果不切换掉被禁用的IP地址,肯定会影响正常的数据采集效率,所以就需要设置时间来定时切换IP地址。IP代理最核心的功能,就是可以更换各个城市不同的IP地址,而且可以隐藏本地的真实IP地址。

分析爬虫全代码:

引用博客:

C/C++实现最简单的爬虫_Mason_Zhao的博客-CSDN博客_c++实现爬虫

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS7安装Docker

1. 确定是CentOS8及其以上版本 $cat /etc/redhat-release 2. 卸载旧版本 $sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 3. yum安装gcc相关 $yum -y install g…

自动化部署npm安装sass是报错,往往是node版本太高导致的

本想尝试一下github的自动化部署&#xff0c;将一个vue项目部署到github pages上面&#xff0c;结果报错&#xff1a; 报错&#xff1a; npm ERR! code 1 50npm ERR! path /home/runner/work/CvReport/CvReport/node_modules/node-sass 51npm ERR! command failed 52npm ERR!…

感性认识:计算机基本工作原理

一. 计算机发展史概述 1946年2月14日&#xff0c;在美国宾夕法尼亚大学&#xff0c;众所周知的世界上第一台电子数字计算机ENIAC诞生。然而&#xff0c;英国在二战期间研制的电子计算机Colossus(巨人)却要比ENIAC早两年&#xff0c;多年来&#xff0c;英国人对自己研制首台电脑…

运筹说 第85期 | 只有初中学历的数学家

有学者形容华罗庚是在中国现代数学洪荒之地中抱定“战士死在沙场幸甚”的开拓者。这一句话足以肯定华罗庚教授在我国数学领域重要地位&#xff0c;下面我们就来一起领略伟人的风采。 &#xff08;华罗庚&#xff0c;1910年11月12日-1985年6月12日&#xff09; 华罗庚&#xff0…

预尝试4个小时入门Vue

目录 Vue简介 ​编辑 第一个vue程序 el挂载点 data数据对象 Vue指令 v-text和v-html v-on v-show v-if v-bind v-for v-model 记事本案例 axios网络请求库 1、安装 2、使用&#xff0c;作一个音乐播放器 均来自黑马教程。 Vue简介 第一个vue程序 <!DOCTYP…

用 Python 编写的 Python 解释器,你会吗?

计算机只能理解机器码。归根结底&#xff0c;编程语言只是一串文字&#xff0c;目的是为了让人类更容易编写他们想让计算机做的事情。真正的魔法是由编译器和解释器完成&#xff0c;它们弥合了两者之间的差距。解释器逐行读取代码并将其转换为机器码。 在本文中&#xff0c;我…

java计算机毕业设计基于安卓Android的儿童疫苗接种管理App

项目介绍 本文讲述了儿童疫苗管理App的设计与实现。结合电子管理系统的特点,分析了儿童疫苗管理App的现状,给出了儿童疫苗管理App实现的设计方案。 本论文主要完成不同用户的权限划分,不同用户具有不同权限的操作功能,在客户端,主要有管理员、医生和用户三个角色可以登录,用户…

【react】JSX基本语法

1、全称 JavaScript XML 2、定义 是react定义的一种类似于XML的JS扩展语法: JS XML本质是React.createElement(component, props, …children)方法的语法糖 3、作用: 用来简化创建虚拟DOM 4、标签名任意 HTML标签或其它标签 5、标签属性任意 HTML标签属性或其它 6、基本语法规…

Python 缩进语法的起源:上世纪 60-70 年代的大胆创意!

上个月&#xff0c;Python 之父 Guido van Rossum 在推特上转发了一篇文章《The Origins of Python》&#xff0c;引起了我的强烈兴趣。 众所周知&#xff0c;Guido 在 1989 年圣诞节期间开始创造 Python&#xff0c;当时他就职于荷兰数学和计算机科学研究学会&#xff08;简称…

SAP ABAP CDS view 里 INNER JOIN 和 Association 的区别

最近有朋友在我的知识星球里向我提问&#xff0c;SAP ABAP CDS view 的 INNER JOIN 和 Association 的功能可以理解为一样吗&#xff1f; (关于加入我的知识星球的方式&#xff0c;请移步本文文末) 本文就来聊一聊这个话题。既然 CDS view 里同时支持了 INNER JOIN 和 Assoc…

小伙伴因 unshift 插入数据被批,未曾想到找我诉苦竟梅开二度

背景 事情是这样的&#xff0c;今天小伙伴跟我诉苦&#xff0c;说写的代码被批了&#xff0c;原因是效率太低了&#xff0c;简单问了一下需求&#xff0c;就是将几千条数据倒序插入到数组中&#xff0c;他是通过循环搭配 unshift 实现的&#xff0c;听完我也批了他一顿。 小伙…

ImageNet

标题有点不太对是的 就能用了 这次是说 用有噪声的学生网络进行自我训练提高ImageNet分类 近年来&#xff0c;深度学习在图像识别方面取得了显著的成功。然而&#xff0c;最先进的视觉模型仍然是用监督学习来训练的&#xff0c;这就需要大量的标记图像才能很好地工作。 通过只…

监控易火星版纳管IPv6:IP地址管理V2.0的进化之路

IPv6的使用&#xff0c;不仅能解决网络地址资源数量的问题&#xff0c;而且也解决了多种接入设备连入互联网的障碍。大量IP地址的接入&#xff0c;导致运维人员不得不投入大量精力来解决IP管理分散、非法接入、IP地址错误、IP地址冲突等导致的问题。随之而来的&#xff0c;IP地…

java计算机毕业设计基于安卓Android的校园助手APP

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把校园助手与现在网络相结合,利用java技术建设校园助手APP,实现校园助手的信息化。则对于进一步提高校园助手发展,丰富校园助手经验能起到不少的促进作用。 校园助手APP能够通过互联网得到广泛的、全面的宣传,让尽可能多的…

Metal每日分享,图像单色滤镜效果

本案例的目的是理解如何用Metal实现图像单色效果滤镜&#xff0c;将图像转换为单色版本&#xff0c;根据每个像素的亮度进行着色&#xff1b; Demo HarbethDemo地址 实操代码 // 去雾效果滤镜 let filter C7Monochrome.init(intensity: 0.83, color: .blue)// 方案1: Image…

Zookeeper[1]-Zookeeper介绍与安装以及集群环境准备

Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台 课程内容的介绍 Zookeeper的介绍和安装 Zookeeper客户端使用…

基于Paddle2.4.0训练报错Debug

基于Paddle2.4.0训练报错Debug一、环境简介二、Debug过程错误一Debug错误二Debug错误三Debug更换PaddlePaddle版本三、总结参考文档一、环境简介 本文背景为使用AutoDL网站的租借显卡进行网络训练&#xff0c;训练环境如下&#xff1a; 操作系统&#xff1a;Ubuntu18.04&#…

Springboot内置的工具类之StringUtils

在实际的业务开发中&#xff0c;除了经常有针对对象的判断或操作以外&#xff0c;经常也会遇到的就是字符串的判断和操作。比如判断字符串是否为空、是否以某个字符结尾、去除头部和尾部的空白字符、字符的查找和替换。在Spring的核心包中存在这样一个类org.springframework.ut…

如何保证项目如期上线,测试工程师应该怎么做?

要保证项目按照正常进度发布&#xff0c;需要整个研发团队齐心协力。 有很多原因都可能会造成项目延期。1、产品经理频繁修改需求2、开发团队存在技术难题3、测试团队测不完今天我想跟大家聊一下&#xff0c;测试团队如何保证项目按期上线&#xff0c;以及在这个过程中可能遇到…

[附源码]Python计算机毕业设计SSM基于Web课堂签到管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…