chỉ tải xuống vài byte đầu tiên của trang nguồn


9

Tôi đang tải xuống trang nguồn HTML của một trang web bằng cURLlệnh. Vấn đề là, tôi không muốn hầu hết các nội dung trong trang. Tôi chỉ cần 100 dòng đầu tiên của trang nguồn. Có cách nào để dừng tải xuống của trang sau vài dòng đầu tiên không?

Hiện tại, tôi có lệnh dưới đây hoạt động nhưng dường như không hiệu quả về thời gian.

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

Tôi đã cố gắng thay đổi giá trị từ 1đến .5.05và vẫn toàn bộ trang web là nhận được tải về.

Tôi đang xem xét thời gian ít hơn một giây để thực hiện lệnh trên.

BIÊN TẬP

Từ trang hướng dẫn của cURLtôi, tôi thấy rằng " Bạn cũng nên biết rằng nhiều máy chủ HTTP / 1.1 không được bật tính năng này, do đó, khi bạn cố gắng lấy một phạm vi, thay vào đó bạn sẽ nhận được toàn bộ tài liệu. " Máy chủ không hỗ trợ truy vấn phạm vi, có một số lệnh khác trong nixmôi trường sẽ giúp tôi hoàn thành những gì đang cố gắng không?

Câu trả lời:


6

Bạn có thể sử dụng head-schuyển sang curltải xuống một phần của trang. Đơn giản chỉ cần cho biết có headbao nhiêu dòng đầu ra mà bạn muốn.

Thí dụ

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

Chi tiết

  • Các -10để headsẽ trở lại 10 dòng và sau đó dừng lại. Nếu bạn muốn nhiều hơn thì thay đổi nó cho phù hợp với nhu cầu của bạn.
  • Công -stắc báo curlcho nó im lặng để nó không hiển thị thanh tiến trình trong khi tải xuống.

1
Nó vẫn mất thời gian đáng kể để tải về nội dung. Tôi đã mong đợi một phạm vi thời gian tính bằng mili giây để điều này xảy ra.
Ramesh

@Ramesh - vâng tôi nhận thấy nó cũng khá chậm. Có vẻ mất một thời gian để máy chủ trả lời.
slm

@Ramesh - thay vào đó hãy truy cập trang web bằng cách sử dụng curl, bạn có thể muốn xem API: developers.google.com/freebase
slm

Hừm, thú vị. Bạn tôi đã gợi ý rằng trong Java nếu anh ta sử dụng API cơ sở miễn phí, anh ta phải mất 300 MS để tải xuống dữ liệu. Tôi nói với anh ta rằng nó có thể được giảm đáng kể bằng cách sử dụng kịch bản shell. Có vẻ như một vấn đề với máy chủ hơn là các lệnh shell.
Ramesh

@Ramesh - Có, sự chậm chạp trong trường hợp này là trong truy vấn cơ sở dữ liệu và chuẩn bị dữ liệu đó thành phản hồi. Nếu cơ sở dữ liệu hiển thị dữ liệu ở các định dạng khác giống như JSON thì bạn có thể đẩy nhanh phản hồi bằng cách sử dụng dữ liệu đó thay vì lấy đầu ra làm HTTP. Có rất nhiều chi phí trong việc chuẩn bị phản hồi vì HTTP là một sự lãng phí nếu kết thúc usecase sẽ không phải là một con người đọc kết quả.
slm

1

Tôi chưa thực sự thử nghiệm ứng dụng cụ thể này, nhưng một cái gì đó cho tôi biết bạn có thể ghép dd và nc ở đây:

$ 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) có thể yêu cầu cấu hình thêm để có được các tiêu đề yêu cầu, nhưng nếu đó là một trang web công cộng, bạn sẽ có thể xử lý một đầu ra hữu ích nếu bạn đủ quan tâm để thử. Chắc chắn dd sẽ chỉ mất nhiều đầu vào như bạn chỉ định và thoát, điều này sẽ SIGPIPE netcat để nó sẽ ngay lập tức làm theo. Bí quyết thực sự duy nhất là ủi ra cái bắt tay ban đầu - một khi bạn bắt đầu truyền phát, bạn có thể thả nó bất cứ khi nào bạn muốn.

BIÊN TẬP

Đọc những bình luận của slm đã thôi thúc tôi chuyển động thứ hai; nếu bạn có thể tuần tự hóa một POST POST theo đúng định dạng, đó chắc chắn là cách để đáp ứng kịp thời hơn. Phân tích cú pháp HTML là dành cho các loài chim, dù sao.

Một mẹo hữu ích cho mục đích đó là nắm bắt luồng mạng của bạn trong khi giao tiếp với máy chủ trong trình duyệt của bạn, sau đó khi trình duyệt của bạn gửi POST sẽ mang lại cho bạn những gì bạn muốn gửi lại dưới dạng GET thay vào đó và xem kết quả.


1

Các headlệnh thường sẽ ngừng việc tải xuống trước khi nó kết thúc (mặc dù cho các tập tin ngắn nó có thể lấp đầy bộ đệm ống trước ống được đóng lại). Điều này là do khi một đường ống được đóng lại, curlkhông có nơi nào để ghi (mô tả tệp bị đóng, ghi thất bại).

Tuy nhiên, theo kinh nghiệm của tôi, điều dài nhất khi tải xuống là chờ đợi các yêu cầu DNS (đau đớn khi bạn đang tải xuống hàng trăm tệp theo tuần tự). Điều này có thể được trợ giúp với bộ đệm DNS cục bộ như dnsmasqhoặc, nếu bạn đang sử dụng cùng một tên miền nhiều lần với cấu trúc thư mục khác nhau, chỉ cần giải quyết nó thành IP một lần và thay thế URL.

Để chứng minh quan điểm của tôi ... hãy thử time netstatso với time netstat -n(không có bộ đệm, sự khác biệt là rất lớn, với bộ đệm, lần đầu tiên nó chỉ tệ, sau đó nó sẽ nhớ).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.