ดาวน์โหลดเฉพาะสองสามไบต์แรกของหน้าแหล่งที่มา


9

ฉันกำลังดาวน์โหลดหน้า HTML ต้นฉบับของเว็บไซต์โดยใช้cURLคำสั่ง ปัญหาคือฉันไม่ต้องการเนื้อหาส่วนใหญ่ในหน้า ฉันต้องการ 100 บรรทัดแรกของหน้าแหล่งที่มา มีวิธีหยุดการดาวน์โหลดของหน้าหลังจากสองสามบรรทัดแรกหรือไม่

ขณะนี้ฉันมีคำสั่งด้านล่างใช้งานได้ แต่ดูเหมือนว่าจะไม่มีประสิทธิภาพ

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

ฉันพยายามเปลี่ยนค่าจาก1ไป.5และ.05และยังคงหน้าเว็บทั้งหมดจะได้รับการดาวน์โหลด

ฉันกำลังดูเวลาน้อยกว่าหนึ่งวินาทีเพื่อรันคำสั่งข้างต้น

แก้ไข

จากหน้า man ของ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>

รายละเอียด

  • The -10ถึงheadจะส่งคืน 10 บรรทัดจากนั้นหยุด หากคุณต้องการมากกว่านี้ให้เปลี่ยนให้เหมาะกับความต้องการของคุณ
  • -sสลับไปcurlบอกว่ามันจะเงียบจึงจะไม่แสดงแถบความคืบหน้าในขณะที่การดาวน์โหลด

1
ยังคงต้องใช้เวลาพอสมควรในการดาวน์โหลดเนื้อหา ฉันคาดว่าจะมีช่วงเวลาเป็นมิลลิวินาทีเพื่อให้สิ่งนี้เกิดขึ้น
Ramesh

@Ramesh - ใช่ฉันสังเกตว่ามันค่อนข้างช้าเช่นกัน ดูเหมือนว่าจะใช้เวลาพอสมควรสำหรับเซิร์ฟเวอร์ที่จะตอบกลับ
slm

@Ramesh - จากนั้นไปที่ไซต์โดยใช้ curl คุณอาจต้องการดู API: developers.google.com/freebase
slm

อืมน่าสนใจ เพื่อนของฉันแนะนำว่าใน Java ถ้าเขาใช้ freebase API เขาใช้เวลา 300 MS ในการดาวน์โหลดข้อมูล ฉันบอกเขาว่ามันจะลดลงอย่างมากโดยใช้เชลล์สคริปต์ ดูเหมือนว่ามีปัญหากับเซิร์ฟเวอร์มากกว่าคำสั่งเชลล์
Ramesh

@Ramesh - ใช่ความเชื่องช้าในกรณีนี้คือการสืบค้นฐานข้อมูลและการเตรียมข้อมูลนั้นไว้ในการตอบสนอง หากฐานข้อมูลแสดงข้อมูลในรูปแบบอื่นเช่นเดียวกับ JSON คุณสามารถเร่งการตอบสนองได้โดยใช้สิ่งนั้นแทนที่จะใช้เอาต์พุตเป็น HTTP มีค่าใช้จ่ายในการเตรียมการตอบกลับเนื่องจาก HTTP เป็นของเสียหากการใช้ปลายทางไม่เป็นผลที่มนุษย์จะอ่าน
slm

1

ฉันยังไม่ได้ทดสอบแอปพลิเคชันนี้โดยเฉพาะจริงๆ แต่มีบางอย่างบอกฉันว่าคุณสามารถจับคู่ววและปดที่นี่:

$ 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) อาจต้องมีการกำหนดค่าเพิ่มเติมเพื่อให้ได้รับส่วนหัวของการร้องขอที่ถูกต้อง แต่ถ้ามันเป็นเว็บไซต์สาธารณะคุณควรจะสามารถ finagle ผลลัพธ์ที่มีประโยชน์ถ้าคุณสนใจพอที่จะลอง แน่นอนว่า dd จะรับอินพุตให้มากที่สุดเท่าที่คุณระบุและออกซึ่งจะ SIGPIPE netcat เพื่อให้มันตามหลังชุดสูททันที เคล็ดลับที่แท้จริงเพียงอย่างเดียวคือการจับมือเริ่มต้นเมื่อคุณเริ่มการสตรีมคุณสามารถวางมันได้ทุกเมื่อที่คุณต้องการ

แก้ไข

การอ่านความคิดเห็นของ slm ทำให้ฉันได้รับความนิยมในวินาทีนั้น หากคุณสามารถทำให้เป็นอันดับ JSON POST ในรูปแบบที่ถูกต้องนั่นคือหนทางที่จะตอบสนองได้รวดเร็วยิ่งขึ้น การแยก HTML สำหรับนก

เคล็ดลับที่มีประโยชน์อย่างหนึ่งคือการจับกระแสข้อมูลเครือข่ายของคุณในขณะที่สื่อสารกับเซิร์ฟเวอร์ในเบราว์เซอร์ของคุณจากนั้นเมื่อเบราว์เซอร์ของคุณส่ง POST เพื่อให้ได้สิ่งที่คุณต้องการส่งอีกครั้งในฐานะ GET แทนและดูผลลัพธ์


1

โดยheadปกติคำสั่งจะหยุดการดาวน์โหลดก่อนที่จะสิ้นสุด (แม้ว่าไฟล์สั้น ๆ มันอาจเติมบัฟเฟอร์ของท่อก่อนที่จะปิดท่อ) นี่เป็นเพราะเมื่อปิดไปป์curlไม่มีที่ให้เขียน (ไฟล์ descriptor ถูกปิดการเขียนล้มเหลว)

อย่างไรก็ตามจากประสบการณ์ของฉันสิ่งที่ยาวที่สุดเมื่อดาวน์โหลดกำลังรอการร้องขอ DNS (เจ็บปวดเมื่อคุณดาวน์โหลดหลายร้อยไฟล์ตามลำดับ) สิ่งนี้สามารถช่วยได้ด้วยแคช DNS ท้องถิ่นเช่นdnsmasqหรือหากคุณใช้ชื่อโดเมนเดียวกันหลายครั้งด้วยโครงสร้างไดเรกทอรีที่แตกต่างกันเพียงแก้ไขเป็น IP เพียงครั้งเดียวและทำการแทนที่ URL

เพื่อพิสูจน์จุดของฉัน ... ลองtime netstatเปรียบเทียบกับtime netstat -n(โดยไม่แคชความแตกต่างนั้นน่าทึ่งมากกับแคชมันเป็นเพียงครั้งแรกที่แย่แล้วก็จำได้)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.