精华内容
下载资源
问答
  • C++网络爬虫项目

    2018-07-04 00:59:17
    WEBCRAWLER 网络爬虫实训项目 1 WEBCRAWLER 网 络 爬 虫 实 训 项 目 文档版本: 1.0.0.1 编写单位: 达内IT培训集团 C++教学研发部 编写人员: 闵卫 定稿日期: 2015年11月20日 星期五WEBCRAWLER 网络爬虫实训项目 ...
  • C++网络爬虫

    2015-03-16 21:58:18
    Spider C++, C++网络爬虫 AppWizard has created this Spider application for you. This application not only demonstrates the basics of using the Microsoft Foundation classes but is also a starting point...
  • C++ 网络爬虫代码

    2018-09-24 12:14:51
    C++ Winsock 网络编程 仅支持http协议 Socket进行网络连接 解析整个html代码 宽度优先搜索,像爬虫一样遍历网页 正则表达式提取图片URL 将图片命名,保存在目录下
  • c++网络爬虫

    2016-11-30 22:03:45
    直接可以使用
  • C++ 网络爬虫

    2015-11-11 20:00:25
    使用C++实现网页爬虫,只要是爬图片,然后爬链接作为下一个待爬的对象.
  • C++网络爬虫,使用wget命令做的,较简单,不涉及socket编程,但总体设计思路还是和基于socket的爬虫一样。如需基于socket爬虫,请到我的github下载:https://github.com/qq879343544/webSpider
  •  网络爬虫(Web crawler),是一种“自动化浏览网络”的程序,或者说是一种网络机器人。它们被广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。它们可以自动采集所有其能够访问到的...
  • LinuxC/C++网络爬虫(1)

    千次阅读 2017-06-04 19:37:58
    网络爬虫(Web Crawler),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本,有时候又称网络蚂蚁,是搜索引擎(例如:Baidu、Google……)的重要组成部分。随着Internet的快速发展,网站数量剧增意味着...

      网络爬虫(Web Crawler),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本,有时候又称网络蚂蚁,是搜索引擎(例如:BaiduGoogle……)的重要组成部分。随着Internet的快速发展,网站数量剧增意味着后台数据量的剧增,在这样的情况下,用户能不能通过搜索引擎来及时地得到包含他要查找内容的网页,能不能实现定向搜索……,这些对传统的搜索引擎必然是个巨大的考验。以上这些都是网络爬虫所关心的问题,通过改变网络爬虫的搜索策略,分析策略等,就能在很大程度上解决以上问题。

      传统的网络爬虫一般从一个或若干初始网页的URL开始,抓取初始网页,然后通过URL分析策略,提取已抓取页面上的URL,然后继续重复以上过程,不断从当前页面上抽取新的URL放入队列,直到满足一定的停止条件。

    目前已经发布的网络爬虫有

    RBSE Eichmann1994)是第一个发布的爬虫。

    WebCrawlerPinkerton1994)是第一个公开可用的用来建立全文索引的一个子程序,他使用库www来下载页面。

    World Wide Web Worm (McBryan, 1994)是一个用来为文件建立包括标题和URL简单索引的爬虫。索引可以通过grep式的Unix命令来搜索。

    GNU Wget是一个在GPL许可下,使用C语言编写的命令行式的爬虫。它主要用于网络服务器和FTP服务器的镜像。

    Heritrix是一个互联网档案馆级的爬虫,设计的目标为对大型网络的大部分内容的定期存档快照,是使用java编写的。

      大家常用的搜索引擎,例如BaiduGoogle也都有自己的网络爬虫来帮他们抓取Internet海洋中的网页。这里稍微插一段题外话,其实网络爬虫和网站维护经常都是对立的,因为有些爬虫刷新时间短,有些爬虫比较“笨”,会在网站里迷失了路等情况,引起给网站服务器发送大量请求,造成服务器压力过大而崩溃。但话又说回来,一个设计良好的网络爬虫,再加上使用者良好的素质,是完全可以避免以上情况的。总得来说,网络爬虫带来的好处远远大于它自身和使用者带来的坏处。


      因为刚开始接触这个网络爬虫的缘故,本人对爬虫了解并不是太深,这两天写了一个小程序,实现了通过URL来获取网页源代码。这两天找了很多资料,但是绝大部分的爬虫资料都是Python编写的,少数是JAVA和c#写的,C/C++的版本少之又少,还是需要我继续去学习啊。

    #include <iostream>
    #include <string>
    #include <string.h>
    #include <netdb.h>
    #include <stdlib.h>
    
    using namespace std;
    
    #define ERROR    -1
    #define OK          0
    #define PORT      80
    
    void GetUrlAndPath(const string url, string &HostUrl, string &PagePath)
    {
        HostUrl = url;
        PagePath = "/";
        //去除 http:// 字符串
        int pos = HostUrl.find("http://");
        if(pos != -1)
        {
            HostUrl = HostUrl.replace(pos, 7, "");
        }
    
        //去除 https:// 字符串
        pos = HostUrl.find("https://");
        if(pos != -1)
        {
            HostUrl = HostUrl.replace(pos, 8, "");
        }
    
        //提取主机端口和路径
        pos = HostUrl.find("/");
        if(pos != -1)
        {
            PagePath = HostUrl.substr(pos);
            HostUrl = HostUrl.substr(0, pos);
        }
    }
    
    string getpagecontent(const string url)
    {
        //记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表
        struct hostent *host;
        string HostUrl, PagePath;
    
        //从url获取主机url和路径
        GetUrlAndPath(url, HostUrl, PagePath);
    
        //通过主机名连接主机
        host = gethostbyname(HostUrl.c_str());
        if(host == 0)
        {
            cout<<"gethostbyname error";
            exit(1);
        }
    
        struct sockaddr_in addr;
        bzero(&addr, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(PORT);
        addr.sin_addr.s_addr = ((struct in_addr*) (host->h_addr))->s_addr;
        int sfd = socket(AF_INET, SOCK_STREAM, 0);
        if(sfd == -1)
        {
            cout<<"create sfd error"<<endl;
            exit(1);
        }
    
        string requestHeader;
        requestHeader   = "GET " + PagePath + " HTTP/1.1\r\n";
        requestHeader += "Host: " + HostUrl + "\r\n";
        requestHeader += "Accept: */*\r\n";
        requestHeader += "User-Agent: Mozilla/4.0(compatible)\r\n";
        requestHeader += "connection:Keep-Alive\r\n";
        requestHeader += "\r\n";
    
        int ret = connect(sfd, (const sockaddr*)&addr, sizeof(addr));
        if(ret == -1)
        {
            cout<<"connect error"<<endl;
            exit(1);
        }
    
        ret = send(sfd, requestHeader.c_str(), requestHeader.size(), 0);
        if(ret == -1)
        {
            cout<<"send error"<<endl;
            exit(1);
        }
    
        struct timeval timeout = {1, 0};
        setsockopt(sfd, SOL_SOCKET, SO_RCVTIMEO, (char*) &timeout, sizeof(struct timeval));
        char c;
        bool flag = true;
        while(recv(sfd, &c, 1, 0))
        {
            if(c == '\r')
            {
                continue;
            }
            else if(c == '\n')
            {
                if(flag == false)
                    break;
                flag = false;
            }
            else
            {
                flag = true;
            }
        }
    
        int len, BUFFERSIZE = 512;
        char buffer[BUFFERSIZE];
        string pagecontent = "";
        while((len = recv(sfd, buffer, BUFFERSIZE-1, 0)) > 0)
        {
            buffer[len] = '\0';
            pagecontent += buffer;
        }
    
        return pagecontent;
    }
    
    int main()
    {
        cout<<getpagecontent("http://www.baidu.com")<<endl;
    
        return 0;
    }
    


    展开全文
  • 网络爬虫c++

    2011-12-16 17:55:47
    网络爬虫 Crawler c++ 可以直接下载网页的
  • C++实现网络爬虫

    万次阅读 多人点赞 2019-06-19 18:42:39
    cout欢迎使用网络爬虫系统 "; cout开发者:a_byudao "; cout*****************************************"; //创建一个文件夹,点表示当前目录 CreateDirectory("./image",NULL); ////从键盘输入一个起始url ...

    原理

    根据起始url得到网页的HTML代码。解析此HTML代码得到新的URL和图片资源(任何有用的资源)的地址,新的URL继续此过程。下载图片在一个新的线程里。

    代码

    CHttp.h

    #include<iostream>
    #include<windows.h>
    #include<string>
    #include<queue>
    //#include<WinSock2.h>在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("请求协议版本失败!\n");
    			return false;
    	}
    	//printf("请求协议成功!\n");
    	//2 创建socket
    	m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if (SOCKET_ERROR == m_socket){
    		printf("创建socket失败!\n");
    		WSACleanup();
    		return false;
    	}
    	//printf("创建socket成功!\n");
    	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<<"服务器连接失败"<<endl;
    		return false;
    	}
    	else
    	{
    		//cout<<"服务器连接成功"<<endl;
    		return true;
    	}
    }
    
    string CHttp::FetchGet(string url)//通过Get方式获取网页
    {
    	string html;
    
    	//解析url
    	if(false==AnalyseUrl(url))
    	{
    		if(false==AnalyseUrl2(url))
    		{
    			cout<<"Html解析失败"<<endl;
    			return "";
    		}
    	}
    	//cout<<"主机名"<<m_host<<"\t\t"<<"资源名"<<m_object<<endl;
    	if(false==init())//初始化套接字
    	{
    		return "";
    	}
    	if(false==Connect())//连接服务器
    	{
    		return "";
    	}
    	//发送Get请求  Get请求数据
    	string request = "GET " + m_object + 
    		" HTTP/1.1\r\nHost:" + m_host + 
    		"\r\nConnection: Close\r\n\r\n";
    
    	if( SOCKET_ERROR ==send( m_socket, request.c_str(), request.size(), 0 ) )
    	{
    		cout << "send request error" <<endl;
    		closesocket( m_socket );
    		return "";
    	}
    
    	//接收数据
    	char ch;
    	while(recv(m_socket,&ch,1,0))
    	{
    		html+=ch;
    	}
     
    	return html;
    }
    //判断是否以什么结尾
    bool hasEnding (char *& strFull,char*&  strEnd)
    {
    	char * pFull = strFull;
    	while(*pFull != 0)
    		pFull++;
     
    	char * pEnd = strEnd;
    	while(*pEnd != 0)
    		pEnd++;
     
    	while(1)
    	{
    		pFull--;
    		pEnd--;
    		if (*pEnd == 0)
    		{
    			break;
    		}
     
    		if (*pFull != *pEnd)
    		{
    			return false;
    		}
     
    	}
    	return true;
    }
    void CHttp::AnalyseHtml(string html)//解析网页,获得图片地址和其他的链接
    {
    	int startIndex =0;
    	int endIndex=0;
    	//找到所有的图片
    	for(int pos=0;pos<html.length();)
    	{
    		startIndex=html.find("src=\"",startIndex);
    		if(startIndex==-1)
    		{
    			break;
    		}
    		startIndex+=5;
    		endIndex=html.find("\"",startIndex);
    		//找到资源链接
    		string src = html.substr(startIndex,endIndex-startIndex);
    		char *src1 = (char *)src.c_str();
    		//cout<<src<<endl;
    		//判断连接是否是想要的资源
    		char *strend=".jpg";
    		if(hasEnding(src1,strend)==true)
    		{
    			/*if(-1!=src.find("t_s960x600c5"))*/
    			if(-1!=src.find("t_s1920x1080c5"))
    			{
    				cout<<src<<endl;
    				//新建一个线程来下载图片
    				extern queue<string> 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<html.length();)
    	{
    		startIndex=html.find("href=\"",startIndex);
    		if(startIndex==-1)
    		{
    			break;
    		}
    		startIndex+=6;
    		endIndex=html.find("\"",startIndex);
    		//找到资源链接
    		string src = html.substr(startIndex,endIndex-startIndex);
    		char *src1 = (char *)src.c_str();
    		//cout<<src<<endl;
    		//判断连接是否是想要的资源
    		char *strend=".html";
    		if(hasEnding(src1,strend)==true)
    		{
    			if((-1!=src.find("bizhi")|| -1!=src.find("showpic")) && -1==src.find("http://"))			
    			{
    				string url="http://desk.zol.com.cn"+src;
    				extern queue<string> q;
    				q.push(url);
    				//cout<<url<<endl;
    			}			
    		}
    		startIndex=endIndex+1;
    		//system("pause");
    	}
    
    }
    

    main.cpp

    #include "CHttp.h"
    #include <urlmon.h>
    
    #pragma comment(lib, "urlmon.lib")
    
    queue<string> q;//url队列
    queue<string> p;//图片url队列
    
    void StartCatch(string url);
    int main()
    {
    	cout<<"*****************************************"<<endl<<endl;
    	cout<<"           欢迎使用网络爬虫系统          "<<endl;
    	cout<<"              开发者:a_byudao           "<<endl<<endl;
    	cout<<"*****************************************"<<endl<<endl;
    
    	//创建一个文件夹,点表示当前目录
    	CreateDirectory("./image",NULL);
    
    	从键盘输入一个起始url
    	string url;
    	//cout<<"请输入起始url:";
    	//cin>>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<<html;
    		http.AnalyseHtml(html);
    	}
    }
    
    
    //下载图片的线程
    static int num=0;
    void loadImage()
    {
    	while(!p.empty())
    	{
    		string currenturl = p.front();
    		p.pop();
    		char Name[20]={0};
    		num++;
    		sprintf(Name,"./image/%d.jpg",num);
    		
    		if(S_OK==URLDownloadToFile(NULL, currenturl.c_str(), Name, 0, 0))
    		{
    			cout<<"download ok"<<endl;
    			if(num==24)//爬24张就结束了,也可以去掉这句话
    			{
    				exit(0);
    			}
    		}
    		else
    		{
    			cout<<"download error"<<endl;
    		}
    	}
    
    }
    

    大家也可以访问我的个人博客豆浆and油条er、个人公众号搜索:豆浆and油条er,或者直接扫描头像

    展开全文
  • C++网络爬虫抓取图片

    2015-07-09 12:00:00
    1、首先取一个初始网页,例如百度图片里面的网页(假设url为 http://image.baidu.com/channel/fashion ); 2、向image.baidu.com发送一个请求(GET /channel/fashion ... ...

    1、首先取一个初始网页,例如百度图片里面的网页(假设url为 http://image.baidu.com/channel/fashion );

    2、向image.baidu.com发送一个请求(GET /channel/fashion HTTP/1.1\r\nHost:image.baidu.com............);

    3、保存image.baidu.com回应的内容response;

    4、在response中查找<href>标签中的网址,并保存下来(假设保存到hrefs容器中);

    5、在response中查找<img>标签中的图片地址,并保存下来(假设保存到imgs容器中);

    6、下载imgs中所有的图片;

    7、找到hrefs容器中的一条网址a;

    8、重复2到6步骤;

    9、删除网址a;

    10、重复7到9步骤。

    -----------------------------------------------------------------------------------------------

    转载于:https://www.cnblogs.com/howardhuo/p/4632755.html

    展开全文
  • 使用C++Socket库实现的简单网络爬虫,可以爬取网页中的一些图片,貌似大部分网页都爬不了,我测试时,只爬取到 http://59pic.92demo.com/ 中的部分图片,并且在多次爬取后也不管用了。
  • C++网络爬虫的实现

    千次阅读 2016-09-09 19:02:37
    http://mp.weixin.qq.com/s__biz=MjM5Nzk2NDEzMg==&mid=2452973562&idx=1&sn=680a76e07048f6c798f0634f840d6e63&scene=2&srcid=0909yhPQHHyTdbmNtIBmO75m&from=timeline&isappinstalled=0#wechat_redirect
    http://mp.weixin.qq.com/s?__biz=MjM5Nzk2NDEzMg==&mid=2452973562&idx=1&sn=680a76e07048f6c798f0634f840d6e63&scene=2&srcid=0909yhPQHHyTdbmNtIBmO75m&from=timeline&isappinstalled=0#wechat_redirect
    
    展开全文
  • C++实现网络爬虫源码

    2019-06-10 17:26:31
    c++实现网络爬虫源码,vs2013环境编译,附编译说明,希望对大家有所帮助。
  • c++ 网络爬虫程序

    热门讨论 2011-03-17 16:41:59
    今天下午, 在网上搜了很多这方面的代码, 但是很多都是垃圾.
  • drill C++ 网络爬虫

    2012-08-01 16:02:28
    一个小而全的C++实现的网络爬虫。很全面,而且里面包括了过滤,截取,简单分词等技术。是学习的好材料。
  • 使用C++编写一个DHT爬虫,实现从DHT网络爬取BT种子

    万次阅读 多人点赞 2021-06-12 21:44:50
    使用C++编写一个DHT爬虫,实现从DHT网络爬取BT种子1、相关术语1.1、P2P网络1.2、DHT网络1.3、Kademlia算法1.4、KRPC协议1.5、MagNet协议1.6、本段小结2、BT下载的一些概念梳理2.1、BT软件下载原理2.2、迅雷获取种子...
  • C++网络爬虫

    2019-08-07 22:28:41
    C++网络爬虫 网络爬虫是按照一定规则,自动地抓取万维网信息的程序或脚本。这里用C++语言写一个小程序,实现简单的图片爬取的功能,目的是为了通过这么一个小程序理解爬虫的基本原理及基本流程。其大致实现流程...
  • C++网络爬虫单机版

    2009-06-04 23:53:10
    C++写的网络爬虫,单机版的,供学习爬虫使用
  • c++完成窗体,读取网站内容,难度大吗?最好有厉害的大神完成过这类有具体代码。
  • C++网络爬虫的实现——WinSock编程

    万次阅读 多人点赞 2012-10-28 04:05:59
    写了一个网络爬虫,可以抓取网上的图片。 需要给定初始网站即可。 在vs2010中编译通过。 编译后,运行即可,有惊喜哦!!! //#include #include #include #include #include #include "winsock2.h" #...
  • C++网络爬虫的实现(作者huangxy10)

    千次阅读 2014-06-25 13:50:03
    一个简单的C++网络爬虫的实现的例子。 //#include #include #include #include #include #include "winsock2.h" #include #include #include #pragma comment(lib, "ws2_32.lib") using ...
  • 基于linux下的网络爬虫的编写,有详细的注释和文档,方便初学者的学习
  • 网络爬虫 C++的实现

    2013-07-10 10:43:38
    使用C++实现网络爬虫的初步实现,能够根据基础页面保留查找内容,而过滤掉控制内容
  • C++爬虫项目爬取图片

    2020-08-23 08:15:48
    C++爬虫项目爬取图片, 值得注意的是有些网站的图片爬不来的,有反爬机制,所以一般人爬不下来. 主要代码文件 main.cpp文件里面的代码 #include "CHttp.h" #include <urlmon.h> #pragma comment(lib, ...
  • c++实现的网络爬虫

    热门讨论 2010-04-28 17:48:53
    c++实现的网络爬虫,代码封装的很好,有C++基础和数据结构和网络协议基础的人,很容易看懂。
  • Visual Studio 2010 C++网络爬虫

    千次阅读 2016-11-09 23:34:58
    //初始化socket,用于tcp网络连接 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { return; } // 创建文件夹,保存图片和网页文本文件 CreateDirectory("./img", 0); Create...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,896
精华内容 5,958
关键字:

c++网络爬虫

c++ 订阅
爬虫 订阅