Laden Sie nur die ersten Bytes einer Quellseite herunter

9

Ich lade die HTML-Quellseite einer Website mit dem cURLBefehl herunter . Das Problem ist, ich möchte nicht die meisten Inhalte auf der Seite. Ich brauche nur die ersten 100 Zeilen der Quellseite. Gibt es eine Möglichkeit, den Download der Seite nach den ersten Zeilen zu stoppen?

Derzeit funktioniert der folgende Befehl, aber er scheint nicht zeiteffektiv zu sein.

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

Ich habe versucht, den Wert von auf 1zu ändern , .5und .05trotzdem wird die gesamte Webseite heruntergeladen.

Ich suche weniger als eine Sekunde Zeit, um den obigen Befehl auszuführen.

BEARBEITEN

Auf der Manpage von cURLsehe ich: " Sie sollten sich auch darüber im Klaren sein, dass auf vielen HTTP / 1.1-Servern diese Funktion nicht aktiviert ist. Wenn Sie also versuchen, einen Bereich abzurufen, erhalten Sie stattdessen das gesamte Dokument. " Der Server unterstützt die Bereichsabfrage nicht. Gibt es einen anderen Befehl in der nixUmgebung, der mir dabei hilft, das zu erreichen, was ich versuche?

Ramesh
quelle

Antworten:

6

Sie können headund den -sSchalter verwenden, curlum einen Teil einer Seite herunterzuladen. Sagen headSie einfach, wie viele Ausgabezeilen Sie möchten.

Beispiel

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

Einzelheiten

  • Das -10to headgibt 10 Zeilen zurück und stoppt dann. Wenn Sie mehr wollen, ändern Sie es Ihren Bedürfnissen entsprechend.
  • Der -sSchalter auf curlweist darauf hin, dass es still sein soll, damit beim Herunterladen der Fortschrittsbalken nicht angezeigt wird.
slm
quelle
1
Das Herunterladen der Inhalte dauert noch einige Zeit. Ich hatte einen Zeitbereich in Millisekunden erwartet, in dem dies geschehen würde.
Ramesh
@Ramesh - ja mir ist aufgefallen, dass es auch ziemlich langsam war. Es scheint einige Zeit zu dauern, bis der Server antwortet.
slm
@Ramesh - gehen Sie lieber mit Curl auf die Website. Vielleicht möchten Sie sich die API ansehen: developer.google.com/freebase
slm
Hmmm, interessant. Mein Freund schlug vor, dass er in Java 300 MS benötigte, um die Daten herunterzuladen, wenn er die Freebase-API verwendete. Ich sagte ihm, dass es mit Shell-Skript erheblich reduziert werden kann. Es scheint eher ein Problem mit dem Server als mit den Shell-Befehlen zu sein.
Ramesh
@Ramesh - Ja, die Langsamkeit liegt in diesem Fall in der Datenbankabfrage und der Aufbereitung dieser Daten zu einer Antwort. Wenn die Datenbank die Daten in anderen Formaten wie JSON verfügbar macht, können Sie die Antwort beschleunigen, indem Sie diese verwenden, anstatt die Ausgabe als HTTP zu verwenden. Die Vorbereitung der Antwort als HTTP ist mit einem Aufwand verbunden, der eine Verschwendung darstellt, wenn der Endnutzungsfall kein Mensch sein wird, der die Ergebnisse liest.
slm
1

Ich habe diese spezielle Anwendung noch nicht wirklich getestet, aber irgendetwas sagt mir, dass Sie hier dd und nc koppeln können:

$ 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) erfordert möglicherweise eine weitere Konfiguration, um die Anforderungsheader richtig zu machen. Wenn es sich jedoch um eine öffentliche Site handelt, sollten Sie in der Lage sein, eine nützliche Ausgabe zu finanzieren, wenn Sie es genug versuchen möchten. Sicherlich nimmt dd nur so viel Eingabe entgegen, wie Sie angeben und beenden, wodurch netcat SIGPIPIERT wird, sodass es sofort folgt. Der einzige wirkliche Trick besteht darin, den anfänglichen Handschlag auszubügeln. Sobald Sie den Stream gestartet haben, können Sie ihn jederzeit löschen.

BEARBEITEN

Das Lesen der Kommentare von slm hat mich veranlasst, diesem Antrag zuzustimmen. Wenn Sie einen JSON-POST im richtigen Format serialisieren können, ist dies definitiv der richtige Weg, um eine schnellere Antwort zu erhalten. Das Parsen von HTML ist sowieso für die Vögel.

Ein nützlicher Trick zu diesem Zweck besteht darin, Ihren Netzwerkstrom zu erfassen, während Sie mit dem Server in Ihrem Browser kommunizieren. Wenn Ihr Browser dann den POST sendet, der Ihnen das liefert, was Sie möchten, senden Sie ihn stattdessen erneut als GET und sehen Sie sich die Ergebnisse an.

mikeserv
quelle
1

Der headBefehl stoppt normalerweise den Download, bevor er beendet wird (obwohl er bei kurzen Dateien möglicherweise den Pipe-Puffer füllt, bevor die Pipe geschlossen wird). Dies liegt daran, dass beim Schließen einer Pipe curlnirgendwo geschrieben werden kann (Dateideskriptor ist geschlossen, Schreiben schlägt fehl).

Nach meiner Erfahrung wartet das Herunterladen jedoch am längsten auf DNS-Anforderungen (schmerzhaft, wenn Sie Hunderte von Dateien nacheinander herunterladen). Dies kann mit einem lokalen DNS-Cache wie dnsmasqunterstützt werden. Wenn Sie denselben Domainnamen mehrmals mit unterschiedlicher Verzeichnisstruktur verwenden, lösen Sie ihn einfach einmal in eine IP auf und ersetzen Sie die URL.

Um meinen Standpunkt zu beweisen ... versuchen Sie es mit time netstatVersus time netstat -n(ohne Cache ist der Unterschied dramatisch, mit Cache ist es nur beim ersten Mal schlecht, dann erinnert es sich).

Orion
quelle