Получить частичную веб-страницу

Есть ли способ ограничения количества данных, которые CURL будет получать? Я собираю данные со страницы размером 50 КБ, но данные, которые мне нужны, находятся в верхней четверти страницы, поэтому мне нужно только получить первые 10 КБ страницы.

Я спрашиваю, потому что мне нужно следить за большим количеством данных, что приводит к тому, что я передаю около 60 ГБ данных в месяц, когда релевантно только около 5 ГБ этой полосы пропускания.

Я использую PHP для обработки данных, однако я гибок в подходе к извлечению данных, я могу использовать CURL, WGET, fopen и т. Д.

Один подход, который я рассматриваю, это

$fp = fopen("http://www.website.com","r");
fseek($fp,5000);
$data_to_parse = fread($fp,6000);

Означает ли вышесказанное, что я перевезу только 6 КБ с www. интернет сайт. com, или откроем загрузку www. интернет сайт. com в память означает, что я все еще буду передавать полные 50kb?

вопрос задан 8.10.2009
James
842 репутация

4 ответов


  • 4 рейтинг

    На самом деле это скорее HTTP, чем вопрос CURL.

    Как вы уже догадались, вся страница будет загружена, если вы используете fopen. Неважно, если вы ищете смещение 5000 или нет.

    Лучший способ достичь желаемого - использовать частичный HTTP-запрос GET, как указано в HTML RFC ( http: // www. w3. орг / Протоколы / RFC2616 / RFC2616-Sec9. HTML ):

    Семантика изменения метода GET на "частичное получение", если запрос сообщение включает поле заголовка Range. Частичное GET запрашивает только часть субъекта передаются, как описано в разделе 14. 35. Частичный метод GET предназначен для уменьшить ненужное использование сети разрешение частично извлеченных объектов заполняется без передачи данные уже хранятся у клиента.

    Подробности частичных запросов GET с использованием диапазонов описаны здесь: http: // www. w3. орг / Протоколы / RFC2616 / RFC2616-Sec14. HTML # Sec14. 35. 2

    ответ дан NewbiZ, с репутацией 1557, 8.10.2009
  • 3 рейтинг

    попробуйте HTTP RANGE запрос :

    GET /largefile.html HTTP/1.1
    Range: bytes=0-6000
    

    , если сервер поддерживает запросы диапазона , он вернет код ответа 206 Partial Content с заголовком Content-Range и запрошенным диапазоном байтов (если этого не произойдет, он вернет 200 и весь файл). см. http: // benramsey. com / archives / 206 -partal-Content-and-Range-Request / для хорошего объяснения запросов диапазона.

    см. Также Возобновляемая загрузка при использовании PHP для отправки файла? .

    ответ дан ax., с репутацией 44793, 8.10.2009
  • 2 рейтинг

    Вы также можете выполнить то, что ищете, используя CURL.

    Если вы посмотрите документацию для CURLOPT_WRITEFUNCTION , вы можете зарегистрировать обратный вызов, который вызывается всякий раз, когда данные доступны для чтения из CURL. Затем вы можете сосчитать полученные байты, а когда вы получили более 6000 байтов, вы можете вернуть 0, чтобы прервать оставшуюся часть передачи.

    Документация libcurl описывает обратный вызов немного больше:

    Эта функция вызывается libcurl, как только получаются данные, которые необходимо сохранены. Вернуть количество байтов на самом деле заботиться о. Если эта сумма отличается от суммы, переданной вашему функция, она сообщит об ошибке библиотека и она прервет передачу и верните CURLE_WRITE_ERROR.

    Функция обратного вызова будет передана как можно больше данных во всех вызывает, но вы не можете сделать любые предположения. Это может быть один байт, это могут быть тысячи.

    ответ дан Keith Palmer Jr., с репутацией 21149, 8.10.2009
  • 0 рейтинг

    Он загрузит всю страницу с вызовом fopen, но затем будет читать только 6 КБ с этой страницы.

    Из руководства по PHP:

    Чтение прекращается, как только выполняется одно из следующих условий:

    • длина байт было прочитано
    ответ дан James Skidmore, с репутацией 23800, 8.10.2009