Pergunta

Existe alguma maneira de limitar a quantidade de dados de dados buscar? Estou raspando os dados de uma página de 50kb, no entanto, os dados necessários estão no 1/4 superior da página, então eu realmente só preciso recuperar os primeiros 10 kb da página.

Estou perguntando, porque há muitos dados que preciso monitorar, o que resulta na transferência de cerca de 60 GB de dados por mês, quando apenas cerca de 5 GB dessa largura de banda são relevantes.

Estou usando o PHP para processar os dados, no entanto, sou flexível em minha abordagem de recuperação de dados, posso usar Curl, WGet, Fopen etc.

Uma abordagem que estou considerando é

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

O acima significa que vou transferir apenas 6kb de www.website.com, ou vou carregar www.website.com para a memória, o que significa que ainda vou transferir os 50kb completos?

Foi útil?

Solução

Você também pode realizar o que está procurando usando o CURL.

Se você olhar para a documentação para Curlopt_writeFunction Você pode registrar um retorno de chamada que é chamado sempre que os dados estão disponíveis para leitura da CURL. Você pode então contar os bytes recebidos e, quando recebeu mais de 6.000 bytes, poderá retornar 0 para abortar o restante da transferência.

o libcurl A documentação descreve o retorno de chamada um pouco mais:

Essa função é chamada pela libcurl assim que houver dados recebidos que precisam ser salvos. Devolver o número de bytes realmente cuidados. Se essa quantidade difere da quantidade passada para sua função, isso sinalizará um erro para a biblioteca e abortará a transferência e retornará Curle_Write_error.

A função de retorno de chamada será passada o máximo de dados possível em todos os invocados, mas você não pode fazer suposições. Pode ser um byte, pode ser milhares.

Outras dicas

Isso é mais um HTTP que uma questão de citação de fato.

Como você adivinhou, a página inteira será baixada se você usar o FOPEN. Não importa, se você procurar no deslocamento 5000 ou não.

A melhor maneira de alcançar o que você deseja seria usar uma solicitação parcial http get, conforme declarado no html rfc (http://www.w3.org/protocols/rfc2616/rfc2616-sec9.html):

A semântica do método GET altera para um "GET parcial" se a mensagem de solicitação incluir um campo de cabeçalho de intervalo. Uma solicitação parcial de GET para que apenas parte da entidade seja transferida, conforme descrito na Seção 14.35. O método GET parcial visa reduzir o uso desnecessário de rede, permitindo que as entidades parcialmente retiradas sejam concluídas sem transferir dados já mantidos pelo cliente.

Os detalhes das solicitações parciais de GET usando intervalos são descritas aqui:http://www.w3.org/protocols/rfc2616/rfc2616-sec14.html#sec14.35.2

tente um Solicitação de intervalo HTTP:

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

Se o servidor suportar solicitações de intervalo, ele retornará um código de resposta parcial de 206 conteúdo com um cabeçalho de faixa de conteúdo e seu intervalo de bytes solicitado (se não o fizer, retornará 200 e o arquivo inteiro). Vejo http://benramsey.com/archives/206-parcial-content-and-range-requests/ Para uma boa explicação de solicitações de alcance.

Veja também Downloads retumíveis ao usar o PHP para enviar o arquivo?.

Vai baixar a página inteira com o fopen Ligue, mas então ele apenas lerá 6KB dessa página.

Do manual do PHP:

A leitura para assim que uma das seguintes condições for atendida:

  • comprimento bytes foram lidos
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top