`
yang7229693
  • 浏览: 25633 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Linux获取网页源码的几种方法

阅读更多
JavaEye博客还是本科做毕业设计时候开通的,基本上荒废了,现在决定记录下平时编程遇到的问题或者解决方案。


第一个为利用linux下的工具来获取网页源码,我用的是Wget,也可以使用Curl,curl的话更加的灵活,可以设置很多参数
//通过Wget来获取网页
string GetHtmlByWget(string url)
{
    //获取待下载网页文件名
    string fileName = url.substr((int)url.find_last_of("/") + 1);
    if(fileName != "")
    {
        string strCom = "wget -q "; //wget命令,-q表示不显示下载信息
        strCom.append(url);
        system(strCom.c_str()); //执行wget

        ifstream fin(fileName.c_str());
        if(!fin)
        {
            return "";
        }
        string strHtml = "";
        char chTemp[1024] = "";
        //读取网页文件到内存中
        while(fin.getline(chTemp , 1024))
        {
            strHtml.append(string(chTemp));
            strcpy(chTemp , "");
        }
        fin.close();
        strCom = "rm -f ";  //删除文件命令,-f表示直接删除不做任何提示
        strCom.append(fileName);
        system(strCom.c_str()); //删除刚才下载下来的文件
        return strHtml; //返回网页源码
    }
    else
    {
        return "";
    }
}


第二个是用的socket的来获取源码
//通过GET获取网页源码
string GetHtmlByGet(string url)
{
    string strHtmlContent = "";
    int sockfd;
    struct sockaddr_in addr;
    struct hostent *pURL;
    char text[RECVBUF];

    //分析链接
    UrlInfo urlInfo = ParseURL(url);
    string sAccept = "Accept: */*\r\nAccept-Language: zh-cn\r\nAccept-Encoding: gzip, deflate";
    //不同的主机UserAgent不同
    string sUserAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10";
    //将端口转换为字符串
    char t[6];
    string  strPort;
    sprintf(t,"%d", urlInfo.Port);
    strPort = t;
    //构造发送字符串
    string strRequest = "";
    strRequest.append("GET ");
    strRequest.append(urlInfo.File);
    strRequest.append("?");
    strRequest.append(urlInfo.Body);
    strRequest.append(" HTTP/1.1\r\n");
    strRequest.append(sAccept);
    strRequest.append("\r\nUser-Agent:");
    strRequest.append(sUserAgent);
    strRequest.append("\r\nHost:");
    strRequest.append(urlInfo.Host);
    strRequest.append(":");
    strRequest.append(strPort);
    strRequest.append("\r\nConnection: Keep-Alive\r\n\r\n");

    char* host = const_cast<char*>(urlInfo.Host.c_str());
    sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //TCP方式发送
    pURL = gethostbyname(host);
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = *((unsigned long*)pURL->h_addr);
    addr.sin_port = htons(80);

    //连接
    connect(sockfd,(struct sockaddr *)&addr,sizeof(addr));
    //发送
    send(sockfd, const_cast<char*>(strRequest.c_str()), strRequest.length(), 0);
    //接受
    while(recv(sockfd, text, RECVBUF, 0) > 0)
    {
        strHtmlContent.append(text);
        bzero(text,RECVBUF);
    }
    //关闭socket
    close(sockfd);
    //返回接受结果
    return strHtmlContent;
}



使用libcurl
#include <stdio.h> 
 #include <string.h> 
 #include <curl/curl.h> 

 #define MAX_BUF 	 65536 

 char wr_buf[MAX_BUF+1]; 
 int  wr_index; 

 /* 
 * Write data callback function (called within the context of 
 * curl_easy_perform. 
 */ 
 size_t write_data( void *buffer, size_t size, size_t nmemb, void *userp ) 
 { 
  int segsize = size * nmemb; 

  /* Check to see if this data exceeds the size of our buffer. If so, 
   * set the user-defined context value and return 0 to indicate a 
   * problem to curl. 
   */ 
  if ( wr_index + segsize > MAX_BUF ) { 
    *(int *)userp = 1; 
    return 0; 
  } 

  /* Copy the data from the curl buffer into our buffer */ 
  memcpy( (void *)&wr_buf[wr_index], buffer, (size_t)segsize ); 

  /* Update the write index */ 
  wr_index += segsize; 

  /* Null terminate the buffer */ 
  wr_buf[wr_index] = 0; 

  /* Return the number of bytes received, indicating to curl that all is okay */ 
  return segsize; 
 } 


 /* 
 * Simple curl application to read the index.html file from a Web site. 
 */ 
 int main( void ) 
 { 
  CURL *curl; 
  CURLcode ret; 
  int  wr_error; 

  wr_error = 0; 
  wr_index = 0; 

  /* First step, init curl */ 
  curl = curl_easy_init(); 
  if (!curl) { 
    printf("couldn't init curl\n"); 
    return 0; 
  } 

  /* Tell curl the URL of the file we're going to retrieve */ 
  curl_easy_setopt( curl, CURLOPT_URL, "www.exampledomain.com" ); 

  /* Tell curl that we'll receive data to the function write_data, and 
   * also provide it with a context pointer for our error return. 
   */ 
  curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)&wr_error ); 
  curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, write_data ); 

  /* Allow curl to perform the action */ 
  ret = curl_easy_perform( curl ); 

  printf( "ret = %d (write_error = %d)\n", ret, wr_error ); 

  /* Emit the page if curl indicates that no errors occurred */ 
  if ( ret == 0 ) printf( "%s\n", wr_buf ); 

  curl_easy_cleanup( curl ); 

  return 0; 
 } 
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

    Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象...

    vc++ 应用源码包_6

    Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与...

    vc++ 应用源码包_5

    Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与...

    LINUX操作系统(电子教案,参考答案)

    主要包括Linux的基本概念和操作,Linux的树型结构,Linux的文本编辑,Linux的安装和启动,用户管理,Shell编程技术,进程管理,C编译器,系统扩充,维护与监视,Linux的图形界面,网络的基本概念与设置,Linux在网络...

    linux文件IO操作源码

    在编程中,文件 I/O 是一种常见的操作,用于读取和写入文件中的数据。 文件 I/O 涉及两个主要的概念:输入和输出。输入是指从文件中读取数据到程序中,而输出是将程序中的数据写入到文件中。 在大多数编程语言中,...

    vc++ 应用源码包_3

    Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与...

    JAVA上百实例源码以及开源项目

    Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象...

    安卓java读取网页源码-Android-interview-question:拷贝于别人博客

    安卓java读取网页源码 Android-interview-question 拷贝于别人博客 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一...

    vc++ 开发实例源码包

    《远程控制编程技术》源代码 内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法...

    vc++ 应用源码包_1

    Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与...

    Linux操作系统基础教程

    几种重要的配置文件.......................................................................................................26 三.Linux下常用的工具软件......................................................

    vc++ 应用源码包_2

    Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与...

    Linux管理员指南

    编译Linux内核 131 10.1 内核到底是什么 131 10.2 获取内核源代码 132 10.2.1 选择正确的版本 133 10.2.2 解压缩内核源代码 133 10.3 建立内核 134 10.3.1 make xconfig过程 135 10.3.2 内核...

    Tinyxml 源代码(VC6 & VS2005)

    许可证更具体的描述在每个源代码文件的顶部可以找到。 TinyXML在保证正确和恰当的XML输出的基础上尝试成为一个灵活的解析器。TinyXML可以在任何合理的C++适用系统上编译。它不依赖于异常或者运行时类型信息,有...

    azure-linux-extensions:适用于AzureLinux虚拟机扩展

    扩展清单名称最新版本描述1.5 允许Azure虚拟机的所有者在VM中运行自定义脚本2.71 允许Azure虚拟机的所有者使用Windows PowerShellLinux所需状态配置(DSC)配置VM2.0 允许Azure VM的所有者配置Linux VM修补计划周期 ...

    avplayer源代码

    另外在当前的实现中, 因为个人精力实在有限, 所以借鉴了一些开源项目的代码(如Mplayer), 并且该代码主要基于windows平台, 有移植到linux等其它平台的打算. 所以, 我希望有朋友能参与到这个项目中一起研究和学习, 并...

    入门学习Linux常用必会60个命令实例详解doc/txt

    不过目前大多数较新的Linux发行版本(包括红旗 Linux、中软Linux、Mandrake Linux等)都可以自动挂装文件系统,但Red Hat Linux除外。 umount 1.作用 umount命令的作用是卸载一个文件系统,它的使用权限是超级...

    新梦想贩卖机2.0.4小程序源码.zip

    梦想贩卖机绝对不是简简单单的知识付费或者资源变现微信小程序源码,2021年不可错过的赚钱神器,已支持IOS模式,全面支持个人主体用户。 1.资源社群: 付费或者获取资源后方可进群。 未来是知识社群精准付费运营...

    新梦想贩卖机2.0.4小程序源码

    梦想贩卖机绝对不是简简单单的知识付费或者资源变现微信小程序源码,2021年不可错过的赚钱神器,已支持IOS模式,全面支持个人主体用户。 1.资源社群: 付费或者获取资源后方可进群。 未来是知识社群精准付费运营...

Global site tag (gtag.js) - Google Analytics