我有一个脚本,旨在从远程服务器下载一定数量的文件。它只需要每 24 小时执行一次此操作,因为它们是我服务器上数据库的 JSON 源。这些文件在格林尼治标准时间午夜左右在远程服务器上更新,我的脚本在那之后运行一个小时,以确保它们已经正确更新。
问题是我一直注意到它无法下载 132 个文件中的至少 20 个或更多文件,但它认为它根本没有失败(我看到 200 OK)。它们是 JSON,因此大小最多为 8KB。在 wget 日志文件中,我看到:
--2013-09-21 12:01:10-- http://services.runescape.com/m=itemdb_rs/api/graph/19227.json
Reusing existing connection to services.runescape.com:80.
HTTP request sent, awaiting response... 200 OK
Length: 0 [text/html]
Saving to: `./jsons/19227.json'
0K 0.00 =0s
2013-09-21 12:01:10 (0.00 B/s) - `./jsons/19227.json' saved [0/0]
这没有任何意义。失败没有任何规律或理由。我重试了很多次,每次都随机写入 0 字节文件,而不是每次都在相同的文件上失败。令人沮丧的是,任何地方都没有错误,因此错误日志中没有捕获任何内容......
在这种情况下,无破坏并不重要。这些文件会被覆盖,因为它们每 24 小时就会过时,甚至前一天的“好数据”今天也会变成“坏数据”。
有什么地方可以改进我的脚本以在下载之前检查文件大小或其他内容吗?我在家里的 Mac 上尝试了一下,得到了同样的结果,甚至使用“蜘蛛模式”先检查它是否存在。最令人沮丧的部分是,如果我将 URL 粘贴到浏览器中,它会按应有的方式加载整个 JSON...我认为“重试”不会有帮助,因为 wget 无论如何都不会遇到任何 HTTP 错误。
答案1
您可能想尝试打开 的wget
调试开关-d
来看看发生了什么。
例子
$ wget -d http://services.runescape.com/m=itemdb_rs/api/graph/19227.json
DEBUG output created by Wget 1.12 on linux-gnu.
--2013-09-21 13:22:46-- http://services.runescape.com/m=itemdb_rs/api/graph/19227.json
Resolving services.runescape.com... 216.115.77.143, 8.26.16.145, 62.67.0.145, ...
Caching services.runescape.com => 216.115.77.143 8.26.16.145 62.67.0.145 64.94.237.145
Connecting to services.runescape.com|216.115.77.143|:80... connected.
Created socket 3.
Releasing 0x0000000000f251e0 (new refcount 1).
---request begin---
GET /m=itemdb_rs/api/graph/19227.json HTTP/1.0
Referer: http://www.google.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Host: services.runescape.com
Connection: Keep-Alive
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
---request end---
HTTP request sent, awaiting response...
---response begin---
HTTP/1.1 200 OK
Date: Sat, 21-Sep-2013 17:22:47 GMT
Server: JAGeX/3.1
Content-type: text/html; charset=ISO-8859-1
Content-Encoding: gzip
Cache-control: no-cache
Pragma: no-cache
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Set-Cookie: settings=wwGlrZHF5gKN6D3mDdihco3oPeYN2KFybL9hUUFqOvk; version=1; path=/; domain=.runescape.com; Expires=Tue, 20-Sep-2016 17:22:47 GMT; Max-Age=94608000
Connection: Keep-alive
Content-length: 1668
---response end---
200 OK
cdm: 1 2 3 4 5 6 7 8
Stored cookie runescape.com -1 (ANY) / <permanent> <insecure> [expiry 2016-09-20 13:22:47] settings wwGlrZHF5gKN6D3mDdihco3oPeYN2KFybL9hUUFqOvk
Registered socket 3 for persistent reuse.
Length: 1668 (1.6K) [text/html]
Saving to: “19227.json”
100%[==============================================================================================================================>] 1,668 --.-K/s in 0.08s
2013-09-21 13:22:47 (21.4 KB/s) - “19227.json” saved [1668/1668]
答案2
有什么地方可以改进我的脚本以在下载之前检查文件大小或其他内容吗?
前下载没有任何意义,因为显然服务器无法正确回复您的下载请求。它应该返回正确的文件或者返回 HTTP 错误代码,但显然两者都没有。您可以尝试使用 HTTP 请求确定远程文件大小,但是当远程文件正常但传送仍然失败HEAD
时,这不会有任何好处。GET
相反,请在脚本中使用循环来循环访问要下载的所有文件。通过单个wget
请求下载每个文件,然后检查已下载文件的文件大小。如果它是 0 字节文件并且您确定它不应该是,请重复该请求。当然,您应该添加一个故障安全限制,这样您的脚本就不会在总是失败的情况下无休止地重复请求,也可能会延迟(如果服务器限制您的请求速率并故意使它们失败)。
答案3
删除目标目录中的空文件。我就是做这个的。
wget -c -t 40 -O /path/to/dir/myfile1
wget -c -t 40 -O /path/to/dir/myfile2
查找/path/to/dir -empty -type f -delete
...所有空的 myfile 都消失了。