2009-05-05 123 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”并解析输出。

相关问题