Как да взема данни от друг сайт

dunix

Registered
Здравейте,
Пробвам се да изведа информация от друг сайт с php, защото с iframe ще изведа целия сайт, а не частта, която искам да се показва.

Използвам кода по-долу, но не ми показва информацията, която искам. Стига до някакъв
Код:
              Last change -  | 
                Refresh
              
            
          
        
        
          Loading...
и не продължава нататък, а точно тази част ми трябва.

Кода е:
PHP:
<?php

$page = file_get_contents('сайта');
$doc = new DOMDocument();
$doc->validateOnParse = true;
libxml_use_internal_errors(true);
$doc->loadHTML($page);
$divs = $doc->getElementsByTagName('div');


foreach($divs as $div) {
    if ($div->getAttribute('id') === 'booking-panel') {
         echo $div->nodeValue;
    }
}
?>
ПС: не съм дал сайта, за да не се получава реклама.
 
$divs = $doc->getElementsByTagName('div');

foreach($divs as $div) {
if ($div->getAttribute('id') === 'booking-panel') {
echo $div->nodeValue;
}
}
Щом търсиш елемент по id, използвай готовата функция: http://php.net/manual/bg/domdocument.getelementbyid.php

Ще си съкратиш кода доста:

PHP:
echo $doc->getElementById('booking-panel')->nodeValue;
 
anonimen каза:
Щом търсиш елемент по id, използвай готовата функция

И така съм пробвал и пак не ми извежда нужната за мен информация - стига до същото място като с кода, който съм качил.
 
dunix каза:
anonimen каза:
Щом търсиш елемент по id, използвай готовата функция

И така съм пробвал и пак не ми извежда нужната за мен информация - стига до същото място като с кода, който съм качил.
Да, отговорът ми не беше решение на проблема, а просто съвет как да го опростиш.

Да допълня към djman - отвори сорса на този сайт (в браузъра: view-source:web-tourist.net) и виж дали този елемент наистина съществува.
 
anonimen каза:
Да, отговорът ми не беше решение на проблема, а просто съвет как да го опростиш.
Благодаря ти за което!

anonimen каза:
Да допълня към djman - отвори сорса на този сайт (в браузъра: view-source:web-tourist.net) и виж дали този елемент наистина съществува.
Има го елемента, който се пробвам да достъпя.

djman каза:
Този сайт да не би да си зарежда съдържанието след като заредиш сайта (AJAX)?
Да, има ajax...
 
dunix каза:
Има го елемента, който се пробвам да достъпя.

Да, има ajax...

За да взимаш съдържание, което се зарежда с javascript ще трябва да ползваш нещо като PhantomJS или headless Chrome

За PHP има PHP PhantomJS. Там има пример за използване, всичко до $response->getContent() (включително) ще замени file_get_contents(...) в твоя код.
 
По-лесно ще стане ако види откъде идва това съдържание и директно оттам го вземе - дори ще стане по-елегантно, защото няма да рови по html документ, а направо ще си вземе каквото трябва.
 
djman каза:
За да взимаш съдържание, което се зарежда с javascript ще трябва да ползваш нещо като PhantomJS или headless Chrome

За PHP има PHP PhantomJS. Там има пример за използване, всичко до $response->getContent() (включително) ще замени file_get_contents(...) в твоя код.

Мъчих го бая време и нищо не се получи.

anonimen каза:
По-лесно ще стане ако види откъде идва това съдържание и директно оттам го вземе - дори ще стане по-елегантно, защото няма да рови по html документ, а направо ще си вземе каквото трябва.

Това направих... издирих откъде идва и там е подреден в array, но те са го извели с някакво js.

Копирах целия код от тяхната страница, качих го на моя хост, издирих липсващите файлове за да изчистя грешките. Орязах кода за да ползвам само това, което ми трябва и го стартирах... не тръгна. Показва ми следните грешки в кода

Код:
Uncaught TypeError: Cannot read property 'length' of undefined
    at Function.map (jquery-1.11.2.min.js:2)
    at filterbyDay (fm.js:383)
    at filterFgs (fm.js:432)
    at HTMLLabelElement.<anonymous> (fm.js:485)
    at HTMLLabelElement.dispatch (jquery-1.11.2.min.js:3)
    at HTMLLabelElement.r.handle (jquery-1.11.2.min.js:3)
 
