Curl json результаты с переменными post с PHP - PullRequest
0 голосов
/ 07 мая 2020

Я создал сценарий CURL, который отправляет некоторые параметры на другой мой сайт для поиска и отображения результатов в JSON с

curl "http://xx.xx.xx.xx:9080/crawl.json?spider_name=friendsearch" -d '{"request": {"url":"https://www.example.com/results?name=Robert%20June&citystatezip=Seattle,WA","callback":"parse"},"spider_name": "friendsearch"}'

Он работает хорошо, дайте мне массив JSON, например

{"status": "ok", "items": [{"fullname": ["Robert June"], "current_street": "Address, WA 00000", "previous_addresses": ["Address1", "Address2", "Address3", "Address4", "Address5"], "cellphones": ["(000) 000-0001", "(000) 000-0002"], "landlines": ["(000) 000-0001", "(000) 000-0002"], "emails": ["xxx@xxx.com", "xxx@xxx.com"], "url": "https://www.example.com/results?name=Robert%20June&citystatezip=Seattle%2CWA&rid=0x0"}], "items_dropped": [], "stats": {"crawlera/delay/reset_backoff": 3, "crawlera/request": 3, "crawlera/request/method/GET": 3, "crawlera/response": 3, "crawlera/response/banned": 1, "crawlera/response/error": 1, "crawlera/response/error/banned": 1, "crawlera/response/status/200": 2, "crawlera/response/status/503": 1, "downloader/request_bytes": 1481, "downloader/request_count": 3, "downloader/request_method_count/GET": 3, "downloader/response_bytes": 16123, "downloader/response_count": 3, "downloader/response_status_count/200": 2, "downloader/response_status_count/503": 1, "elapsed_time_seconds": 68.329858, "finish_reason": "finished", "finish_time": "2020-05-06 22:18:18", "item_scraped_count": 1, "log_count/DEBUG": 4, "log_count/INFO": 12, "memusage/max": 59998208, "memusage/startup": 59998208, "request_depth_max": 1, "response_received_count": 2, "retry/count": 1, "retry/reason_count/503 Service Unavailable": 1, "scheduler/dequeued": 3, "scheduler/dequeued/memory": 3, "scheduler/enqueued": 3, "scheduler/enqueued/memory": 3, "start_time": "2020-05-06 22:17:09"}, "spider_name": "friendsearch"}

Моя цель - вызвать этот сценарий curl через PHP и получить результаты на веб-странице и извлечь имя, адрес, предыдущий адрес, телефон и стационарный телефон. Я пробовал несколько способов и вызывая curl, как на . Как отобразить результат cURL в PHP? , но не смог получить результаты и потерпел неудачу.

Я пробовал с

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://xx.xx.xx.xx:9080/crawl.json?spider_name=friendsearch');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\"request\": {\"url\":\"https://www.example.com/results?name=Robert%20June&citystatezip=Seattle,WA\",\"callback\":\"parse\"},\"spider_name\": \"friendsearch\"}");

$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);

Но это дает

array(3) { ["status"]=> string(5) "error" ["message"]=> string(117) "Invalid JSON in POST body. 1:33: Error: Unexpected text after end of JSON value | At line 1, column 33, offset 33" ["code"]=> int(400) }

Есть идеи, пожалуйста?

1 Ответ

1 голос
/ 07 мая 2020

Это должно делать то, что вам нужно:

<?php
    $json = json_decode(shell_exec("curl 'http://xx.xx.xx.xx:9080/crawl.json?spider_name=friendsearch' -d '{\"request\": {\"url\": \"https://www.example.com/results?name=Robert%20June&citystatezip=Seattle,WA\",\"callback\": \"parse\"},\"spider_name\": \"friendsearch\"}'") , true);
    var_dump($json);
?>

ИЛИ:

<?php

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://xx.xx.xx.xx:9080/crawl.json?spider_name=friendsearch');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\"request\": {\"url\": \"https://www.example.com/results?name=Robert%20June&citystatezip=Seattle,WA\", \"callback\": \"parse\"}, \"spider_name\": \"friendsearch\"}");

$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
curl_close($ch);

$json = json_decode($result, true);
var_dump($json);

?>

Чтобы избежать всех этих обратных косых черт, вы также можете изменить эту строку на:

curl_setopt($ch, CURLOPT_POSTFIELDS, '{"request": {"url": "https://www.example.com/results?name=Robert%20June&citystatezip=Seattle,WA", "callback": "parse"}, "spider_name": "friendsearch"}');

Как отобразить имя, адрес и т.д. c.:

if ($json['status'] === 'ok') {

    $name = $json[items][0]['fullname'][0];                // 'Robert June',
    $currentstreet = $json[items][0]['current_street'];    // 'Address, WA 00000'
    $address1 = $json[items][0]['previous_addresses'][0];  // Address1
    $address2 = $json[items][0]['previous_addresses'][1];  // Address2

    echo "Name: ".$name."<br />\nCurrent Street: ".$currentstreet."<br />\nAddress1: ".$address1."<br />\nAddress2: ".$address2."<br />\n";

// Can also do:

    echo "Name: $name<br />\nCurreny Street: $currentstreet<br />\nAddress1: $address1<br />\nAddress2: $address2<br />\n";

}
...