wget захватывает пустые файлы, которые фактически существуют

У меня есть сценарий, предназначенный для загрузки определенного количества файлов с удаленного сервера. Это нужно делать только каждые 24 часа, поскольку они являются источниками JSON для базы данных на моем сервере. Файлы обновляются на удаленном сервере около полуночи GMT, а мой скрипт запускается через час после этого, чтобы убедиться, что они уже правильно обновлены.

Проблема в том, что я постоянно замечаю, что он не может загрузить по меньшей мере двадцать или более из 132 файлов, за исключением того, что он не считает, что это вообще не сработало (я вижу 200 OK). Это JSON, поэтому они имеют размер не более 8 КБ. В файле журнала 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-байтные файлы, каждый раз не прерываясь в тех же файлах. Удручающая часть – никаких ошибок в любом месте, поэтому ничто не попадает в журнал ошибок …

no-clobber в данном случае не имеет значения. Файлы должны быть перезаписаны, поскольку они устаревают каждые 24 часа, и даже «хорошие данные» за день до этого являются «плохими данными» сегодня.

Есть ли где-нибудь, что я мог бы улучшить свой скрипт, чтобы проверить размер файла или что-то еще перед загрузкой? Я попробовал на своем Mac дома и получил тот же точный результат, даже используя «режим паука», чтобы проверить, существует ли он в первую очередь. Самая неприятная часть заключается в том, что если я должен вставить URL-адрес в браузер, он загружает весь JSON так же, как и должен … Я считаю, что «повторы» не помогут, так как wget не работает в каких-либо HTTP-ошибках.

2 Solutions collect form web for “wget захватывает пустые файлы, которые фактически существуют”

Есть ли где-нибудь, что я мог бы улучшить свой скрипт, чтобы проверить размер файла или что-то еще перед загрузкой?

Прежде чем загрузка не будет иметь никакого смысла, потому что, очевидно, сервер не может правильно ответить на ваши запросы на загрузку. Он должен либо вернуть правильный файл, либо он должен вернуть код ошибки HTTP, но, по-видимому, он этого не делает. Вы можете попытаться определить размер удаленного файла с помощью HTTP HEAD запроса, но это не поможет вам, когда удаленный файл будет в порядке, но доставка GET все равно не удастся.

Вместо этого используйте цикл в вашем скрипте, чтобы просмотреть все файлы, которые вы хотите загрузить. Загрузите каждый файл с помощью одного запроса wget , а затем проверьте размер файла загруженного вами файла. Если это файл размером 0 байт, и вы уверены, что этого не должно быть, повторите запрос. Разумеется, вы должны добавить отказоустойчивый лимит, чтобы ваш скрипт не повторял запрос бесконечно, если он всегда терпит неудачу, а может быть и задержка (в случае, если на сервере ставка ограничена вашими запросами и не выполняется их намеренно).

Возможно, вы захотите попробовать включить отладочный переключатель 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] 
  • Wget: ошибка сегментации (сбрасывание ядра)
  • Возможно ли объединить --span-hosts с --no-parent в wget?
  • Как я могу преобразовать все html-файлы, которые я получаю в текстовые файлы после команды wget?
  • Как прервать wget после получения N раз файла не найден?
  • Запустите страницу на imgur
  • Использование / dev / tcp с прокси-сервером
  • wget и cURL - явный адрес IPv6
  • Загрузите, добавив после некоторого процентного завершения
  • как установить папку назначения для wget?
  • Сценарий Bash, создающий нежелательные файлы
  • Использование переменной даты с помощью wget -post-data
  • Linux и Unix - лучшая ОС в мире.