使用php从网址获取内容

时间:2010-02-01 11:08:17

标签: php

我想从特定的网址获取动态内容:

我使用过代码

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里面的字符串会改变,其他代码将保持不变

此致

的Pankaj

3 个答案:

答案 0 :(得分:7)

您正在获取一个JavaScript代码段,该代码段应该直接内置到文档中,而不是由脚本查询。里面的代码是JavaScript。

您可以使用正则表达式提取代码,但我会反对它。首先,它可能不合法。其次,他们所服务的数据格式可以随时更改,从而破坏您的脚本。

我认为你应该在their RSS feed。您可以比JavaScript更轻松地以编程方式解析。

查看此问题:Best way to parse RSS/Atom feeds with PHP

答案 1 :(得分:4)

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问题+远程网址会自动重新校正! (src =“./ imageblabla.png”--------&gt; src =“http://example.com/path/imageblabla.png”)

。在GNU / Linux发行版服务器上,您可能需要安装php5-curl软件包才能使用它。

答案 2 :(得分:2)

Pekka的答案可能是最好的方法。但无论如何,这里是您可能想要使用的正则表达式,以防您发现自己在做这样的事情,并且不能依赖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);
?>