PHP通过远程调用获取页面的内容

时间:2012-05-29 22:07:53

标签: php http url fsockopen

好的,所以我正在寻找的有点类似于下面的代码,这是非常虚拟的,由于某些原因我现在完全不关心(请在代码下阅读问题!!):< / p>

$url = urldecode($_GET["link"]);
$port = (preg_match("/^https\:\/\//", $url) > 0 ? 443 : 80);

$headers  = "GET / HTTP/1.1\r\n";
$headers .= "Host: $url";
$headers .= "Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.3\r\n";
$headers .= "Accept-Encoding: gzip,deflate,sdch\r\n";
$headers .= "Accept-Language: hu-HU,hu;q=0.8,en-US;q=0.6,en;q=0.4\r\n";
$headers .= "Cache-Control: no-cache\r\n";
$headers .= "Connection: keep-alive\r\n";
$headers .= "User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5\r\n\r\n";
//yea, I'm using Google Chrome's userAgent

$socket = @fsockopen($url, $port) or die("Could not connect to $url");

if ($socket) {

    fwrite($socket, $headers);

    while (!feof($socket)) {
        echo fgets($socket, 128);
    }

    fclose($socket);
}

正如您所看到的,我想要实现的是以某种方式从GET全局中的url中获取html或任何其他输出。再次,代码不起作用,我不在乎,我不需要代码校正,我需要信息/指导。

现在。我不是PHP大师所以问题有点复杂:

  • 我有什么选择来实现上述需求?
  • 在执行该特定方法之前/之后我需要注意什么?
  • 任何dependecnies(图书馆)?
  • pros / kontras /以前的经历?

另外,我非常感谢你用一堆链接回答,我并不是在寻找一个机器人的答案,比如“这是你应该做的最神圣和唯一的方式!”,我更关心的是收集信息和选择,知识。 =)

我不知道这是否重要(比如MongoDB的驱动程序):我目前在Windows 7 x64上使用WAMP Server,后来我计划将它移到我的CentOS 6.2网络服务器上,所以也请考虑这些(可能依赖于Linux)。

2 个答案:

答案 0 :(得分:3)

如果您想要更改useragent并获取页面内容,则有几个选项:

第一个也是最好的IMO是curl,99.9%的主机已启用此功能,如果它是您自己的vps,那么它很容易设置http://bit.ly/KUn3AS

<?php 
function curl_get($url){
    if (!function_exists('curl_init')){
        die('Sorry cURL is not installed!');
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}
?>

其次是file_get_contents带有自定义流上下文:

<?php
function fgc_get($url) {
    $opts = array(
      'http'=>array(
        'method'=>"GET",
        'header'=>"Accept-language: en\r\n" .
                  "Cookie: foo=bar\r\n" .
                  "User-Agent: MozillaXYZ/1.0\r\n"
      )
    );
    $context = stream_context_create($opts);
    $urlContents = file_get_contents($url, false, $context);
    return file_get_contents($url, false, $context);
}
?>

如果您接受来自用户的任意网址输入$ _GET然后在某些情况下开放滥用,您选择哪种方法,如果您想要为您的网站AJAX请求设置代理,那么您可以添加一些安全性,如只允许特定的域名,或在做任何外部废料之前检查它是否是xmlhttprequest / AJAX请求,你可以让它打开你的选择:

<?php 
if(!empty($_GET['url']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {

    $allowed = array('somesite.com','someothersite.com');

    $url = parse_url($_GET['url']);

    if(in_array($url['host'],$allowed)){
        echo curl_get($_GET['url']);
    }
    die;
}
?>

答案 1 :(得分:0)

从网址获取内容的简单方法

1)第一种方法

在您的主机(php.ini或某处)启用Allow_url_include

<?php
$variablee = readfile("http://example.com/");
echo $variablee;
?> 

2)第二种方法

启用php_curl,php_imap,php_openssl

<?php
// you can add anoother curl options too
// see here - http://php.net/manual/en/function.curl-setopt.php
function get_data($url) {
  $ch = curl_init();
  $timeout = 5;
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
  curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

$variablee = get_data('http://example.com');
echo $variablee;
?>