编程语言
首页 > 编程语言> > MinGW通过Socket网页资源下载(C++简单网络爬虫)

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

作者:互联网

需求

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