завантажте лише перші кілька байтів сторінки джерела


9

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

Наразі у мене працює нижченаведена команда, але, здається, це не ефективно.

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

Я спробував змінити значення від 1до .5і .05і до сих пір все веб - сторінка стає завантажена.

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

EDIT

З підручної сторінки сторінки 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говорить , що це буде мовчати , тому він не буде доступний широкому індикатор виконання у час завантаження.

1
Для завантаження вмісту все ще потрібно багато часу. Я очікував, що це станеться в мілі секунди.
Рамеш

@Ramesh - так, я помітив, що це теж досить повільно. Здається, сервер потребує певного часу, щоб відповісти.
slm

@Ramesh - скоріше заходьте на сайт за допомогою curl, який ви можете поглянути на API: developers.google.com/freebase
slm

Хммм, цікаво. Мій друг припускав, що в Java, якщо він використовує API безкоштовної бази, йому знадобиться 300 MS для завантаження даних. Я сказав йому, що це може бути значно зменшено за допомогою сценарію оболонки. Здається, проблема з сервером, а не командами оболонки.
Рамеш

@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) може зажадати подальшої конфігурації, щоб отримати правильні заголовки запиту, але якщо це загальнодоступний веб-сайт, ви повинні мати змогу зафіксувати корисний вихід, якщо вам достатньо подбати, щоб спробувати. Безумовно, ДД візьме лише стільки вхідних даних, скільки Ви вкажете та вийдете, і це буде SIGPIPE netcat, щоб воно негайно слідувало відповідності. Єдиний справжній трюк - прасування початкового рукостискання - як тільки ви запустите потік, ви можете його скинути, коли завгодно.

EDIT

Читання коментарів до slm спонукало мене до цього руху; якщо ви можете серіалізувати JSON POST у правильному форматі, це безумовно шлях для більш своєчасного реагування. Розбір HTML в будь-якому випадку для птахів.

Один корисний трюк для цієї мети - захопити ваш мережевий потік під час спілкування з сервером у вашому браузері, тоді коли ваш браузер надсилає POST, який отримує те, що ви хочете, надішліть його знову як GET, а також ознайомтеся з результатами.


1

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

Однак, на мій досвід, найдовше під час завантаження чекають запити DNS (боляче, коли ви завантажуєте сотні файлів послідовно). У цьому можна допомогти локальному кешу DNS, dnsmasqабо, якщо ви використовуєте одне і те ж доменне ім’я багато разів із різною структурою каталогу, просто вирішіть його до IP-адреси один раз і зробіть заміну в URL-адресі.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.