我工作的一個老同學的Linux變種(QNX是精確的),並需要一種方法來抓取網頁使用無非是插座陣列(無cookie或登錄,目標URL只是一個文本文件)。在C中抓取網頁的最簡單方法是什麼?
任何人都得到了這樣的片段?
注:我不控制的服務器和我有很少用,除了那些已經是包裝盒上的工作(在添加額外的庫是不是真的「易」給出的約束上 - 雖然我的愛libcurl中)
我工作的一個老同學的Linux變種(QNX是精確的),並需要一種方法來抓取網頁使用無非是插座陣列(無cookie或登錄,目標URL只是一個文本文件)。在C中抓取網頁的最簡單方法是什麼?
任何人都得到了這樣的片段?
注:我不控制的服務器和我有很少用,除了那些已經是包裝盒上的工作(在添加額外的庫是不是真的「易」給出的約束上 - 雖然我的愛libcurl中)
我有一些代碼,但它也支持(開)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:上面的僞代碼將收集既響應頭和數據。兩者之間的分裂是第一個空白行。
我想看看libcurl如果你想支持SSL或任何幻想。
但是,如果你只是想從一個80端口獲得一個簡單的網頁,那麼只需打開一個tcp套接字,發送「GET /index.html HTTP/1.0\n\r\n\r
」並解析輸出。
你能保證沒有代理,沒有SSL,沒有gzip?你是否控制服務器? – MSalters 2009-05-05 15:12:44
你說只使用套接字和數組,但是如果你想重新考慮,使用wget並將它的輸出傳送給一個文件處理程序: FILE * fp = popen(「wget --quiet -O - http://www.google .com「,」r「) – 2009-05-05 15:18:06
不重要,但從什麼時候開始是QNX的Linux變體?它們都是類Unix,但是AFAIK之間沒有直接的關係。 QNX是一個微內核,Linus很不喜歡這些。 – 2009-05-05 15:19:05