- Как да взема данни от друг сайт
12
WT форуми -> PHP MySQL ASP.NET -> Как да взема данни от друг сайт
Създайте нова тема Напишете отговор 
Автор Съобщение
dunix
Турист
Турист

Регистриран на: 25/07/2007 7:55 pm

Support: 3
Bonus: 5
Мнения: 569
Мнение 21/09/2017 7:05 pm     Как да взема данни от друг сайт Отговорете с цитат


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

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

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

Кода е:
PHP code:
<?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;
}
}
?>

ПС: не съм дал сайта, за да не се получава реклама.

Последната промяна е направена от dunix на 28/09/2017 10:06 am; мнението е било променяно общо 1 път
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
anonimen
Активен
Активен

Регистриран на: 11/06/2012 8:07 pm

Support: 145
Bonus: 289
Мнения: 1335
Мнение 21/09/2017 10:20 pm      Отговорете с цитат


Цитат:
$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 code:
echo $doc->getElementById('booking-panel')->nodeValue;
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
dunix
Турист
Турист

Регистриран на: 25/07/2007 7:55 pm

Support: 3
Bonus: 5
Мнения: 569
Мнение 22/09/2017 6:59 am      Отговорете с цитат


anonimen написа:
Щом търсиш елемент по id, използвай готовата функция


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

Регистриран на: 12/09/2009 10:07 am

Support: 103
Bonus: 196
Мнения: 2768
Мнение 22/09/2017 9:00 am      Отговорете с цитат


Този сайт да не би да си зарежда съдържанието след като заредиш сайта (AJAX)?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
anonimen
Активен
Активен

Регистриран на: 11/06/2012 8:07 pm

Support: 145
Bonus: 289
Мнения: 1335
Мнение 22/09/2017 10:09 am      Отговорете с цитат


dunix написа:
anonimen написа:
Щом търсиш елемент по id, използвай готовата функция


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

Да, отговорът ми не беше решение на проблема, а просто съвет как да го опростиш.

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

Регистриран на: 25/07/2007 7:55 pm

Support: 3
Bonus: 5
Мнения: 569
Мнение 23/09/2017 8:24 am      Отговорете с цитат


anonimen написа:
Да, отговорът ми не беше решение на проблема, а просто съвет как да го опростиш.

Благодаря ти за което!

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

Има го елемента, който се пробвам да достъпя.

djman написа:
Този сайт да не би да си зарежда съдържанието след като заредиш сайта (AJAX)?

Да, има ajax...
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
djman
Активен
Активен

Регистриран на: 12/09/2009 10:07 am

Support: 103
Bonus: 196
Мнения: 2768
Мнение 23/09/2017 9:34 am      Отговорете с цитат


dunix написа:
Има го елемента, който се пробвам да достъпя.

Да, има ajax...


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

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

Регистриран на: 11/06/2012 8:07 pm

Support: 145
Bonus: 289
Мнения: 1335
Мнение 23/09/2017 2:14 pm      Отговорете с цитат


По-лесно ще стане ако види откъде идва това съдържание и директно оттам го вземе - дори ще стане по-елегантно, защото няма да рови по html документ, а направо ще си вземе каквото трябва.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
dunix
Турист
Турист

Регистриран на: 25/07/2007 7:55 pm

Support: 3
Bonus: 5
Мнения: 569
Мнение 26/09/2017 9:51 pm      Отговорете с цитат


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)
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
n641951363
Нов
Нов

Регистриран на: 29/08/2017 2:35 pm

Support: 3
Bonus: 6
Мнения: 32
Мнение 27/09/2017 8:11 am      Отговорете с цитат


@dunix
колега, дай някакъв код. НЕ можем да гадаем какво пускаш и какво се обърква.

Може да прочетеш за Same-origin policy ако искаш да пуснаш AJAX към друг домайн.
както и за JSONP
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
anonimen
Активен
Активен

Регистриран на: 11/06/2012 8:07 pm

Support: 145
Bonus: 289
Мнения: 1335
Мнение 27/09/2017 10:11 am      Отговорете с цитат


n641951363 написа:
Може да прочетеш за Same-origin policy ако искаш да пуснаш AJAX към друг домайн.
както и за JSONP

Той го дърпа през php, така че same-origin-policy не би трябвало да се намесва тук? Доколкото аз знам това е изцяло браузърна защита. А той си прави самостоятелен request дотам през сървъра.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
n641951363
Нов
Нов

Регистриран на: 29/08/2017 2:35 pm

Support: 3
Bonus: 6
Мнения: 32
Мнение 27/09/2017 11:19 am      Отговорете с цитат


@anonimen
Съдейки по това

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

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


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

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

И все пак ако този сайт си е написал правилно Api-то (REST евентуално) то без активна сесия и тоукън пак няма да може да уради само апи-то за да си вземе инфото.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
12
Страница 1 от 2


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети