仅下载源页面的前几个字节


9

我正在使用cURL命令下载网站的HTML源页面。问题是,我不需要页面中的大多数内容。我只需要源页面的前100行。在头几行之后,有没有办法停止下载该页面?

目前,我正在使用以下命令,但它似乎并不有效。

curl -r[0-1] "http://www.freebase.com/m/045c7b" > foo.txt

我试图改变的价值1,以.5.05,目前仍是整个网页是越来越下载。

我正在等待不到一秒钟的时间来执行上述命令。

编辑

从的手册页中cURL,我看到“ 您还应该知道许多HTTP / 1.1服务器没有启用此功能,因此当您尝试获取范围时,您将获得整个文档。 ”服务器不支持范围查询,nix环境中是否还有其他命令可以帮助我完成尝试做的事情?

Answers:


6

您可以使用head-s开关curl下载页面的一部分。只需说出head您想要多少行输出即可。

$ curl -r[0-1] "http://www.freebase.com/m/045c7b" -s 2>&1 | head -10
Warning: Invalid character is found in given range. A specified range MUST 
Warning: have only digits in 'start'-'stop'. The server's response to this 
Warning: request is uncertain.


  <!DOCTYPE html PUBLIC "null" "null">
  <html class="no-js" dir="ltr" lang="en">
    <head>
      <meta charset="utf-8">
      <title>

细节

  • -10head会返回10行,然后停止。如果您想要更多,请进行更改以适合您的需求。
  • -s开关curl告诉它是无声的,所以它不会显示在下载进度条。

1
下载内容仍需要花费大量时间。我原本希望发生这种情况的时间范围是毫秒。
拉梅什2014年

@Ramesh-是的,我注意到它也相当慢。服务器似乎需要一些时间才能回复。
slm

@Ramesh-而不是使用curl进入该网站,您可能想看一下API:developers.google.com/freebase
slm

嗯,有趣。我的朋友建议在Java中,如果他使用freebase API,则需要300毫秒才能下载数据。我告诉他使用shell脚本可以大大减少它。服务器而不是shell命令似乎有问题。
拉梅什2014年

@Ramesh-是的,在这种情况下,速度很慢是在数据库查询中以及将数据准备为响应时。如果数据库以其他格式(如JSON)公开数据,则可以利用该响应来加快响应速度,而不必将输出作为HTTP。如果最终用例不是要阅读结果的人,那么将响应准备为HTTP会产生开销,这是浪费。
slm

1

我还没有真正测试过这个特定的应用程序,但是有些事情告诉我,您可以在此处将dd和nc配对:

$ nc www.website.com 80 <<GOT | dd bs=$BYTE_COUNT iflag=fullblock \
     count=1 of=$OUTFILE
GET / HTTP/1.1
Host: ispconfig.org
Referrer: mypage.com
User-Agent: my-browser
$(printf %b '\r\r')
GOT

Netcat(nc)可能需要进一步配置才能正确获得请求标头,但如果它是公共站点,则如果您足够尝试尝试,则应该可以输出有用的输出。当然,dd将只接受您指定并退出的输入,这将使SIGPIPE netcat紧随其后。唯一真正的技巧是消除最初的握手-一旦启动流,就可以随时将其丢弃。

编辑

阅读slm的评论促使我赞成该议案。如果您可以将JSON POST序列化为正确的格式,那么绝对可以采用这种方法来进行更及时的响应。不管怎样,解析HTML是针对小鸟的。

为此,一个有用的技巧是在与浏览器中的服务器进行通信时捕获网络流,然后在浏览器发送POST时获得您想要的内容,而不是再次以GET形式发送它,然后查看结果。


1

head命令通常会在下载结束之前停止下载(尽管对于短文件,下载可能会在关闭管道之前填充管道缓冲区)。这是因为当管道关闭时,curl无处写入(文件描述符关闭,写入失败)。

但是,以我的经验,下载时最长的事情是等待DNS请求(当您顺序下载数百个文件时很痛苦)。可以使用本地DNS缓存来解决此问题,例如dnsmasq,如果您多次使用相同的域名使用不同的目录结构,则只需将其解析为IP一次并替换URL。

为了证明我的观点...尝试time netstattime netstat -n(没有缓存,差异是巨大的,有了缓存,第一次就不好了,然后就记住了)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.