我工作的一个老同学的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