Linux企业级项目实践之网络爬虫(17)——存储页面

在爬虫系统中数据的流量相当大,要处理的数据内容不仅包括爬虫系统的各种数据结构空间,而且包括从外部节点中得到的各种数据,比如HTTP请求,HTML页面,ROBOT.TXT等等。如果对这些内容处理不当,那么不仅造成空间的冗余浪费,使爬虫程序效率降低,而且还可能会使系统崩溃。所以,要有合适的空间分配策略。
空间分配与管理方案。
在内存中使用缓冲空间,以快速的得到、存储数据。
统一各种请求的结构,应该合理利用并在每次用完后进行回收。比如,ROBOT.TXT文件,HTTP请求头及相应的应答。这种方式,在站点数目数量相当庞大的情况下,非常有必要。

在页面的抓取部分和保存部分之间设置合适的接口,直接进行数据交换,从而使系统不必分配更多的空间来缓冲数据。数据缓冲功能由保存部分内部实现。


static int handler(void * data) {
    Response *r = (Response *)data;
    
    if (strstr(r->header->content_type, "text/html") == NULL)
        return MODULE_ERR;

    char *fn = url2fn(r->url);
    int fd = -1;
    if ((fd = open(fn, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) {
        return MODULE_ERR;
    }

    int left = r->body_len;
    int n = -1;
    while (left) {
        if ((n = write(fd, r->body, left)) < 0) {
            // error
            close(fd);
            unlink(fn);
            free(fn);
            return MODULE_ERR;
        } else {
            left -= n;
        }
    }
    close(fd);
    free(fn);
    return MODULE_OK;
}


原文地址:https://www.cnblogs.com/new0801/p/6176994.html