Curl PHP не может отображать Amazon - PullRequest
0 голосов
/ 03 ноября 2018

Я использую следующий код и не могу отобразить amazon.com используя php и curl. Я использую curl_error и не получаю ошибок, поэтому я не уверен, что я делаю не так

<?php 

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, 'https://www.amazon.com');

curl_exec($curl);

curl_close ($curl);

Я делаю это на локальном хосте

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

просто отобразите amazon, затем используйте это

echo file_get_contents("https://www.amazon.com");
0 голосов
/ 03 ноября 2018

при отладке кода скручивания используйте CURLOPT_VERBOSE и опубликуйте журнал CURLOPT_VERBOSE при обращении за помощью. также при отладке не игнорируйте возвращаемые значения curl_setopt, потому что он возвращает bool (false), если произошла ошибка, и если была ошибка, эта ошибка, вероятно, объясняет, почему код не работает. также не игнорируйте возвращаемое значение curl_exec, потому что оно возвращает bool (false), если произошла ошибка, которая остается незамеченной, если вы игнорируете возвращаемое значение (и ваш код делает)

вот версия вашего кода, которая не игнорирует никаких ошибок и включает ведение журнала CURLOPT_VERBOSE, она должна показать, где ваш код дает сбой:

<?php
$curl = curl_init();
if (! is_resource($curl)) {
    throw new \RuntimeException('curl_init() failed!');
}
ecurl_setopt($curl, CURLOPT_URL, 'https://www.amazon.com');
ecurl_setopt($curl, CURLOPT_VERBOSE, 1);
$curlstderr = etmpfile();
$curlstdout = etmpfile();
ecurl_setopt($curl, CURLOPT_STDERR, $curlstderr);
ecurl_setopt($curl, CURLOPT_FILE, $curlstdout);
if (true !== curl_exec($curl)) {
    throw new \RuntimeException("curl_exec failed! " . curl_errno($curl) . ": " . curl_error($curl));
}
rewind($curlstderr); // https://bugs.php.net/bug.php?id=76268
rewind($curlstdout); // https://bugs.php.net/bug.php?id=76268
$verbose = stream_get_contents($curlstderr);
$output = stream_get_contents($curlstdout);
curl_close($curl);
fclose($curlstderr);
fclose($curlstdout);
var_dump($verbose, $output);

function ecurl_setopt ( /*resource*/$ch, int $option , /*mixed*/ $value): bool
{
    $ret = curl_setopt($ch, $option, $value);
    if ($ret !== true) {
        // option should be obvious by stack trace
        throw new RuntimeException('curl_setopt() failed. curl_errno: ' . return_var_dump(curl_errno($ch)) . '. curl_error: ' . curl_error($ch));
    }
    return true;
}

function etmpfile()
{
    $ret = tmpfile();
    if (false === $ret) {
        throw new \RuntimeException('tmpfile() failed!');
    }
    return $ret;
}

также, похоже, что https://www.amazon.com имеет ошибку, см. это ошибка при отправке ответа gzip-сжатым клиентам, которые не указывают Accept-Encoding: gzip?

  • в любом случае, чтобы curl автоматически распаковывал сжатый gzip ответ от amazon, добавьте ecurl_setopt($curl,CURLOPT_ENCODING,'');, который говорит libcurl добавить заголовок Accept-Encoding: gzip,deflate, и автоматически распакует результат.
0 голосов
/ 03 ноября 2018

Вы должны использовать следующее:

$response = curl_exec($curl);

$ result - это массив. Например, вы можете получить тело запроса, используя:

$header_size = curl_getinfo($curl,CURLINFO_HEADER_SIZE);
        $result['header'] = substr($response, 0, $header_size);
        $result['body'] = substr( $response, $header_size );
        $result['http_code'] = curl_getinfo($curl,CURLINFO_HTTP_CODE);
        $result['last_url'] = curl_getinfo($curl,CURLINFO_EFFECTIVE_URL);

echo $result['body'];

Для получения дополнительной информации: http://php.net/manual/de/function.curl-exec.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...