C++ネットワーク爬虫類の実現

3807 ワード

げんり
開始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、あるいは直接顔をスキャンします