2009-05-05 164 views
2

我工作的一個老同學的Linux變種(QNX是精確的),並需要一種方法來抓取網頁使用無非是插座陣列(無cookie或登錄,目標URL只是一個文本文件)。在C中抓取網頁的最簡單方法是什麼?

任何人都得到了這樣的片段?

注:我不控制的服務器和我有很少用,除了那些已經是包裝盒上的工作(在添加額外的庫是不是真的「易」給出的約束上 - 雖然我的愛libcurl中)

+0

你能保證沒有代理,沒有SSL,沒有gzip?你是否控制服務器? – MSalters 2009-05-05 15:12:44

+1

你說只使用套接字和數組,但是如果你想重新考慮,使用wget並將它的輸出傳送給一個文件處理程序: FILE * fp = popen(「wget --quiet -O - http://www.google .com「,」r「) – 2009-05-05 15:18:06

+1

不重要,但從什麼時候開始是QNX的Linux變體?它們都是類Unix,但是AFAIK之間沒有直接的關係。 QNX是一個微內核,Linus很不喜歡這些。 – 2009-05-05 15:19:05

回答

8

我有一些代碼,但它也支持(開)SSL所以這是一個有點長,張貼在這裏。

本質:

  • 解析URL(拆出URL方案,主機名,端口號,方案的具體部分

  • 創建套接字:

    s = socket(PF_INET, SOCK_STREAM, proto);

  • 使用遠程IP和端口填充sockaddr_in結構

  • 插座連接到遠端:

    err = connect(s, &addr, sizeof(addr));

  • 發出請求字符串:

    n = snprinf(headers, "GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n", ...);

  • 發送請求字符串:

    write(s, headers, n);

  • 讀取數據:

    while (n = read(s, buffer, bufsize) > 0) { ... }

  • 關閉套接字:

    close(s);

NB:上面的僞代碼將收集既響應頭數據。兩者之間的分裂是第一個空白行。

9

我想看看libcurl如果你想支持SSL或任何幻想。

但是,如果你只是想從一個80端口獲得一個簡單的網頁,那麼只需打開一個tcp套接字,發送「GET /index.html HTTP/1.0\n\r\n\r」並解析輸出。

相關問題