首页 > 编程技术 > php

php中curl和file_get_content函数抓页面对比

发布时间:2016-11-25 15:41

抓取远程内容,之前一直都在用file_get_content函数,其实早就知道有curl这么一个好东西的存在,但是看了一眼后感觉使用颇有些复杂,没有file_get_content那么简单,再就是需求也不大,所以没有学习使用curl。

直到最近,要做一个网页小偷程序的时候才发现file_get_content已经完全不能满足需求了。我觉得,在读取远程内容的时候,file_get_content除了使用比curl便捷以外,其他都没有curl好。


php中curl和file_get_content的一些比较


主要区别:


学习才发现,curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP,也就是说,它能做到很多file_get_content做不到的事情。curl在php可以实现远程获取和采集内容;实现PHP网页版的FTP上传下载;实现模拟登陆;实现接口对接(API),数据传输;实现模拟Cookie;下载文件断点续传等等,功能十分强大。


了解curl一些基本的使用后,才发现其实并不难,只不过记住里面一些设置参数,难弄一点,但是我们记住几个常用的就可以了。


开启curl:


因为PHP默认是不支持curl功能的,因此如果要用curl的话,首先需要在php.ini中开启该功能,即去掉 ;extension= php_curl.dll 前面的分号,然后保存后重启apache/iis就好了。


基本语法:

 

 代码如下 复制代码

$my_curl = curl_init();    //初始化一个curl对象

curl_setopt($my_curl, CURLOPT_URL, "http://www.111cn.net");    //设置你需要抓取的URL

curl_setopt($my_curl,CURLOPT_RETURNTRANSFER,1);    //设置是将结果保存到字符串中还是输出到屏幕上,1表示将结果保存到字符串

$str = curl_exec($curl);    //执行请求

echo $str;    //输出抓取的结果

curl_close($curl);    //关闭url请求

下面一起来看个在学习环境下的xampp开启xampp Mysql数据库等的远程访问例子 ,希望例子对各位同学会有所帮助。

在访问XAMPP所建立的Mysql数据库时,若出现
New XAMPP security concept:
Access to the requested directory is only available from the local network.
This setting can be configured in the file “httpd-xampp.conf”.
则一般可以按一下步骤进行解决~
1、关闭数据库所在服务器的防火墙
2、修改配置文件 httpd-xampp.conf
打开httpd-xampp.conf(/xampp/apache/conf/extra/httpd-xampp.conf)
用记事本打开该文件,将所有Deny from all这一行注释掉,即改为 #Deny from all
3、重启服务器
 
注意:我这里只是用 xampp 作为本地测试用,正式网站就不要那么随便设置了!

下面来给大家整理卫些关于php实现a到z及其中的”奇怪现象”例子,希望文章对各位会有所帮助。

版本一:
for($i=ord('a'); $i<ord('z'); $i++) {
    echo chr($i);
}

版本二(与第一版类似使用ascii):
for($i=0; $i<26; $i++) {
    echo chr($i+97);
}
版本三:
echo implode('', range('a', 'z'));
版本四(高智商坑爹版):
for($i='a'; $i!='aa'; $i++) {
    echo $i;
}
版本五:
for($i='a'; strlen($i)<2; $i++) {
    echo $i;
}
前两个循环很容易理解,a到z每个字母的ascii码值是递增不变的,所以这两个方法就是通过ascii值去做循环计算,用到了php内置的ord()和chr()函数。
第三个方法使用php内置的range()函数生成一个从a到z递增的数组,步长为1,之后用implode函数将数组合并成字符串。
后两个方法就是本篇标题中所要讲的”奇怪现象”。
从理论上来讲,咱们用for($i=’a'; $i<'z';$i++)的写法也很正确,合情合理。。。但现实是残酷的,试一下就会发现得到的并不是想要结果。前面a到z是出来了,后面又输出一长串字符。
如果在for循环中每次输出一个换行再观察的话就会发现一个规则,a-z, 下一次输出了aa、ab、ac...az,然后是ba、bb、bc...bz.... 也就是php在给z加一后自动“进位”了。php一个奇特的26进制。当"当前位"的z加1后会向它前面的一位上增加1,然后当前位变为a。'z'++ => ‘aa’,’az’=>’ba’,’zz’=>’aaa’….
注意的两点:1.这种规律不能用于判断。如’z'<‘aa’是false。php中字符串比较时只会由左至右依次比较。2.目前只发现在”前自加”或”前自减”时会出现此种规律,参与其它算术运算时php将纯字符串强转为0。

今天帮助一个客户做一上企业网站,发现企业网站做好之后它准备了几百张图片让我上传,这个对于我来讲非常的不想做了,但后来发现可以直接使用程序读取目录然后保存到mysql中就可以解决了,下面我只找到一个函数关于mysql操作部份呆会我再写。
 代码如下 复制代码

<?php
 
    $dir="images/";//定义路径
 
    $dir_res=opendir($dir);//打开目录
 
    $fileFormat=array(0=>".jpg",1=>".gif",2=>".png",3=>".bmp");//图片格式
 
    while(false !== ( $filen=readdir($dir_res) ) )
    {
    for($i=0;$i<count($fileFormat);$i++)
    {
       if(substr($filen,strpos($filen,"."))==$fileFormat[$i])
       {
        //echo '<div class="inner"><img" width=100% src="'.$dir.$filen.'" width="120" height="90" border="0" align="absmiddle" onmouseover="setImgBorder(this)" onmouseout="clearBorder(this)" style="margin:15px;" onclick="goToBigPage(this)" /></div>';  
        $img_arr[] = $dir.$filen;   //存入数组
        break ;
       } www.111cn.net
    }
    }
    closedir($dir_res);
    //print_r( json_encode($img_arr) );//转json格式
    $s=json_encode($img_arr);
    echo $s;
?>

script代码

 代码如下 复制代码

<script>
$(function(){
    $.ajax({
        url: 'img.php',
        type: 'POST',
        dataType: 'JSON',
        data: {param1: 'value1'},
    })
    .done(function(data) {
        //console.log("success");
        for(attr in data) {
 
            $("body").append("<img" width=100% src="+ data[attr] +" />");
        }
    })
    .fail(function() {
        console.log("error");
    })
    .always(function() {
        console.log("complete");
    });
     
}) 
</script>

在iis+php环境中is_dir()与mkdir()的用法在与apache中用法是一样的,但是反应的路径会有所区别,下面我简单介绍一下。

is_dir('/abc');正常情况下应该是判断web应用根目录下是否有test存在。但在IIS下,这时判断的是分区根目录。

如果用mkdir('/abc')建立的目录将跑到分区根目录下去。

所以,IIS下php目录相关的操作,现在只能用相对路径或者物理路径。

标签:[!--infotagslink--]

您可能感兴趣的文章: