ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

MinGW通过Socket网页资源下载(C++简单网络爬虫)

2021-03-28 23:57:08  阅读:268  来源: 互联网

标签:Socket C++ 简单网络 tcp saddr sizeof include buf socket


需求

MinGW编程编译工具

#include “winsock2.h”
#pragma comment(lib,“ws2_32.lib”)
这两个是windows上网络访问时C++必需的头文件和库文件

代码

C++的Socket访问网页的机制分得比较细,不像其它编程语言能直接访问,步骤较多。

#include "winsock2.h"  
#include <string>  
#include <iostream>  
#include <fstream> 
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main(void) {
	string url = "www.baidu.com";
    int port = 80;	
	
	//这是启动网络访问功能 
	WSADATA wsa;
	WSAStartup(2, &wsa);	
	
	//1.建立socket,socket是应用层必经网络访问虚拟层 
	int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);


	//2.主网页URl转化下面 sockaddr_in用 
	struct hostent * hp = ::gethostbyname(url.c_str());
	//访问地址 
	struct sockaddr_in saddr;
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(port);
	//赋值 hp->h_addr赋值到 saddr.sin_addr
	memcpy(&saddr.sin_addr, hp->h_addr, 4);
	
	
	//3.电脑上建立好了socket,并且连接上目标地址 saddr 
	connect(tcp_socket, (const struct sockaddr *)&saddr, sizeof(saddr));
	
	//4.请求头,并通过建立好的socket发送request请求头信息,socket前面已经连接上目标url  
	string name="/";
	string request = "GET " + name + " HTTP/1.1\r\nHost:" + url + "\r\nConnection:Close\r\n\r\n";
	send(tcp_socket, request.c_str(), request.size(), 0);
	
	//5. 保存文件声明 
	fstream file;
	file.open("baidu.html", ios::out | ios::binary);
	char buf[1024];
	memset(buf, 0, sizeof(buf));
	
	//6.接收响应的数据并写入前面声明的文件 
	int n = 0;
	n = recv(tcp_socket, buf, sizeof(buf)-sizeof(char), 0);
	char* cpos = strstr(buf, "\r\n\r\n");
	file.write(cpos + strlen("\r\n\r\n"), n - (cpos - buf) - strlen("\r\n\r\n"));
	while ((n = recv(tcp_socket, buf, sizeof(buf)-sizeof(char), 0)) > 0)
	{
			file.write(buf, n);
	}
	
	//7.文件关闭,socket关闭,WSA关闭 
	file.close();
	closesocket(tcp_socket);
	WSACleanup();

	system("pause");
	return 0;
}

请求头字符串的途径和格式

在这里插入图片描述

尾言

这只是一个简单的网页请求,爬虫比较复杂的事情,毕竟反爬虫方法很多,需要进一步研究。这是windows的网页请求,后面新增linux的网页请求。

标签:Socket,C++,简单网络,tcp,saddr,sizeof,include,buf,socket
来源: https://blog.csdn.net/LearnToPain/article/details/115290120

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有