教你怎么用php完结英雄结盟数据远程获取_php实例_脚本之家

过几天网站就要上线了。

先看一个简单的

示例代码1: 用file_get_contents 以get方式获取内容 复制代码 代码如下: 示例代码2: 用fopen打开url,
以get方式获取内容 复制代码 代码如下:
$fp=fopen; printarr(stream_get_meta_data; while{ $result.=fgets; }
echo”url body: $result”; printhr; ?>
示例代码3:用file_get_contents函数,以post方式获取url 复制代码 代码如下:array( ‘method’=>’POST’,
‘header’=>”Content-type: application/x-www-form-urlencodedrn”.
“Content-Length: “.strlen.”rn”, ‘content’=>$data ), );
$context=stream_context_create;
$html=file_get_contents(‘);
echo$html; ?>
示例代码4:用fsockopen函数打开url,以get方式获取完整的数据,包括header和body
复制代码 代码如下: functionget_url{
$url=parse_url; $query=$url[path].”?”.$url[query]; ec;
$fp=fsockopen($url[host],$url[port]?$url[port]:80,$errno,$errstr,30);
if{ returnfalse; }else{ $request=”GET$queryHTTP/1.1rn”;
$request.=”Host:$url[host]rn”; $request.=”Connection:
Closern”; if$request.=”Cookie: $cookien”; $request.=”rn”;
fwrite; while{ $result.=@fgets; } fclose; return$result; } }
//获取url的html部分,去掉header functionGetUrlHTML{ $rowdata=get_url;
if { $body=stristr; $body=substr); return$body; } returnfalse; } ?>
示例代码5:用fsockopen函数打开url,以POST方式获取完整的数据,包括header和body
复制代码 代码如下:
functionHTTP_Post($URL,$data,$cookie,$referrer=””){ // parsing the
given URL $URL_Info=parse_url; // Building referrer if// if not given
use this script. as referrer $referrer=”111″; // making string from
$data foreach $values[]=”$key=”.urlencode; $data_string=implode; //
Find out which port is needed – if not given use standard if(!isset
$URL_Info[“port”]=80; // building POST-request: $request.=”POST
“.$URL_Info[“path”].” HTTP/1.1n”; $request.=”Host:
“.$URL_Info[“host”].”n”; $request.=”Referer:$referern”;
$request.=”Content-type: application/x-www-form-urlencodedn”;
$request.=”Content-length: “.strlen.”n”; $request.=”Connection:
closen”; $request.=”Cookie: $cookien”; $request.=”n”;
$request.=$data_string.”n”;
$fp=fsockopen($URL_Info[“host”],$URL_Info[“port”]); fputs; while{
$result.=fgets; } fclose; return$result; } printhr(); ?>
示例代码6:使用curl库,使用curl库之前,你可能需要查看一下php.ini,查看是否已经打开了curl扩展
复制代码 代码如下: $ch = curl_init();
$timeout = 5; curl_setopt ($ch, CURLOPT_URL, ”);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch,
CURLOPT_CONNECTTIMEOUT, $timeout); $file_contents = curl_exec; echo
$file_contents; ?> 关于curl库: curl官方网站
curl 是使用URL语法的传送文件工具,支持FTP、FTPS、HTTP HTPPS SCP SFTP
TFTP TELNET DICT FILE和LDAP。curl 支持SSL证书、HTTP POST、HTTP PUT 、FTP
上传,kerberos、基于HTT格式的上传、代理、cookie、用户+口令证明、文件传送恢复、http代理通道和大量其他有用的技巧
复制代码 代码如下: functionprintarr {
echo”
Row field count: “.count.”
“; foreach { echo”$key=$value
“; } } ?> ======================================================
PHP抓取远程网站数据的代码
现在可能还有很多程序爱好者都会遇到同样的疑问,就是要如何像搜索引擎那样去抓取别人网站的HTML代码,然后把代码收集整理成为自己有用的数据!今天就等我介绍一些简单例子吧.
Ⅰ.抓取远程网页标题的例子: 以下是代码片段: 复制代码 代码如下:]*s*/i”; $reg = ‘/^$/i’;
preg_match_all ($rex, $file_contents, $r); $result = “”; //array{ if
{ foreach{ if { $result .= $host_url . $d.”n”; } } } } return
$result; } //获取指定内容中的多媒体文件 function
get_content_object($str, $split=”|–:**:–|”){ $regx =
“/hrefs*=s*[‘”]*[“‘>]*s*/i”; preg_match_all; if
{ $result[2] = str_replace(“多媒体: “, “”, $result[2]);
$result[2] = str_replace(“
“, “”, $result[2]); $result =
$result[1][0] . $split .$result[2][0] . “n”; } return $result;
} ?> ======================================================
同一域名对应多个IP时,PHP获取远程网页内容的函数
fgc就是简单的读取过来,把一切操作封装了
fopen也进行了一些封装,但是需要你循环读取得到所有数据。
fsockopen这是直板板的socket操作。 如果仅仅是读取一个html页面,fgc更好。
如果公司是通过防火墙上网,一
般的file_get_content函数就不行了。当然,通过一些socket操作,直接向proxy写http请求也是可以的,但是比较麻烦。
如果你能确认文件很小,可以任选以上两种方式fopen
,join;。比如,你只操作小于1k的文件,那最好还是用file_get_contents吧。

