2013年02月的文章

PHP函数:CURL抓取网站内容的,支持301 302跳转

我们在抓取网站内容的时候,经常遇到稀奇古怪的防盗链,比如上次碰到一个站的图片地址是假的,访问后要301跳转一次才到真正的图片路径,这个真实的路径又做了防盗措施,判断referer是不是上个假的图片地址。用curl试了几次,终于整出一个函数,效果不错。

$curl_loops = 0;//避免死了循环必备
$curl_max_loops = 3;
 
function curl_get_file_contents($url, $referer='') {
global $curl_loops, $curl_max_loops;
$useragent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
if ($curl_loops++ >= $curl_max_loops) {
  $curl_loops = 0;
  return false;
} 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);?curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_REFERER, $referer);
$data = curl_exec($ch);
$ret = $data;
list($header, $data) = explode("\r\n\r\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$last_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
curl_close($ch);
if ($http_code == 301 || $http_code == 302) {
  $matches = array();
  preg_match('/Location:(.*?)\n/', $header, $matches);
  $url = @parse_url(trim(array_pop($matches)));
  if (!$url) {
  ?$curl_loops = 0;
  ?return $data;
  } 
  $new_url = $url['scheme'] . '://' . $url['host'] . $url['path']
   . (isset($url['query']) ? '?' . $url['query'] : '');
  $new_url = stripslashes($new_url);
  return curl_get_file_contents($new_url, $last_url);
} else {
  $curl_loops = 0;
  list($header, $data) = explode("\r\n\r\n", $ret, 2);
  return $data;
} 
}

关键词: curl抓取内容

php使用curl存取cookie进行登录抓取数据示例

curl真的太强大了,不是一般的强大的,curl可以抓取数据,也可以登录,然后获取数据,很多人不是很懂,其实慢比较简单的。其实,只要,只看手册就可以很容易把握。下面给个例子,看完后就全都明了了:

<?php
$cookie_jar_index = 'cookie.txt';
 
$url = "http://www.71j.cn/perl/login.pl";
$params = "username=dudu&password=****";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar_index);
//curl_setopt($ch, CURLOPT_COOKIE, "fruit=apple; colour=red");
//上面代码是直接传递cookie信息,而非文件
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params); 
//curl_setopt($ch, CURLOPT_NOBODY, 1);//这个不能打开,否则无法生成cookie文件
ob_start();
curl_exec($ch);
curl_close($ch);
ob_clean();
 
$url = "http://www.71j.cn/perl/myfavorites.pl";
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, $url);
curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar_index);
ob_start();
curl_exec($ch2);
curl_close($ch2);
$rs = ob_get_contents(); //$rs就是返回的内容
ob_clean();
 
print_r($rs);
 
?>

关键词: curl存取co

使用javascript 获取url网址的参数值

随着Ajax的泛滥,有时需要我们从url获取变量进行用户交互,本函数提供了获取方法:

function getQuery(name)
{
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r!=null) return unescape(r[2]); return null;
}

如需要从下面地址中获取id的值:

http:///a.php?a=my&id=7&m=1

只需要在当前页面调用getQuery(“id”)即可。

关于测试curl 与file_get_contents抓取内容效率及稳定性

做过好多抓取别家网站内容的产品,从前,很习惯了使用方便快捷的file_get_contents函数,但是总是会遇到获取失败的问题,在本地测试有时候经常报错,很奇怪:

这时候,看一下服务器的连接池,会发现一堆类似的错误,让你头疼万分:

file_get_contents(http://***): failed to open stream…

不得已,安装了curl库,写了一个函数替换:


function curl_file_get_contents($durl){
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $durl);
   curl_setopt($ch, CURLOPT_TIMEOUT, 5);
   curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
   curl_setopt($ch, CURLOPT_REFERER,_REFERER_);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   $r = curl_exec($ch);
   curl_close($ch);
   return $r;
 }
关于curl和file_get_contents的测试:

» 阅读全文

