LinuxC/C++网络爬虫(1)

忘是亡心i 2022-06-13 23:21 341阅读 0赞

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

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

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

RBSE (Eichmann,1994)是第一个发布的爬虫。

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

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

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

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

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

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

  1. #include <iostream>
  2. #include <string>
  3. #include <string.h>
  4. #include <netdb.h>
  5. #include <stdlib.h>
  6. using namespace std;
  7. #define ERROR -1
  8. #define OK 0
  9. #define PORT 80
  10. void GetUrlAndPath(const string url, string &HostUrl, string &PagePath)
  11. {
  12. HostUrl = url;
  13. PagePath = "/";
  14. //去除 http:// 字符串
  15. int pos = HostUrl.find("http://");
  16. if(pos != -1)
  17. {
  18. HostUrl = HostUrl.replace(pos, 7, "");
  19. }
  20. //去除 https:// 字符串
  21. pos = HostUrl.find("https://");
  22. if(pos != -1)
  23. {
  24. HostUrl = HostUrl.replace(pos, 8, "");
  25. }
  26. //提取主机端口和路径
  27. pos = HostUrl.find("/");
  28. if(pos != -1)
  29. {
  30. PagePath = HostUrl.substr(pos);
  31. HostUrl = HostUrl.substr(0, pos);
  32. }
  33. }
  34. string getpagecontent(const string url)
  35. {
  36. //记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表
  37. struct hostent *host;
  38. string HostUrl, PagePath;
  39. //从url获取主机url和路径
  40. GetUrlAndPath(url, HostUrl, PagePath);
  41. //通过主机名连接主机
  42. host = gethostbyname(HostUrl.c_str());
  43. if(host == 0)
  44. {
  45. cout<<"gethostbyname error";
  46. exit(1);
  47. }
  48. struct sockaddr_in addr;
  49. bzero(&addr, sizeof(addr));
  50. addr.sin_family = AF_INET;
  51. addr.sin_port = htons(PORT);
  52. addr.sin_addr.s_addr = ((struct in_addr*) (host->h_addr))->s_addr;
  53. int sfd = socket(AF_INET, SOCK_STREAM, 0);
  54. if(sfd == -1)
  55. {
  56. cout<<"create sfd error"<<endl;
  57. exit(1);
  58. }
  59. string requestHeader;
  60. requestHeader = "GET " + PagePath + " HTTP/1.1\r\n";
  61. requestHeader += "Host: " + HostUrl + "\r\n";
  62. requestHeader += "Accept: */*\r\n";
  63. requestHeader += "User-Agent: Mozilla/4.0(compatible)\r\n";
  64. requestHeader += "connection:Keep-Alive\r\n";
  65. requestHeader += "\r\n";
  66. int ret = connect(sfd, (const sockaddr*)&addr, sizeof(addr));
  67. if(ret == -1)
  68. {
  69. cout<<"connect error"<<endl;
  70. exit(1);
  71. }
  72. ret = send(sfd, requestHeader.c_str(), requestHeader.size(), 0);
  73. if(ret == -1)
  74. {
  75. cout<<"send error"<<endl;
  76. exit(1);
  77. }
  78. struct timeval timeout = {1, 0};
  79. setsockopt(sfd, SOL_SOCKET, SO_RCVTIMEO, (char*) &timeout, sizeof(struct timeval));
  80. char c;
  81. bool flag = true;
  82. while(recv(sfd, &c, 1, 0))
  83. {
  84. if(c == '\r')
  85. {
  86. continue;
  87. }
  88. else if(c == '\n')
  89. {
  90. if(flag == false)
  91. break;
  92. flag = false;
  93. }
  94. else
  95. {
  96. flag = true;
  97. }
  98. }
  99. int len, BUFFERSIZE = 512;
  100. char buffer[BUFFERSIZE];
  101. string pagecontent = "";
  102. while((len = recv(sfd, buffer, BUFFERSIZE-1, 0)) > 0)
  103. {
  104. buffer[len] = '\0';
  105. pagecontent += buffer;
  106. }
  107. return pagecontent;
  108. }
  109. int main()
  110. {
  111. cout<<getpagecontent("http://www.baidu.com")<<endl;
  112. return 0;
  113. }

发表评论

表情:
评论列表 (有 0 条评论,341人围观)

还没有评论,来说两句吧...

相关阅读

    相关 LinuxC/C++网络爬虫1

      网络爬虫(Web Crawler),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本,有时候又称网络蚂蚁,是搜索引擎(例如:Baidu、Google……)的重要组成

    相关 0302网络爬虫

    一、正则表达式 1、正则表达式:通用的字符串表达框架,简洁表达一组字符串的表达式。针对字符串表达“简洁”和“特征”思想的工具。判断某字符串的特征归属。主要应用在字符串匹配