直接看代码吧。

最近完成了一个小功能,就是LOL数据获取,

然后我用PHP实现了这个功能,我觉得用PHP来做这项工作简直是一种享受!使用其提供的强大的HTML页面处理函数和正则表达式,短短的几行代码就能搞定这个功能。

如果确定文件很大,或者不能确定文件的大小,那就最好使用文件流了。fopen一个1K的文件和fopen一个1G的文件没什么明显的区别。内容长,就可以花更长的时间去读,而不是让脚本死掉。

PHP获取远程网页内容有多种方式,例如用自带的file_get_contents、fopen等函数。
但是,在DNS轮询等负载均衡中,同一域名,可能对应多台服务器,多个IP。假设img.jb51.net被DNS解析到
72.249.146.213、72.249.146.214、72.249.146.215三个IP,用户每次访问img.jb51.net,系统会根据负载均衡的相应算法访问其中的一台服务器。
上周做一个视频项目时,就碰到这样一类需求:需要依次访问每台服务器上的一个PHP接口程序,查询这台服务器的传输状态。
这时就不能直接用file_get_contents访问
而采用依次访问
Server配有多个虚拟主机时,也是不行的。
通过设置本地hosts也不行,因为hosts不能设置多个IP对应同一个域名。
那就只有通过PHP和HTTP协议来实现:访问abc.php时,在header头中加上img.jb51.net域名。于是,我写了下面这个PHP函数:
复制代码 代码如下:

复制代码 代码如下:

比如:我给你一个号,你把这个号是否打过排位?战斗力是多少?胜率和所在的总场数数据获取过来

 贴一下关键代码:

// helper functions//
—————————————————————————–//
get html dom form filefunction file_get_html() { $dom = new
simple_html_dom; $args = func_get_args();
$dom->load(call_user_func_array(‘file_get_contents’, $args),
true); return $dom;}

数据都在多玩的网站上可查,所以该做的功能就是远程抓取。

 代码如下

// get html dom form stringfunction str_get_html($str,
$lowercase=true) { $dom = new simple_html_dom; $dom->load; return
$dom;}

功能没啥亮点,就是简单的实现。

<?php

