Я хочу выполнить поисковый запрос в Google с помощью запроса GET с использованием Winsock в C ++.
В данный момент в ответе есть сценарии и стили, но нет реальных результатов поиска.Конечная цель состоит в том, чтобы иметь возможность получать ссылки на PDF-файлы из Google.
Например, выполните программный поисковый запрос, подобный этому: www.google.com/search?as_q=Computer+Networking&as_filetype=pdf
Это для целей обучения, и я хочу использовать Winsock, а не любые другие библиотеки.
#include "pch.h"
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")
#include <string>
#include <fstream>
#include <iostream>
int error(std::string message);
static int err = 0;
static char buffer[0xFFFFFFF];
int main()
{
std::string url = "www.google.com";
std::string query = "Computer+Networking";
// Store source code response here
std::string source;
WSAData wsaData;
SOCKET Socket = INVALID_SOCKET;
SOCKADDR_IN SockAddr;
struct hostent *host;
std::string GET = "";
GET += "GET /search?as_q=" + query + "&as_filetype=pdf HTTP/1.1\r\n";
GET += "Accept-Encoding: gzip, deflate, br";
GET += "Accept-Language: en-US, en; q=0.9, nb; q=0.1";
GET += "Cache-Control: no-cache";
GET += "Content-Type: text/plain; charset=UTF-8";
GET += "Host: " + url + "\r\n";
GET += "Connection: close\r\n\r\n";
err = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (err)
return error("WSAStartup");
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == INVALID_SOCKET)
return error("Invalid socket.");
host = gethostbyname(url.c_str());
SockAddr.sin_port = htons(80);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
err = connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr));
if (err)
return error("Connection failed.");
send(Socket, GET.c_str(), strlen(GET.c_str()), NULL);
int i = 0;
int nDataLength;
while ((nDataLength = recv(Socket, buffer, 0xFFFFFFF, NULL)) > 0)
{
while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r')
{
source += buffer[i];
i++;
}
}
closesocket(Socket);
WSACleanup();
std::cout << source << std::endl;
}
int error(std::string message)
{
std::cout << "ERROR: " << message << std::endl;
return -1;
}