@dunix
колега, дай някакъв код. НЕ можем да гадаем какво пускаш и какво се обърква.

Може да прочетеш за Same-origin policy ако искаш да пуснаш AJAX към друг домайн.
както и за JSONP
 
n641951363 каза:
Може да прочетеш за Same-origin policy ако искаш да пуснаш AJAX към друг домайн.
както и за JSONP
Той го дърпа през php, така че same-origin-policy не би трябвало да се намесва тук? Доколкото аз знам това е изцяло браузърна защита. А той си прави самостоятелен request дотам през сървъра.
 
@anonimen
Съдейки по това

dunix каза:
издирих откъде идва и там е подреден в array, но те са го извели с някакво js.

Копирах целия код от тяхната страница, качих го на моя хост ....... Орязах кода за да ползвам само това, което ми трябва и го стартирах... не тръгна.....

в момента грешките идват от някакъв js който просто го е копирал от сайта.
предполагам преди е пробвал server-side но сега пробва с js.
ако рънва този js през браузъра тогава Same-origin policy си важи.

Без код да видим какво точно прави и от къде се опитва да взима инфо няма как да помогнем, можем само да гадаем че сайта зарежда съдържанието което иска с AJAX рикуест и че в последствие се опитва и той да прави същият рикуест но от неговият сайт (Client-Side)

И все пак ако този сайт си е написал правилно Api-то (REST евентуално) то без активна сесия и тоукън пак няма да може да уради само апи-то за да си вземе инфото.
 
В кода, който взимам, има ID, date, DEP, ARR и тн. (кода отдолу в орязан варянт)
Код:
string(185180) " [
{
    "Id": "50671661",
    "date": "2017-09-26T00:00:00+0000",
    "DEP": "JFK",
    "ARR": "BEG"
},
{
    "Id": "50671689",
    "date": "2017-09-26T00:00:00+0000",
    "DEP": "BEG",
    "ARR": "AUH"
},
{
    "Id": "50671663",
    "date": "2017-09-26T00:00:00+0000",
    "DEP": "BEG",
    "ARR": "LCA",
},
....
]"

Не успях да намеря как да стилизирам показаните резултати.

Ето го кода, който ползвам за да взема резултатите:
PHP:
$page = file_get_contents('сайта');
$doc = new DomDocument('1.0', 'utf-8');
$doc->validateOnParse = true;
libxml_use_internal_errors(true);
$doc->loadHTML($page);
echo $doc->textContent;
 
anonimen каза:
Значи си се справил с проблема? Намерил си как да извадиш съдържанието?

Успях да изведа съдържание, което не е стилизирано.
Сега се опитвам да открия начин да го стилизирам и подредя, така че да ми върши работа.
 
dunix каза:
anonimen каза:
Значи си се справил с проблема? Намерил си как да извадиш съдържанието?

Успях да изведа съдържание, което не е стилизирано.
Сега се опитвам да открия начин да го стилизирам и подредя, така че да ми върши работа.

Това ли е точно което получаваш или го принтиш с var_dump ?

Edit:
Ако не го var_dump-ваш ами това ти е отговора от api-то, най-лесно така ще го оправиш

Код:
<?php
$str = 'string(185180) " [
{
    "Id": "50671661",
    "date": "2017-09-26T00:00:00+0000",
    "DEP": "JFK",
    "ARR": "BEG"
},
{
    "Id": "50671689",
    "date": "2017-09-26T00:00:00+0000",
    "DEP": "BEG",
    "ARR": "AUH"
},
{
    "Id": "50671663",
    "date": "2017-09-26T00:00:00+0000",
    "DEP": "BEG",
    "ARR": "LCA"
}
]"';

$str = substr($str, strpos($str, '['));
$str = substr($str, 0, -1);
$str = trim($str);
$str = json_decode($str);

foreach ($str as $obj) {
    echo "ID: {$obj->Id}<br>";
    echo "DATE: {$obj->date}<br>";
    echo "DEP: {$obj->DEP}<br>";
    echo "ARR: {$obj->ARR}<br><hr>";
}
?>
 
Извикай json_decode върху този стринг и ще го получиш като масив:

PHP:
$as_array = json_decode($your_long_string);
// сега можеш да го ползваш като масив:
var_dump($as_array[0]);

var_dump($as_array);
 

Горе