// dump html dom treefunction dump_html_tree($node, $show_attr=true,
$deep=0) { $lead = str_repeat; echo $lead.$node->tag; if
($show_attr && count { echo ‘(‘; foreach($node->attr as $k=>$v)
echo “[$k]=>””.$node->$k.'”, ‘; echo ‘)’; } echo “n”;

反正就是JS不能跨域,然后用PHP去跨域,用file_get_content好类或者是curl好,都不重要。重要是的能理解业务流程。

 //获取优酷页面中的flash地址
 function get_flash_url( $url )
 {
  $lines = file($url);
  foreach ($lines as
$linenum=> $line) {      
   
  preg_match_all(‘|<input
type=”text” id=”link2″ value=”([^<>]+)”
/>|’,$line,$result);
      $swfurl=$result[1][0];
      if(!empty($swfurl))
    return $swfurl;
  }
 }
?>

foreach dump_html_tree($c, $show_attr, $deep+1);}

上面这个图就是执行业务流程图。清楚流程了,然后代码就好写了

<?php

// get dom form file function file_get_dom() { $dom = new
simple_html_dom; $args = func_get_args();
$dom->load(call_user_func_array(‘file_get_contents’, $args),
true); return $dom;}

当然说了,这里就,重点是PHP怎么去抓取数据的。

 $url=$_SERVER[“QUERY_STRING”];
 
 $flashurl= get_flash_url($url);
 
 echo ( $flashurl );
 
?>

// get dom form string function str_get_dom($str, $lowercase=true) {
$dom = new simple_html_dom; $dom->load; return $dom;}

这里要介绍一款非常好的PHP类,Simple_html_dom

比如这个文件我们存为 test.php,那么我们只需要运行 test.php?优酷视频的url
就可以解析出FLASH地址了。

// simple html dom node//
—————————————————————————–class
simple_html_dom_node { public $nodetype = HDOM_TYPE_TEXT; public
$tag = ‘text’; public $attr = array(); public $children = array();
public $nodes = array(); public $parent = null; public $_ = array();
private $dom = null;

复制代码 代码如下:public function
getData(){ $server = isset?trim:NULL; $name = isset?trim:NULL;
import(“@.ORG.SimpleHtmlDom”); //数据抓取类 $url =
“;
$html = file_get_html; $dom = $html->find->children;
$result[‘zdl’] = strip_tags; $doms = $html->find->children;
//echo $html->find->innertext; $temp = $doms->plaintext;
$tempArray = explode; foreach($tempArray as $key=>$value) { if {
$tempArr[] = trim; } } unset; //获取排位类型 $pwtype = $tempArr[8];
$pwtotal = $tempArr[12]; $pwsl = $tempArr[14]; if { $result[‘pw’]
= $pwtotal; $result[‘pwsl’] = $pwsl; }else{ $result[‘pw’] = “0”;
$result[‘pwsl’] = “0”; } $this->ajaxReturn ;}

 

function __construct { $this->dom = $dom; $dom->nodes[] =
$this; }

上面这些代码,暴露了哥英语过了四级但还是硬伤的BUG。上面这个类很简单,难点在于怎么去分析多玩查询页面的数据。用firebug看看吧。写多了,你就知道的了。当然了,你想查询rank隐藏分数,也是可以滴,不过要去马化腾网站去获取数据了,这里就不详细说明了,提供个思路就可以了

思路很简单,就是先看看优酷视频网页的HTML代码里关键FLASH地址那段的特征。随便找个网页,比如我们可以看到这一段:

function __destruct; }

 代码如下

function __toString() { return $this->outertext(); }

<div class=”item”><span class=”label”>flash地址:
</span> <input type=”text” id=”link2″
value=”” />

// clean up memory due to php5 circular references memory leak…
function clear() { $this->dom = null; $this->nodes = null;
$this->parent = null; $this->children = null; } // dump node’s
tree function dump { dump_html_tree; }

然后使用正则表达式来将其中的地址段匹配掉,就OK了,上面只是单个的,后来找到一个升级的方法,可以自动获取各大视频网站flash视频播放地址。

// returns the parent of node function parent() { return
$this->parent; }

目前已支持新浪播客、优酷网、土豆网、酷6网、搜狐视频、56网、奇艺网、凤凰网等视频网站的视频播放页链接。

// returns children of node function children { if return
$this->children; if (isset($this->children[$idx])) return
$this->children[$idx]; return null; }

 代码如下

// returns the first child of node function first_child() { if (count
return $this->children[0]; return null; }

发表评论

电子邮件地址不会被公开。 必填项已用*标注