网页爬虫的最简C/C++程序代码示例------先通过列表获取所有博文id, 然后遍历所有博文id

972 篇文章 329 订阅
133 篇文章 57 订阅

          做个网页爬虫很简单, 本文我们来用C/C++语言玩一下, 所用环境是Windows + VC++6.0,  其余平台也类似。

          郑重说明:请勿用作非法或者商业用途, 否则后果自负敲打敲打敲打

 

          我们在新浪上随便找一个博客, 比如:http://blog.sina.com.cn/u/5890965060, 我们可以看到, 博主的用户名是:5890965060,   我们访问列表,并用fidder抓包, 可以确定列表访问格式, 直接上代码吧(如下程序只考虑功能, 不考虑性能微笑):

 

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

int getRand(int n)
{
	return rand() % n + 1;
}

int main()
{
	int j = 1;
	for(j = 1; j <= 12; j++) // 博主的博文有12个列表
	{
		int flag = 0;
		WSADATA wsaData;
		WSAStartup(MAKEWORD(1,1), &wsaData);
		char szWeb[] = "blog.sina.com.cn";  // 新浪博客
		HOSTENT *pHost = gethostbyname(szWeb);
		const char* pIPAddr = inet_ntoa(*((struct in_addr *)pHost->h_addr)) ;
		printf("web server ip is : %s\n", pIPAddr);

		SOCKADDR_IN  webServerAddr;
		webServerAddr.sin_family = AF_INET;
		webServerAddr.sin_addr.S_un.S_addr=inet_addr(pIPAddr);
		webServerAddr.sin_port = htons(80);

		SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
		int nRet = connect(sockClient ,(struct sockaddr*)&webServerAddr, sizeof(webServerAddr));
		if(nRet < 0)
		{
			printf("connect error\n");
			return 1;
		}

		// 该博主博客列表访问格式/s/articlelist_5890965060_0_%d.html
		char szHttpRest[1024] = {0};
		sprintf(szHttpRest, "GET /s/articlelist_5890965060_0_%d.html HTTP/1.1\r\nHost:%s\r\nConnection: Keep-Alive\r\n\r\n", j, szWeb);

		printf("send buf is:\n");
		printf("%s\n", szHttpRest);

		nRet = send(sockClient , szHttpRest, strlen(szHttpRest) + 1, 0);
		if(nRet < 0)
		{
			printf("send error\n");
			return 1;
		}

		FILE *fp = fopen("test.txt", "a+");
		while(1)
		{
		    char szRecvBuf[2] = {0};
			nRet = recv(sockClient ,szRecvBuf, 1 ,0);
			
			if(nRet < 0)
			{
				printf("recv error\n");
				goto LABEL;
			}			
			
			if(0 == nRet)
			{
				printf("connection has been closed by web server\n");
				goto LABEL;
			}
			
			if(0 == flag)
			{
				printf("writing data to file...\n");
				flag = 1;
			}

			fputc(szRecvBuf[0], fp);
		}


	LABEL: 
		fclose(fp);
		closesocket(sockClient);  
		WSACleanup();  

		printf("list index is ------------------------------------> %d\n\n\n", j);
		Sleep(1000 * getRand(1));
	}

	printf("\n\n\ndone!!!!!!\n\n\n");

    return 0;
}

        过滤test.txt文件发现(过滤原则依赖于fiddler抓包, 从而确定博文链接的格式):

 

        对照一下原博文:


 

        完全吻合。

    

        如上过程就获取了每一篇博文的id,  也就是说, 获取到了每一篇博文的链接地址, 剩下的工作, 只需要稍微修改下上面的程序, 遍历访问博文链接地址, 就获取获取所有博文内容了。

 

        如果对上述程序进行优化控制, 完全可以做到自动化地获获取所有信息, 不需要人工干预中间过程。 

        当然,上述程序不仅仅是针对新浪, 也可以针对其他类似网站。 原理都一样, 其实还是蛮简单的, 就先说到这里了。

 

 

 

  • 16
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值