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