Получить контент с URL с помощью php - PullRequest
2 голосов
/ 01 февраля 2010

Я хочу получить динамическое содержимое из определенного URL:

Я использовал код

echo $content=file_get_contents('http://www.punoftheday.com/cgi-bin/arandompun.pl');

Я получаю следующие результаты:

document.write('"Bakers have a great knead to make bread."

') document.write('© 1996-2007 Pun of the Day.com
')

Как я могу получить строку? Изменится только строка внутри первого document.write, другой код останется неизменным

С уважением,

Панкай

Ответы [ 3 ]

7 голосов
/ 01 февраля 2010

Вы извлекаете фрагмент JavaScript, который должен быть встроен непосредственно в документ, а не запрашиваться сценарием. Код внутри JavaScript.

Вы можете извлечь код с помощью регулярного выражения, но я бы посоветовал против этого. Во-первых, это, вероятно, не законно. Во-вторых, формат данных, которые они обслуживают, может измениться в любой момент, нарушая ваш сценарий.

Я думаю, вы должны взять на их RSS-поток . Вы можете разобрать это программно намного проще, чем JavaScript.

Прочтите этот вопрос о том, как это сделать: Лучший способ разбора RSS / Atom-каналов с PHP

4 голосов
/ 29 марта 2013

1) несколько локальных методов

<?php
echo readfile("http://example.com/");            //needs "Allow_url_include" enabled
echo include("http://example.com/");             //needs "Allow_url_include" enabled
echo file_get_contents("http://example.com/");   
echo stream_get_contents(fopen('http://example.com/', "rb")); //you may use "r" instead of "rb"  //needs "Allow_url_fopen" enabled
?> 

2) Лучший путь - это CURL :

echo get_remote_data('http://example.com');                                // GET request 
echo get_remote_data('http://example.com', "var2=something&var3=blabla" ); // POST request


//============= https://github.com/tazotodua/useful-php-scripts/ ===========
function get_remote_data($url, $post_paramtrs=false)    {   $c = curl_init();curl_setopt($c, CURLOPT_URL, $url);curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); if($post_paramtrs){curl_setopt($c, CURLOPT_POST,TRUE);  curl_setopt($c, CURLOPT_POSTFIELDS, "var1=bla&".$post_paramtrs );}  curl_setopt($c, CURLOPT_SSL_VERIFYHOST,false);curl_setopt($c, CURLOPT_SSL_VERIFYPEER,false);curl_setopt($c, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; rv:33.0) Gecko/20100101 Firefox/33.0"); curl_setopt($c, CURLOPT_COOKIE, 'CookieName1=Value;'); curl_setopt($c, CURLOPT_MAXREDIRS, 10);  $follow_allowed= ( ini_get('open_basedir') || ini_get('safe_mode')) ? false:true;  if ($follow_allowed){curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);}curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 9);curl_setopt($c, CURLOPT_REFERER, $url);curl_setopt($c, CURLOPT_TIMEOUT, 60);curl_setopt($c, CURLOPT_AUTOREFERER, true);         curl_setopt($c, CURLOPT_ENCODING, 'gzip,deflate');$data=curl_exec($c);$status=curl_getinfo($c);curl_close($c);preg_match('/(http(|s)):\/\/(.*?)\/(.*\/|)/si',  $status['url'],$link);$data=preg_replace('/(src|href|action)=(\'|\")((?!(http|https|javascript:|\/\/|\/)).*?)(\'|\")/si','$1=$2'.$link[0].'$3$4$5', $data);$data=preg_replace('/(src|href|action)=(\'|\")((?!(http|https|javascript:|\/\/)).*?)(\'|\")/si','$1=$2'.$link[1].'://'.$link[3].'$3$4$5', $data);if($status['http_code']==200) {return $data;} elseif($status['http_code']==301 || $status['http_code']==302) { if (!$follow_allowed){if(empty($redirURL)){if(!empty($status['redirect_url'])){$redirURL=$status['redirect_url'];}}   if(empty($redirURL)){preg_match('/(Location:|URI:)(.*?)(\r|\n)/si', $data, $m);if (!empty($m[2])){ $redirURL=$m[2]; } } if(empty($redirURL)){preg_match('/href\=\"(.*?)\"(.*?)here\<\/a\>/si',$data,$m); if (!empty($m[1])){ $redirURL=$m[1]; } }   if(!empty($redirURL)){$t=debug_backtrace(); return call_user_func( $t[0]["function"], trim($redirURL), $post_paramtrs);}}} return "ERRORCODE22 with $url!!<br/>Last status codes<b/>:".json_encode($status)."<br/><br/>Last data got<br/>:$data";}

ВНИМАНИЕ: Он автоматически решает проблему FOLLOWLOCATION + Удаленные URL-адреса автоматически исправляются! (src = "./ imageblabla.png" --------> src = "http://example.com/path/imageblabla.png")

p.s.on на серверах дистрибутивов GNU / Linux, вам может понадобиться установить пакет php5-curl, чтобы использовать его.

2 голосов
/ 01 февраля 2010

Ответ Пекки, вероятно, лучший способ сделать это. Но в любом случае вот регулярное выражение, которое вы можете использовать, если вы обнаружите, что делаете что-то подобное, и не можете полагаться на RSS-каналы и т. Д.

document\.write\('      // start tag
([^)]*)                 // the data to match
'\)                     // end tag

РЕДАКТИРОВАТЬ например:

<?php
$subject = "document.write('&quot;Paying for college is often a matter of in-tuition.&quot;<br />')\ndocument.write('<i>&copy; 1996-2007 <a target=\"_blank\" href=\"http://www.punoftheday.com\">Pun of the Day.com</a></i><br />')";
$pattern = "/document\.write\('([^)]*)'\)/";
preg_match($pattern, $subject, $matches);
print_r($matches);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...