Я пытаюсь получить первые 50 результатов API Google CSE с помощью следующего кода PHP.
Проблема в том, что он объединяет две страницы, показывающие, что результаты портятся, как будто первая позиция совпадает с первой страницей, а вторая позиция является второй из второй страницы и так далее. Может кто-нибудь сказать мне, что я здесь делаю не так?
На самом деле я хочу получить первые 50 результатов в массиве, но приведенный ниже код дает мне смешанные результаты.
$apiKey = "theapikey";
$query = "news";
for ($i = 1; $i <= 5; $i++) {
$ch = curl_init();
$request = "https://www.googleapis.com/customsearch/v1?q=" . urlencode( "$query" ) . "&cx=013594553343653397533:q-qkkaltmay" ."&key=" . $apiKey . "&start=" . $i;
curl_setopt($ch, CURLOPT_URL, $request);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$output = curl_exec($ch);
$output = json_decode($output);
foreach( $output->items as $result ) {
$url = $result->link;
${"items" . $i}[] = $url;
}
}
echo json_encode($items1);
Похоже, вы добавляете каждый набор из 10 результатов в отдельный массив, поэтому $ items1 имеет первые 10 результатов, $ items2 имеет следующие 10 и т. Д. Если вы хотите, чтобы все 50 результатов были в одном массиве, нет необходимости используйте индекс в имени массива.
Кроме того, параметр «start» — это номер требуемого результата, а не номер набора результатов — поэтому вы хотите, чтобы первый запрос начинался с 1, второй начинался с 11, третий — с 21 и т. Д.
Вы также можете проверить, есть ли что-то в результате, прежде чем добавлять его в ваш массив.
Я мог бы сделать что-то вроде этого:
$apiKey = "theapikey";
$query = "news";
$items = array();
for ($i = 1; $i <= 5; $i++) {
$ch = curl_init();
$request = "https://www.googleapis.com/customsearch/v1?" .
"q=" . urlencode( "$query" ) .
"&cx=013594553343653397533:q-qkkaltmay" .
"&key=" . $apiKey .
"&start=" . ( ($i - 1)*10 + 1 );
curl_setopt($ch, CURLOPT_URL, $request);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$output = curl_exec($ch);
$output = json_decode($output);
foreach( $output->items as $result ) {
if ($url = $result->link && trim($url)) $items[] = $url;
}
}
echo json_encode($items);
Напоследок пара предостережений:
Других решений пока нет …