C++ネットワーク爬虫類の実現
げんり
開始urlからWebページのHTMLコードが得られます.このHTMLコードを解析して新しいURLと画像リソース(任意の有用なリソース)のアドレスを取得し、新しいURLはこのプロセスを継続します.画像を新しいスレッドにダウンロードします.
コード#コード#
CHttp.h
CHttp.cpp
main.cpp
皆さんも私の個人のブログの豆乳and油条er、個人の公衆番号の検索を訪問することができます:豆乳and油条er、あるいは直接顔をスキャンします
開始urlからWebページのHTMLコードが得られます.このHTMLコードを解析して新しいURLと画像リソース(任意の有用なリソース)のアドレスを取得し、新しいURLはこのプロセスを継続します.画像を新しいスレッドにダウンロードします.
コード#コード#
CHttp.h
#include
#include
#include
#include
//#include windows
using namespace std;
#pragma comment(lib,"ws2_32.lib")//
class CHttp
{
private:
string m_host;
string m_object;
SOCKET m_socket;
bool AnalyseUrl(string url);// URL\http
bool AnalyseUrl2(string url);//\https
bool init();//
bool Connect();// web
public:
CHttp(void);
~CHttp(void);
string FetchGet(string url);// Get
void AnalyseHtml(string html);// ,
};
CHttp.cpp
#include "CHttp.h"
CHttp::CHttp(void)
{
}
CHttp::~CHttp(void)
{
closesocket(m_socket);
WSACleanup();
}
// URL\http
bool CHttp::AnalyseUrl(string url)
{
if(string::npos == url.find("http://"))
return false;
if(url.length()<=7)
return false;
int pos =url.find('/',7);
if(pos==string::npos)
{
m_host=url.substr(7);
m_object='/';
}
else
{
m_host=url.substr(7,pos-7);
m_object=url.substr(pos);
}
if(m_host.empty())
return false;
return true;
}
// URL\https
bool CHttp::AnalyseUrl2(string url)
{
if(string::npos == url.find("https://"))
return false;
if(url.length()<=8)
return false;
int pos =url.find('/',8);
if(pos==string::npos)
{
m_host=url.substr(8);
m_object='/';
}
else
{
m_host=url.substr(8,pos-8);
m_object=url.substr(pos);
}
if(m_host.empty())
return false;
return true;
}
bool CHttp::init()
{
//1
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2){
printf(" !
");
return false;
}
//printf(" !
");
//2 socket
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (SOCKET_ERROR == m_socket){
printf(" socket !
");
WSACleanup();
return false;
}
//printf(" socket !
");
return true;
}
// web
bool CHttp::Connect()
{
//DNS : IP
hostent *p = gethostbyname(m_host.c_str());
if(p==NULL)
return false;
SOCKADDR_IN sa;
sa.sin_family=AF_INET;
sa.sin_port=htons(80);//http ,https 443
memcpy(&sa.sin_addr,p->h_addr,4);
if(-1==connect(m_socket,(SOCKADDR*)&sa,sizeof(sa)))
{
cout< p;
p.push(src);
extern void loadImage();
CreateThread(NULL, NULL,(LPTHREAD_START_ROUTINE)loadImage,
NULL, NULL, NULL);
}
/*system("pause");*/
}
startIndex=endIndex+1;
//system("pause");
}
startIndex =0;
// URL
for(int pos=0;pos q;
q.push(url);
//cout<
main.cpp
#include "CHttp.h"
#include
#pragma comment(lib, "urlmon.lib")
queue q;//url
queue p;// url
void StartCatch(string url);
int main()
{
cout<>url;
url="http://desk.zol.com.cn/";// ,
//
StartCatch(url);
system("pause");
return 0;
}
void StartCatch(string url)
{
q.push(url);
while(!q.empty())
{
// url
string currenturl = q.front();
q.pop();
CHttp http;
// Get
string html=http.FetchGet(currenturl);
//cout<
皆さんも私の個人のブログの豆乳and油条er、個人の公衆番号の検索を訪問することができます:豆乳and油条er、あるいは直接顔をスキャンします