网页爬虫的最简C/C++程序代码示例------先通过列表获取所有博文id, 然后遍历所有博文id
来源:互联网 发布:电脑设计绘图软件 编辑:程序博客网 时间:2024/05/16 13:47
做个网页爬虫很简单, 本文我们来用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.htmlchar 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, 也就是说, 获取到了每一篇博文的链接地址, 剩下的工作, 只需要稍微修改下上面的程序, 遍历访问博文链接地址, 就获取获取所有博文内容了。
如果对上述程序进行优化控制, 完全可以做到自动化地获获取所有信息, 不需要人工干预中间过程。
当然,上述程序不仅仅是针对新浪, 也可以针对其他类似网站。 原理都一样, 其实还是蛮简单的, 就先说到这里了。
阅读全文
1 0
- 网页爬虫的最简C/C++程序代码示例------先通过列表获取所有博文id, 然后遍历所有博文id
- Python 网络爬虫 008 (编程) 通过ID索引号遍历目标网页里链接的所有网页
- 获取所有下级的id
- oracle 递归获取id和id的所有子机构
- 根据用户id获取其所有微博
- 通过C/C++遍历目录下的所有文件
- thinkphp 通过网页上传过来的多个id ,传到服务器端,用这些id 去获取相应的值,然后再返回给网页
- C/C++ 获取文件夹下的所有文件列表
- AODV获取所有的邻居节点ID方法
- 获取所有应用的资源id和uri
- IOS获取手机所有应用的Bundle id
- android使用获取所有应用的资源id和uri
- runtime 获取设备上所有App的bundle id
- android使用获取所有应用的资源id和uri
- android使用获取所有应用的资源id和uri
- WordPress获取所有页面的id函数: get_all_page_ids
- 论如何获取洛谷所有用户的ID
- iOS逆向 获取手机所有app的bundle Id
- Netty 超时机制及心跳程序实现
- Cat的基本原理
- UVa 12166 Equilibrium Mobile——思路题
- swing 飞机大战 五 击落敌人飞机
- maven执行报错不支持diamond运算符
- 网页爬虫的最简C/C++程序代码示例------先通过列表获取所有博文id, 然后遍历所有博文id
- 自定义View系列(6)--RatingBarView
- 测试工程师之质量推动
- 浅谈SEO优化(1)
- 数据库性能优化之冗余字段的作用
- PullToRefresh第三方插件
- 学习笔记——JAVA设计模式<1>单例模式
- 数组剔除元素后的乘积
- 二、构建maven子项目(多模块项目)