부분 웹 페이지를 검색합니다
-
20-09-2019 - |
문제
데이터 컬의 양을 제한하는 방법이 있습니까? 50kb의 페이지에서 데이터를 스크래핑하지만 필요한 데이터는 페이지의 상단 1/4에 있으므로 페이지의 첫 10kb 만 검색하면됩니다.
이 대역폭의 약 5GB 만 관련이있는 경우 한 달에 60GB의 데이터를 전송하는 데 필요한 데이터가 많기 때문에 요구합니다.
데이터를 처리하기 위해 PHP를 사용하고 있지만 데이터 검색 접근 방식에서 유연하고 CURL, WGET, FOPEN 등을 사용할 수 있습니다.
내가 고려하고있는 한 가지 접근법은
$fp = fopen("http://www.website.com","r");
fseek($fp,5000);
$data_to_parse = fread($fp,6000);
위의 내용은 www.website.com에서 6kb 만 전송한다는 것을 의미합니까?
해결책
Curl을 사용하고자하는 것을 달성 할 수도 있습니다.
문서를 보면 curlopt_writefunction CURL에서 읽을 때 데이터를 사용할 수있을 때마다 호출되는 콜백을 등록 할 수 있습니다. 그런 다음 수신 된 바이트를 계산할 수 있으며 6,000 바이트를 받으면 0을 반환하여 나머지 전송을 중단 할 수 있습니다.
그만큼 libcurl 문서화는 콜백을 조금 더 설명합니다.
이 기능은 저장 해야하는 데이터가 수신 되 자마자 libcurl에 의해 호출됩니다. 실제로 처리 된 바이트 수를 반환하십시오. 해당 금액이 기능에 전달 된 금액과 다르면 라이브러리에 오류가 표시되며 전송을 중단하고 Curle_write_error를 반환합니다.
콜백 함수는 모든 호출에서 가능한 많은 데이터가 전달되지만 가정을 할 수는 없습니다. 하나의 바이트 일 수 있으며 수천 일 수도 있습니다.
다른 팁
이것은 실제로 컬이 질문하는 HTTP입니다.
당신이 추측했듯이, fopen을 사용하면 전체 페이지가 다운로드됩니다. 오프셋 5000을 찾는다면
원하는 것을 달성하는 가장 좋은 방법은 HTML RFC에 명시된대로 부분 HTTP GET 요청을 사용하는 것입니다.http://www.w3.org/protocols/rfc2616/rfc2616-sec9.html):
요청 메시지에 범위 헤더 필드가 포함 된 경우 get 메소드의 의미론 "부분 get"으로 변경됩니다. 섹션 14.35에 설명 된대로 엔티티의 일부만 이체되도록 부분적인 GET 요청. 부분 GET 방법은 클라이언트가 이미 보유한 데이터를 전송하지 않고 부분적으로 재조정 된 엔티티를 완료 할 수 있도록 불필요한 네트워크 사용을 줄이기위한 것입니다.
범위를 사용한 부분 GET 요청의 세부 사항은 다음과 같습니다.http://www.w3.org/protocols/rfc2616/rfc2616-sec14.html#sec14.35.2
시도해보십시오 HTTP 범위 요청:
GET /largefile.html HTTP/1.1
Range: bytes=0-6000
서버가 범위 요청을 지원하는 경우, 콘텐츠 범위 헤더와 요청 된 바이트 범위가있는 206 개의 부분 컨텐츠 응답 코드를 반환합니다 (그렇지 않은 경우 200 및 전체 파일을 반환합니다). 보다 http://benramsey.com/archives/206-partial-content-and-range-requests/ 범위 요청에 대한 좋은 설명.
전체 페이지를 다음과 같이 다운로드합니다 fopen
전화를 걸지만 해당 페이지에서 6kb 만 읽습니다.
PHP 매뉴얼에서 :
다음 조건 중 하나가 충족 되 자마자 읽기 중지됩니다.
- 길이 바이트가 읽혔습니다