`
yang7229693
  • 浏览: 26054 次
  • 性别: 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; 
 } 
分享到:
评论

相关推荐

    Linux网络编程源代码

    《Linux网络编程源代码》是基于TCP/IP协议族进行网络编程的一份宝贵资源,主要针对Linux和POSIX套接字接口。这份源代码是《用TCP/IP进行网际互联——客户—服务器编程与应用(Linux/POSIX套接字版)(第三卷)》一书...

    精通LinuxC编程源代码

    在深入探讨“精通Linux C编程源代码”这一主题之前,我们首先要理解Linux操作系统与C语言编程的结合。C语言是一种强大的、低级别的编程语言,它为程序员提供了对系统硬件的直接控制,使得编写高效的系统级软件成为...

    LINUX内核源代码说明

    【Linux内核源代码说明】 Linux内核源代码是开源软件的一大典范,它允许开发者深入理解操作系统的工作原理,同时也提供了无数的机会进行定制和优化。本文将详细介绍如何在Linux内核源代码中查找特定的内核函数,...

    查看linux源码的方法

    首先,我们需要了解如何获取Linux的源代码。可以通过多种方式获取到Linux的源码: 1. **通过官网下载**:最直接的方式是访问`kernel.org`,这里提供了最新的稳定版以及开发版的Linux内核源码。 2. **使用包管理工具...

    用C语言写的linux串口读写源代码com serial,适用于arm和各种linux系统

    源代码的核心部分可能包括以下几个关键函数: 1. **打开串口**:使用`open()`函数打开指定路径(如"/dev/ttyS0")的串口,获取文件描述符。 2. **配置串口参数**:通过`struct termios`结构体设置波特率(如9600、...

    linux驱动串口源码

    Linux内核提供了对串口的全面支持,通过`drivers/serial`目录下的源代码实现。在这些源代码中,你可以找到串口驱动的核心功能,包括初始化、发送数据、接收数据、中断处理以及错误处理等。 在Linux驱动中,串口驱动...

    sift的linux下C语言源代码

    在分析和学习这个源代码时,你需要理解以下几个核心概念: 1. **SIFT算法**:首先,你需要熟悉SIFT算法的基本步骤,包括尺度空间极值检测、关键点定位、关键点主方向确定、关键点描述符计算等。 2. **C语言编程...

    linux0.01源代码分析

    ### Linux 0.01 源代码分析:MTD 子系统详解 #### Linux MTD 子系统简介 Linux MTD(Memory Technology Devices)子系统是Linux内核中的一个关键组成部分,它主要负责管理非易失性存储器,如Flash存储器。MTD为...

    linux shell编程源代码 小游戏“俄罗斯方块”

    Linux Shell编程是一种在Linux操作系统环境下,使用Shell脚本语言进行程序设计的方法。Shell是Linux的命令解释器,它提供了一种交互式环境,用户可以通过命令行输入指令来控制操作系统。而通过编写Shell脚本,我们...

    linux内存共享源代码

    在"Linux内存共享源代码"中,我们可以推测作者可能使用了上述的一种或两种方法来实现在两个shell窗口间的通信。通常,这会涉及到以下几个关键步骤: - **创建共享内存**:根据选择的接口,创建一块共享内存,并指定...

    linux的file命令源码

    在源码包`file-5.04.tar.gz`和`file-5.40.tar.gz`中,我们可以看到源代码的演变和改进。`file`命令的源码通常包含以下几个主要部分: 1. **Magic数据库**:这是`file`命令识别文件类型的关键。它是一系列的规则,每...

    linux消息队列源码

    在Linux消息队列源码中,主要涉及以下几个核心概念: 1. **msgbuf结构体**:这是Linux内核中用来存储消息的数据结构。它通常包括一个msg_type字段(用于区分不同类型的消息)和msg_text字段(存储实际的消息内容)...

    linux_c.rar c语言 源代码

    标题中的"linux_c.rar"可能是一个包含C语言编写的Linux相关源代码的压缩文件。这个文件名"linux_c.c"暗示着我们可能正在研究一个与Linux系统交互的C语言程序示例。在Linux环境下,C语言因其高效、灵活性和接近硬件的...

    linux文件管理系统源代码

    源代码的分析将使我们深入了解Linux如何处理文件操作,如创建、读取、写入、删除以及目录管理。在这个“linux文件管理系统源代码”中,我们可以学习到以下几个关键知识点: 1. **VFS(虚拟文件系统)**:Linux的VFS...

    LINUX下传输文件源码

    这个名为“LINUX下传输文件源码”的项目提供了一种解决方案,旨在处理文件传输过程中的各种细节问题。源码是用C语言编写的,这是一门底层、高效且广泛应用的编程语言,非常适合处理系统级任务。 C语言在Linux环境下...

    Linux下查看PCI设备配置空间方法_有源代码模块示例

    在提供的文本文件中,`Linux下查看PCI设备配置空间方法_有源代码模块示例.txt`和`Linux下查看PCI设备配置空间方法_提供源代码模块.txt`应该详细解释了如何使用这个模块,以及代码的工作原理。 总的来说,掌握在...

    语音识别linux源码

    在IT领域,语音识别技术是近年来发展迅速的一个分支,它为用户提供了一种无需物理接触的交互方式,尤其在智能家居、自动驾驶、智能助手等场景中应用广泛。Linux作为一款开源操作系统,其灵活性和可定制性使其成为了...

    Linux源代码分析

    Linux源代码分析是一个深入理解操作系统内核工作原理的重要过程,对于开发者、系统管理员以及热衷于技术探究的人员来说,具有极高的学习价值。Linux作为一款开源的操作系统,其源代码可供任何人研究和修改,这为我们...

    linux下的视频流处理源代码

    这个压缩包包含了几个核心的源代码文件,对于理解Linux下视频流的处理流程非常有帮助。接下来,我们将深入探讨这些文件以及它们所涉及的关键知识点。 首先,`DVB_I2C.C`和`DVB_I2C.H`是与I2C(Inter-Integrated ...

    linux 带宽获取 代码实现

    在Linux环境中,获取...总的来说,获取Linux环境下的带宽信息并不复杂,只需要理解系统提供的信息源并利用Shell脚本进行处理即可。"daikuan.sh"脚本正是基于这一原理,为用户提供了一种无需额外工具的带宽监控方案。

Global site tag (gtag.js) - Google Analytics