소스 페이지의 처음 몇 바이트 만 다운로드


9

cURL명령을 사용하여 웹 사이트의 HTML 소스 페이지를 다운로드하고 있습니다. 문제는 페이지의 내용을 대부분 원하지 않습니다. 소스 페이지의 처음 100 줄만 있으면됩니다. 처음 몇 줄 후에 페이지 다운로드를 중지하는 방법이 있습니까?

현재 아래 명령이 작동하지만 시간 효과가없는 것 같습니다.

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

나는에서 값을 변경 시도 1.5하고 .05여전히 전체 웹 페이지를 다운로드 받고있다.

위의 명령을 실행하기 위해 1 초 미만의 시간을보고 있습니다.

편집하다

의 맨 페이지에서 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하는 head10 개 라인을 반환 한 후 중지됩니다. 더 많은 것을 원한다면 필요에 맞게 변경하십시오.
  • -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

나는이 특정 응용 프로그램을 아직 테스트하지는 않았지만 여기에서 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)은 요청 헤더를 올바르게 가져 오려면 추가 구성이 필요할 수 있지만 공개 사이트 인 경우 시도가 충분할 경우 유용한 출력을 찾을 수 있어야합니다. 확실히 dd는 사용자가 지정한만큼만 입력하고 SIGPIPE netcat을 사용하여 즉시 따라갑니다. 스트림 트릭을 시작하면 원할 때마다 삭제할 ​​수 있습니다.

편집하다

slm의 의견을 읽음으로써 그 움직임을 두 번째로 촉구했습니다. JSON POST를 올바른 형식으로 직렬화 할 수 있다면 더 적시에 응답 할 수있는 방법입니다. HTML 구문 분석은 어쨌든 새를위한 것입니다.

이를 위해 유용한 트릭은 브라우저에서 서버와 통신하는 동안 네트워크 스트림을 캡처 한 다음 브라우저가 POST를 보내면 원하는 것을 다시 GET으로 보내고 결과를 살펴 보는 것입니다.


1

head명령은 일반적으로 다운로드가 끝나기 전에 다운로드를 중지합니다 (짧은 파일의 경우 파이프를 닫기 전에 파이프 버퍼를 채울 수 있음). 파이프가 닫힐 때 curl쓸 곳이 없습니다 (파일 디스크립터가 닫히고 쓰기가 실패 함).

그러나 내 경험상 다운로드 할 때 가장 긴 것은 DNS 요청을 기다리는 것입니다 (수백 개의 파일을 순차적으로 다운로드 할 때 고통 스럽습니다). 이것은 로컬 DNS 캐시와 같이 도움이 될 수 있습니다. dnsmasq또는 다른 디렉토리 구조로 동일한 도메인 이름을 여러 번 사용하는 경우 한 번 IP로 확인하고 URL을 바꾸십시오.

내 요점을 증명하기 위해 ... 시도 time netstattime netstat -n(캐시가 없으면 차이가 극적이며, 캐시가 처음이라면 나쁘고 기억됩니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.