下载的页面源与呈现的页面源不同

时间:2013-05-31 12:01:06

标签: html c++ libcurl

我打算从这个网站获取数据

http://www.gpw.pl/akcje_i_pda_notowania_ciagle

(这是波兰主要股票市场的一个网站)

我有一个用C ++编写的程序,可以将该站点的源代码下载到该文件中。 但问题是它不包含我感兴趣的东西 (股票的价值当然)。

如果您将此网站来源与“查看元素”选项进行比较(RMB - >查看元素) 你可以看到“View element”确实包含了股票的价值。

<td>75.6</td>
<tr class="even red">
等等......

下载的网站来源没有此信息。

所以我们有两个问题

1)为什么网站的来源与“查看元素”选项不同?

2)如何转移我的程序以便下载正确的代码?

   #include <string>  
    #include <iostream>  
    #include "curl/curl.h"
    #include <cstdlib>

    using namespace std;  

    // Write any errors in here  
    static char errorBuffer[CURL_ERROR_SIZE];  

    // Write all expected data in here  
    static string buffer;  

    // This is the writer call back function used by curl  
    static int writer(char *data, size_t size, size_t nmemb,  
                      string *buffer)  
    {  
      // What we will return  
      int result = 0;  

      // Is there anything in the buffer?  
      if (buffer != NULL)  
      {  
        // Append the data to the buffer  
        buffer->append(data, size * nmemb);  

        // How much did we write?  
        result = size * nmemb;  
      }  

      return result;  
    }  

    // You know what this does..  
    void usage()  
    {  
      cout <<"curltest: \n" << endl;  
      cout << "Usage:  curltest url\n" << endl;  
    }   

    /* 
     * The old favorite 
     */  
    int main(int argc, char* argv[])  
    {  
      if (argc > 1)  
      {  
        string url(argv[1]);  

        cout<<"Retrieving "<< url << endl;  

        // Our curl objects  
        CURL *curl;  
        CURLcode result;  

        // Create our curl handle  
        curl = curl_easy_init();  

        if (curl)  
        {  
          // Now set up all of the curl options  
          curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);  
          curl_easy_setopt(curl, CURLOPT_URL, argv[1]);  
          curl_easy_setopt(curl, CURLOPT_HEADER, 0);  
          curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);  
          curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);  
          curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);  

          // Attempt to retrieve the remote page  
          result = curl_easy_perform(curl);  

          // Always cleanup  
          curl_easy_cleanup(curl);  

          // Did we succeed?  
          if (result == CURLE_OK)  
          {  
            cout << buffer << "\n";  
            exit(0);  
          }  
          else  
          {  
            cout << "Error: [" << result << "] - " << errorBuffer;  
            exit(-1);  
          }  
        }  
      }  
      return 0;
    }  

2 个答案:

答案 0 :(得分:0)

因为使用JavaScript填充了值。

“查看源代码”显示页面的原始来源,而“查看元素”显示文档树当前所处的状态。

没有简单的方法可以修复它,因为您需要执行JavaScript或将其移植到C ++(它可能会让您在交换时不受欢迎)。

答案 1 :(得分:0)

当我将页面保存为html文件(文件/另存为)时,我会收到一个文件,其中包含浏览器中显示的所有数据,但未在页面源中找到(我使用的是Chrome)。

所以我建议你在代码中添加一个步骤:

    从支持命令行或某种API的支持JavaScript的浏览器
  1. 下载页面(如果curl无法做到这一点,也许linux上的wget或lynx / links / links2 / elinks可以帮到你?)。
  2. 解析数据。