Linux企業級專案實踐之網路爬蟲(13)——處理user-agent

尹成發表於2014-08-31
User Agent即使用者代理,是Http協議中的一部分,屬於頭域的組成部分,User Agent也簡稱UA。它是一個特殊字串頭,是一種向訪問網站提供你所使用的瀏覽器型別及版本、作業系統及版本、瀏覽器核心、等資訊的標識。通過這個標識,使用者所訪問的網站可以顯示不同的排版從而為使用者提供更好的體驗或者進行資訊統計。


瀏覽器的UA字串的標準格式:瀏覽器標識 (作業系統標識; 加密等級標識; 瀏覽器語言) 渲染引擎標識版本資訊。但各個瀏覽器有所不同。


字串說明:
1、瀏覽器標識
出於相容及推廣等目的,很多瀏覽器的標識相同,因此瀏覽器標識並不能說明瀏覽器的真實版本,真實版本資訊在 UA 字串尾部可以找到。


2、作業系統標識


3、加密等級標識
N: 表示無安全加密
I: 表示弱安全加密
U: 表示強安全加密

4、瀏覽器語言
在首選項 > 常規 > 語言中指定的語言

5、渲染引擎
顯示瀏覽器使用的主流渲染引擎有:Gecko、WebKit、KHTML、Presto、Trident、Tasman等,格式為:渲染引擎/版本資訊

6、版本資訊

顯示瀏覽器的真實版本資訊,格式為:瀏覽器/版本資訊


int send_request(int fd, void *arg)
{
    int need, begin, n;
    char request[1024] = {0};
    Url *url = (Url *)arg;

    sprintf(request, "GET /%s HTTP/1.0\r\n"
            "Host: %s\r\n"
            "Accept: */*\r\n"
            "Connection: Keep-Alive\r\n"
            "User-Agent: Mozilla/5.0 (compatible; Qteqpidspider/1.0;)\r\n"
            "Referer: %s\r\n\r\n", url->path, url->domain, url->domain);

    need = strlen(request);
    begin = 0;
    while(need) {
        n = write(fd, request+begin, need);
        if (n <= 0) {
            if (errno == EAGAIN) { //write buffer full, delay retry
                usleep(1000);
                continue;
            }
            SPIDER_LOG(SPIDER_LEVEL_WARN, "Thread %lu send ERROR: %d", pthread_self(), n);
            free_url(url);
            close(fd);
            return -1;
        }
        begin += n;
        need -= n;
    }
    return 0;
}


相關文章