загрузить только первые несколько байтов исходной страницы

9

Я загружаю исходную страницу HTML сайта с помощью cURLкоманды. Проблема в том, что я не хочу большую часть содержимого на странице. Мне просто нужны первые 100 строк исходной страницы. Есть ли способ остановить загрузку страницы после первых нескольких строк?

В настоящее время у меня работает приведенная ниже команда, но она не эффективна по времени.

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

Я попытался изменить значение с 1на .5и, .05и все же вся веб-страница загружается.

Я смотрю на время менее секунды, чтобы выполнить вышеуказанную команду.

РЕДАКТИРОВАТЬ

Со страницы руководства cURLя вижу, что « вы также должны знать, что на многих серверах HTTP / 1.1 эта функция не включена, поэтому при попытке получить диапазон вы получите весь документ ». сервер не поддерживает запрос диапазона, есть ли какая-либо другая команда в nixсреде, которая поможет мне выполнить то, что я пытаюсь сделать?

Рамеш
источник

Ответы:

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>

подробности

  • -10Для headвозвратит 10 строк , а затем остановиться. Если вы хотите больше, измените его в соответствии с вашими потребностями.
  • -sПереключатель , чтобы curlговорит , что это будет молчать , поэтому он не будет отображаться индикатор выполнения во время загрузки.
SLM
источник
1
Загрузка контента все еще занимает много времени. Я ожидал, что это произойдет в миллисекундах.
Рамеш
@ Рамеш - да, я заметил, что это было довольно медленно. Судя по всему, сервер отвечает.
SLM
@Ramesh - вместо этого зайдите на сайт с помощью curl. Возможно, вы захотите взглянуть на API: developers.google.com/freebase
slm
Хм, интересно. Мой друг предположил, что в Java, если он использовал API freebase, ему потребовалось 300 мс для загрузки данных. Я сказал ему, что это может быть значительно уменьшено с помощью сценария оболочки. Кажется, проблема с сервером, а не с командами оболочки.
Рамеш
@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 и посмотрите на результаты.

mikeserv
источник
1

Команда headобычно останавливает загрузку до ее завершения (хотя для коротких файлов она может заполнить буфер канала до закрытия канала). Это потому, что когда канал закрыт, curlему некуда писать (дескриптор файла закрыт, запись не удалась).

Однако, по моему опыту, самое длинное при загрузке - это ожидание DNS-запросов (болезненно, когда вы загружаете сотни файлов последовательно). Это может помочь с локальным DNS-кешем, например, dnsmasqили, если вы используете одно и то же доменное имя много раз с разной структурой каталогов, просто разрешите его один раз в IP и выполните замену URL.

Чтобы доказать мою точку зрения ... попробуй time netstatпротив time netstat -n(без кеша разница драматична, с кешем плохо только в первый раз, потом вспоминает).

Орион
источник