pobierz tylko kilka pierwszych bajtów strony źródłowej

9

Pobieram stronę źródłową HTML witryny za pomocą cURLpolecenia. Problem polega na tym, że nie chcę większości treści na stronie. Potrzebuję tylko pierwszych 100 wierszy strony źródłowej. Czy istnieje sposób, aby zatrzymać pobieranie strony po kilku pierwszych wierszach?

Obecnie mam poniższe polecenie działające, ale nie wydaje się to skuteczne czasowo.

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

Próbowałem zmianę wartości od 1do .5i .05i jeszcze cała strona internetowa jest coraz pobrane.

Patrzę na czas krótszy niż sekunda na wykonanie powyższego polecenia.

EDYTOWAĆ

Ze strony podręcznika cURLwidzę, że „ powinieneś również pamiętać, że wiele serwerów HTTP / 1.1 nie ma włączonej tej funkcji, więc gdy spróbujesz uzyskać zakres, zamiast tego otrzymasz cały dokument. ” Więc jeśli serwer nie obsługuje zapytań o zakres, czy jest jakieś inne polecenie w nixśrodowisku, które pomoże mi osiągnąć to, co próbuję zrobić?

Ramesh
źródło

Odpowiedzi:

6

Możesz użyć headi -sprzełącznika, curlaby pobrać część strony. Po prostu powiedz, headile linii wyjściowych chcesz.

Przykład

$ 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>

Detale

  • -10Aby headpowróci 10 linii, a następnie zatrzymać. Jeśli chcesz więcej, zmień je zgodnie z własnymi potrzebami.
  • -sPrzełącznik curlmówi się, że jest cichy, więc nie będzie wyświetlany pasek postępu podczas pobierania.
slm
źródło
1
Pobieranie zawartości zajmuje dużo czasu. Spodziewałem się tego w milisekundach.
Ramesh
@Ramesh - tak, zauważyłem, że było to również zbyt wolne. Odpowiedź na serwer wymaga trochę czasu.
slm
@Ramesh - zamiast tego przejdź na stronę za pomocą curl, możesz rzucić okiem na API: developers.google.com/freebase
slm
Hmmm, ciekawe. Mój przyjaciel sugerował, że w Javie, jeśli używał Freebase API, pobranie danych zajęło mu 300 MS. Powiedziałem mu, że można to znacznie zmniejszyć za pomocą skryptu powłoki. Wydaje się, że jest to problem z serwerem, a nie z poleceniami powłoki.
Ramesh
@ Ramesh - Tak, powolność w tym przypadku polega na zapytaniu do bazy danych i przygotowaniu tych danych do odpowiedzi. Jeśli baza danych ujawnia dane w innych formatach, tak jak JSON, możesz przyspieszyć odpowiedź, wykorzystując to zamiast brać dane wyjściowe jako HTTP. Przygotowanie odpowiedzi jako HTTP jest narzutem, który jest marnotrawstwem, jeśli końcowym przypadkiem użycia nie będzie człowiek czytający wyniki.
slm
1

Nie przetestowałem jeszcze tej konkretnej aplikacji, ale coś mi mówi, że możesz sparować dd i nc tutaj:

$ 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) może wymagać dalszej konfiguracji, aby uzyskać prawidłowe nagłówki żądań, ale jeśli jest to witryna publiczna, powinieneś być w stanie sfinalizować przydatne wyjście, jeśli zależy ci na tym, aby spróbować. Z pewnością dd pobierze tylko tyle danych, ile podasz i opuścisz, co spowoduje SIGPIPE netcat, aby natychmiast podążył za nim. Jedyną prawdziwą sztuczką jest ułożenie początkowego uścisku dłoni - po uruchomieniu strumienia możesz go upuścić w dowolnym momencie.

EDYTOWAĆ

Czytanie komentarzy SLM skłoniło mnie do poparcia tego ruchu; jeśli możesz serializować JSON POST we właściwym formacie, to zdecydowanie sposób na uzyskanie bardziej terminowej odpowiedzi. W każdym razie parsowanie HTML jest dla ptaków.

Jedną z przydatnych sztuczek w tym celu jest przechwytywanie strumienia sieciowego podczas komunikacji z serwerem w przeglądarce, a następnie, gdy przeglądarka wysyła test POST, który dostaje to, co chcesz, wysłać go ponownie jako GET i rzuć okiem na wyniki.

mikeserv
źródło
1

headKomenda zazwyczaj zatrzymać pobieranie zanim to się skończy (choć dla krótkich plików może wypełnić bufor rury przed rura jest zamknięta). Wynika to z faktu, że gdy potok jest zamknięty, curlnie ma gdzie pisać (deskryptor pliku jest zamknięty, zapis nie powiedzie się).

Z mojego doświadczenia wynika jednak, że najdłuższą rzeczą podczas pobierania jest oczekiwanie na żądania DNS (bolesne, gdy pobierasz setki plików sekwencyjnie). Można temu zaradzić w lokalnej pamięci podręcznej DNS, takiej jak dnsmasqlub, jeśli używasz tej samej nazwy domeny wiele razy z inną strukturą katalogów, po prostu zamień ją na adres IP i wykonaj zamianę adresu URL.

Aby udowodnić, o co mi chodzi ... spróbuj time netstatkontra time netstat -n(bez pamięci podręcznej różnica jest dramatyczna, z pamięcią podręczną jest tylko zła za pierwszym razem, a potem pamięta).

orion
źródło