关键词: file_get_contents效率 , curl 效率

IE Hack兼容火狐和IE6/7/8/9全收集

记录一下IE中Hack的支持情况,兼容火狐和IE6/7/8/9的Css Hack:

#hack{
color:red; /* 所有浏览器都支持 */
color:red !important;/* 除IE6外 */
_color:red; /* IE6支持 */
*color:red; /* IE6、IE7支持 */
+color:red;/*IE7支持*/
*+color:red; /* IE7支持 */
color:red\9; /* IE6、IE7、IE8、IE9支持 */
color:red\0; /* IE8、IE9支持 */
color:red\9\0;/*IE9支持*/
}

关键词: ie hack

将人民币数字转化为人民币大写格式的PHP函数

这个函数用来把人民币数字转换为人民币大写格式,这个函数感觉还可以。要的拿去吧。


function toCNFormat($data) {
 $data = strpos($data, ".") === false? $data . ".00":$data;
 if (!preg_match("/^[0-9\.]+$/", $data))return "";
 $capnum = array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
 $capdigit = array("", "拾", "佰", "仟");
 $subdata = explode(".", $data);
 $yuan = $subdata[0];
 $j = 0;
 $nonzero = 0;
 for($i = 0;$i < strlen($subdata[0]);$i++) {
  if (0 == $i) {
   if ($subdata[1]) {
    $cncap = substr($subdata[0], -1, 1) != 0?"元":"元零";
   } else {
    $cncap = "元";
   }
  }
  if (4 == $i) {
   $j = 0;
   $nonzero = 0;
   $cncap = "万" . $cncap;
  }
  if (8 == $i) {
   $j = 0;
   $nonzero = 0;
   $cncap = "亿" . $cncap;
  }
  $numb = substr($yuan, -1, 1);
  $cncap = ($numb)?$capnum[$numb] . $capdigit[$j] . $cncap:(($nonzero)?"零" . $cncap:$cncap);
  $nonzero = ($numb)?1:$nonzero;
  $yuan = substr($yuan, 0, strlen($yuan)-1);
  $j++;
 }
 
 if ($subdata[1]) {
  $chiao = substr($subdata[1], 0, 1)?$capnum[substr($subdata[1], 0, 1)] . "角":"零";
  $cent = substr($subdata[1], 1, 1)?$capnum[substr($subdata[1], 1, 1)] . "分":"";
 }
 $cncap .= $chiao . $cent . "整";
 $cncap = preg_replace("/(零)+/", "\\1", $cncap);
 $cncap = str_replace("零整", "整", $cncap);
 return $cncap;
}
echo toCNFormat("110502.35");


关键词: php函数 , 人民币大写

JS实现iframe框架延后加载

JS实现iframe框架延后加载。应用场景,譬如:登录状态区域部分,需要进行延后加载,但是框架直接通过JS更改地址是无法进行正常加载的,所以代码如下。

需要加载区域HTML代码:

<div id="indexlogin"></div>

底部JS代码:

<span id="tmpjsnews"><script type="text/javascript" src="http://bbs.wehefei.com/forum.php?mod=checklogin" language="javascript"></script></span>
<script type="text/javascript">document.getElementById("indexlogin").innerHTML=document.getElementById("tmpjsnews").innerHTML;</script>

关键词: 延后加载 , iframe框架

php安全开发:添加随机字符串验证,防止伪造跨站请求

伪造跨站请求比较难以防范,而且危害巨大,攻击者可以通过这种方式恶作剧,发spam信息,删除数据等等。那怎么防范伪造跨站攻击呢?

yahoo对付伪造跨站请求的办法是在表单里加入一个叫.crumb的随机串;而facebook也有类似的解决办法,它的表单里常常会有post_form_idfb_dtsg

比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查。这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦。现在防范方法基本上都是基于这种方法的了


随机串代码实现

咱们按照这个思路,山寨一个crumb的实现,代码如下:

» 阅读全文

关键词: 伪造跨站 , php安全开发

Total: 1612Next ›