Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
web爬虫在read()中下载网页的recv缓冲区应该有多大? 我正在编写一个C++的网络爬虫,想找出一个读取HTTP请求响应的最佳方法。_C++_Sockets_Http_Buffer_Httprequest - Fatal编程技术网

web爬虫在read()中下载网页的recv缓冲区应该有多大? 我正在编写一个C++的网络爬虫,想找出一个读取HTTP请求响应的最佳方法。

web爬虫在read()中下载网页的recv缓冲区应该有多大? 我正在编写一个C++的网络爬虫,想找出一个读取HTTP请求响应的最佳方法。,c++,sockets,http,buffer,httprequest,C++,Sockets,Http,Buffer,Httprequest,目前,我正在使用一个1M大小的缓冲区在read()中包含recv消息(read()的计数为4K字节)。这是我想抓取的最大网页大小。然而,这是一种浪费,因此我也在考虑以下其他方法: 在第一轮发送http HEAD请求,并从标头读取内容长度信息。创建一个大小为内容长度的字符数组,然后发送http GET以检索内容。 Q1:如果来自服务器的标题信息没有内容长度怎么办? Q2:这种方法使网络流量加倍。支付这样的开销值得吗 直接发送http GET并使用较小的缓冲区(例如16K字节)。但在接收到所有数据之

目前,我正在使用一个1M大小的缓冲区在read()中包含recv消息(read()的计数为4K字节)。这是我想抓取的最大网页大小。然而,这是一种浪费,因此我也在考虑以下其他方法:

  • 在第一轮发送http HEAD请求,并从标头读取内容长度信息。创建一个大小为内容长度的字符数组,然后发送http GET以检索内容。
    Q1:如果来自服务器的标题信息没有内容长度怎么办?
    Q2:这种方法使网络流量加倍。支付这样的开销值得吗

  • 直接发送http GET并使用较小的缓冲区(例如16K字节)。但在接收到所有数据之前不处理响应,而是在缓冲区满后处理数据,然后清理缓冲区以接收其余数据。
    Q1:这样,爬虫程序可能需要几次迭代才能完全阅读一个大网页。如果处理作业耗费时间且同时读取多个网页,则来自网络的等待数据是否会超过系统缓冲区并导致数据包丢失

  • 谢谢

    目前,我正在使用一个1M大小的缓冲区在read()中包含recv消息(read()的计数为4K字节)。这是我想抓取的最大网页大小。然而,这是一种浪费

    当然是这样。无论如何,每次读取操作的读取量不会超过两个K,因此一个巨大的缓冲区是没有意义的

    在第一轮发送http HEAD请求,并从标头读取内容长度信息。创建一个大小为内容长度的字符数组,然后发送HTTPGET来检索内容

    这是另一个网络操作。也很浪费

    问题1:如果来自服务器的标题信息没有内容长度,该怎么办

    不确定这对HEAD有效,但您必须检查RFC

    问题2:这种方法使网络流量加倍

    不,没有。它将请求/响应对的数量增加一倍。这不是一回事

    支付这样的开销值得吗

    没有

    直接发送http GET并使用较小的缓冲区(例如16K字节)

    当然

    但在收到所有数据之前不处理响应

    为什么不呢?为什么不在收到时进行处理?这是最好的方法。最小的缓冲区,最低的延迟

    而是在缓冲区已满后处理数据,然后清理缓冲区以接收其余数据

    你永远不需要清理缓冲区

    Q1:通过这种方式,爬虫可能需要几次迭代才能完全阅读一个大网页

    从网络上阅读网页或其他任何内容都需要迭代。除非出现EOS或错误,否则recv()函数只能保证在阻塞模型中传输至少一个字节。它没有义务填充缓冲区,除非套接字接收缓冲区也是1M,并且在它填充的两次读取之间浪费了足够的时间,否则它不能填充缓冲区。如果编程正确,这种情况就不会发生

    如果处理作业耗费时间且同时读取多个网页,则来自网络的等待数据是否会超过系统缓冲区并导致数据包丢失


    不是在TCP中。这只会导致发送方暂停并浪费时间。

    Hi EJP感谢您的详细回答。还有两个问题:1。您提到“为什么不在收到时进行处理?”,这里的“处理”是什么意思?它将缓冲区存储到一个单独的容器中,以便以后进行分析/解析工作,还是分析工作本身?2.我得到的减少缓冲区大小的解决方案是:在每个循环中将read()的缓冲区复制到一个灵活的容器中(例如std::string),并在从服务器读取所有数据后在容器上进行分析。这个想法是正确的方向还是有其他更好的范例?谢谢。(1)分析工作本身。(2) 见(1)。开始解析数据的开头不需要数据的结尾。例如,一个编译器,或者一个XML或HTML解析器,可以一次向源文本输入一个字节,每分钟输入一个字节,它仍然会非常满意。你的代码也应该如此。