php curl 抓取页面几种方法介绍

 更新时间:2016年11月25日 16:22  点击:1982
curl主要是抓取数据,当然我们可以用其他的方法来抓取,比如fsockopen,file_get_contents等。但是只能抓那些能直接访问的页面,如果要抓取有页面访问控制的页面,或者是登录以后的页面就比较困难了。

是把PHP的主页取回放到一个文件中。

例 1. 使用PHP的CURL模块取回PHP主页

 代码如下 复制代码
<?php
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, "http://localhost/mytest/phpinfo.php");
 curl_setopt($ch, CURLOPT_HEADER, false);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //如果把这行注释掉的话,就会直接输出
 $result=curl_exec($ch);
 curl_close($ch);


2,使用代理进行抓取

为什么要使用代理进行抓取呢?以google为例吧,如果去抓google的数据,短时间内抓的很频繁的话,你就抓取不到了。google对你的ip地址做限制这个时候,你可以换代理重新抓。

 

 代码如下 复制代码
<?php
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
 curl_setopt($ch, CURLOPT_HEADER, false);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
 curl_setopt($ch, CURLOPT_PROXY, 125.21.23.6:8080);
 //url_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:password');如果要密码的话,加上这个
 $result=curl_exec($ch);
 curl_close($ch);
 ?>

3,post数据后,抓取数据

单独说一下数据提交数据,因为用 curl的时候,很多时候会有数据交互的,所以比较重要的。

 代码如下 复制代码

<?php
 $ch = curl_init();
 /*在这里需要注意的是,要提交的数据不能是二维数组或者更高
 *例如array('name'=>serialize(array('tank','zhang')),'sex'=>1,'birth'=>'20101010')
 *例如array('name'=>array('tank','zhang'),'sex'=>1,'birth'=>'20101010')这样会报错的*/
 $data = array('name' => 'test', 'sex'=>1,'birth'=>'20101010');
 curl_setopt($ch, CURLOPT_URL, 'http://localhost/mytest/curl/upload.php');
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 curl_exec($ch);
 ?>在 upload.php文件中,print_r($_POST);利用curl就能抓取出upload.php输出的内容Array ( [name] => test [sex] => 1 [birth] => 20101010 )

4,抓取一些有页面访问控制的页面

页面访问控制的3种方法

页面访问控制的3种方法张映 发表于 2010-10-12

分类目录: apache/nginx
我们经常会看到这种现象,看下图


apache 页面访问控制
为什么要进行这样的控制呢,给不同的人看不同的东西,对信息进行保护,虽然这种保护比较低级,多多少少还是有点用的。

一,用htpasswd命令,产生权限控制文件

 代码如下 复制代码

查看复制打印?
1.[zhangy@BlackGhost test]$ htpasswd -c ./access tank  //生成一个密码文件 ,-c是新建一个文件  htpasswd -h可查看  
2.New password:            //提示输入密码  
3.Re-type new password:        //重复密码  
4.Adding password for user tank  
5.[zhangy@BlackGhost test]$ cat access    //查看一下密码文件  
6.tank:Uj5B3qIF/BNdI      //用户名是明文的,密码是加密的。 
[zhangy@BlackGhost test]$ htpasswd -c ./access tank  //生成一个密码文件 ,-c是新建一个文件  htpasswd -h可查看
New password:            //提示输入密码
Re-type new password:        //重复密码
Adding password for user tank
[zhangy@BlackGhost test]$ cat access    //查看一下密码文件
tank:Uj5B3qIF/BNdI      //用户名是明文的,密码是加密的。到这儿密码文件是生成好了。

二,页面访问控制方法

1,能过修改httpd.conf或者是httpd-vhosts.conf来进行配置

 

 代码如下 复制代码

listen 10004
NameVirtualHost *:10004
<VirtualHost *:10004>
 DocumentRoot "/home/zhangy/www/test"
 ServerName *:10004
 BandwidthModule On
 ForceBandWidthModule On
 Bandwidth all 1024000
 MinBandwidth all 50000
 LargeFileLimit * 500 50000
 MaxConnection all 2

 ErrorLog "/home/zhangy/apache/blog.51yip.com.com-error.log"
 CustomLog "/home/zhangy/apache/blog.51yip.com-access.log" common
//看一下,下面的配置
 <Directory /home/zhangy/www/test>
 AuthType Basic
 AuthName "access test"
 AuthUserFile /home/zhangy/www/test/access
 Require valid-user
 </Directory>

</VirtualHost>

2,我们可以利用.htaccess文件来进行控制

在test的根目录下面建一个.htaccess的文件

 代码如下 复制代码

[zhangy@BlackGhost test]$ vi .htaccess&nbsp;&nbsp; //打开个文件 ,添加权限内容
[zhangy@BlackGhost test]$ cat .htaccess&nbsp; //下面就是.htaccess的内容
 AuthType Basic
 AuthName "access test"
 AuthUserFile /home/zhangy/www/test/access
 Require valid-user

3,不用密码文件,也可以进行访问控制

 代码如下 复制代码

define('ADMIN_USERNAME','tank'); &nbsp;&nbsp; &nbsp;// Admin Username
define('ADMIN_PASSWORD','tank'); &nbsp;&nbsp;&nbsp; &nbsp;// Admin Password

//log check
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
 $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME ||$_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) {
 Header("WWW-Authenticate: Basic realm="access test"");
 Header("HTTP/1.0 401 Unauthorized");

 echo &lt;&lt;&lt;EOB
 &lt;html&gt;&lt;body&gt;
 &lt;h1&gt;Rejected!&lt;/h1&gt;
 &lt;big&gt;Wrong Username or Password!&lt;/big&gt;
 &lt;/body&gt;&lt;/html&gt;
EOB;
 exit;
}

curl相关函数列表:

curl_init — 初始化一个CURL会话
curl_setopt — 为CURL调用设置一个选项
curl_exec — 执行一个CURL会话
curl_close — 关闭一个CURL会话
curl_version — 返回当前CURL版本
curl_init — 初始化一个CURL会话
描述
int curl_init ([string url])
curl_init()函数将初始化一个新的会话,返回一个CURL句柄供 curl_setopt(), curl_exec(),和 curl_close() 函数使用。如果可选参数被提供,那么CURLOPT_URL选项将被设置成这个参数的值。你可以使用curl_setopt()函数人工设置。

例 1. 初始化一个新的CURL会话,且取回一个网页

 代码如下 复制代码

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, “http://www.zend.com/”);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_exec ($ch);
curl_close ($ch);
?>

今天在安装Pdo_MySQL模块时提示PDO_MYSQL make: *** [pdo_mysql.lo]之类的错误,下面来看解决办法。

编译安装PDO_MYSQL拓展模块,总是提示 PDO_MYSQL make: *** [pdo_mysql.lo] Error 1 下 /software/PDO_MYSQL-1.0.2/php_pdo_mysql_int.h:25:19: error: mysql.h: No such file or directoryIn file included from /software/PDO_MYSQL-1.0.2/pdo_mysql.c:31:


解决办法:

通过软连接把MySQL头文件对应到/usr/local/include/下就好


比如你的MySQL安装文件位于/usr/local/mysql,那么就执行以下命令:

 代码如下 复制代码

# ln -s /usr/local/mysql/include/* /usr/local/include/

解决办法二

 代码如下 复制代码

yum install mysql-devel
[root@cms-test PDO_MYSQL-1.0.2]# make install

三、修改php.ini;

 代码如下 复制代码
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
extension = "pdo_mysql.so"
我们来介绍一下关于ThinkPHP访问不存在的模块跳到404页面 有需要的朋友可参考参考。

在ACTION中新建一个文件EmptyAction.class.php,文件中的代码如下:

 代码如下 复制代码

<?php
class EmptyAction extends Action{
    function _empty(){
        header("HTTP/1.0 404 Not Found");//使HTTP返回404状态码
        $this->display("Public:404");
    }
}
?>

在apache中设置

在你的网站配置中加入 ErrorDocument 404 /404.html 即可。


在iis中设置

IIS/ASP.net下设置404错误页面

打开apache httpd.conf配置文件或者新建.htaccess配置文件


首先,修改应用程序根目录的设置,打开 “web.config” 文件编辑,在其中加入如下内容:

 代码如下 复制代码

<configuration>
<system.web>
<customErrors mode=”On” defaultRedirect=”error.asp”>
<error statusCode=”404″ redirect=”notfound.asp” />
</customErrors>
</system.web>
</configuration>

注:上文例中“error.asp”为系统默认的404页面,“notfound.asp”为自定义的404页面,使用时请修改相应文件名。
然后,在自定义的404页面“notfound.asp”中加入:

 代码如下 复制代码

<%
Response.Status = “404 Not Found”
%>


php 404

 代码如下 复制代码

 if(如果没有任何结果)
    {
    //以前是仅仅显示“该帖子已经不存在”的提示,现在是:
    require(’/404.php’);
    @header(’HTTP/1.1 404 Not Found’);
    @header(’Status: 404 Not Found’);
    exit;
    }

一个不错的PHP mysql操作类 ,分享给大家学习使用。
 代码如下 复制代码

<?php
//数据库处理类
class db
{
    //SQL执行后的数据保存变量;
    var $db;
    //读取或设置当前数据的位置
    var $position=0;
    //执行SQL语句并把结果保存为db变量中;

    function sub_sql($str)
    {
        global $prefix;//全局函数,表前缀
        return str_replace("#@__",$prefix,$str);
    }
    function Sql($str)
    {
        $str=$this->sub_sql($str);
        $result = mysql_query($str);
        $i=0;
        while($row = mysql_fetch_array($result))
        {
            $str_array[$i]=$row;
            $i++;
        }
        if(empty($str_array))
        {
            $str_array=array();
        }
        $this->db=$str_array;
    }
    //读取一条数据并把数据往后移一位,如果数据为空则返回为null;
    function Get_One()
    {
        $re=empty($this->db[$this->position])?null:$this->db[$this->position];
        $this->position=$re?$this->position+1:$this->position;
        return $re;
    }
    //判断是否数据读取到结尾了
    function Judge()
    {
        $re=empty($this->db[$this->position])?true:false;
        return $re;
    }
    //取得db里面的个数
    function Get_Num()
    {
        return count($this->db);
    }
    //更新数据库里面的数据,$t为表名,$v格式为数组格式,上标为字段名,下标为数据;$w为条件上标为字段名下标为数据,$p为条件0为等号,1为大于,-1为小于;
    function Set_Updata($t,$v,$w,$p=0)
    {
        $this->Sql($t);
        $v_str="";
        $w_str="";
        $f="";
        foreach($v as $key=>$vaule)
        {
            if(!is_numeric($key))
            {
                if(empty($v_str))
                {
                    $v_str=htmlspecialchars($key)."='".htmlspecialchars($vaule)."'";
                }else
                {
                    $v_str=$v_str.",".htmlspecialchars($key)."='".htmlspecialchars($vaule)."'";
                }
            }
        }
        switch($p)
        {
            case 0:
                $f="=";
                break;
            case 1:
                $f=">";
                break;
            case -1:
                $f="<";
                break;
        }
        if(!empty($f))
        {
            foreach($w as $key=>$vaule)
            {
                if(!is_numeric($key))
                {
                    if(empty($v_str))
                    {
                        $w_str=htmlspecialchars($key).$f.htmlspecialchars($vaule)."'";
                    }else
                    {
                        $w_str=$w_str.",".htmlspecialchars($key).$f.htmlspecialchars($vaule)."'";
                    }
                }
            }
        }
        $sql="UPDATE ".$t." SET ".$v_str." where ".$w_str;
        return $result = mysql_query($sql);
    }
    //删除一数据$w为条件上标为字段名下标为数据,$p为条件0为等号,1为大于,-1为小于;
    function Set_Del($t,$w,$p=0)
    {
        $this->sub_sql($t);
        $w_str="";
        $f="";
        switch($p)
        {
            case 0:
                $f="=";
                break;
            case 1:
                $f=">";
                break;
            case -1:
                $f="<";
                break;
        }
        if(!empty($f))
        {
            foreach($w as $key=>$vaule)
            {
                if(!is_numeric($key))
                {
                    if(empty($v_str))
                    {
                        $w_str=htmlspecialchars($key).$f.htmlspecialchars($vaule)."'";
                    }else
                    {
                        $w_str=$w_str.",".htmlspecialchars($key).$f.htmlspecialchars($vaule)."'";
                    }
                }
            }
        }
        $str="DELETE FROM ".$t." WHERE ".$w_str;
        return $result = mysql_query($str);
    }
    function Add($t,$v)
    {
        $this->sub_sql($t);
        $k_str="";
        $v_str="";
        foreach($v as $key=>$vaule)
        {
            if(!is_numeric($key)){
                if(empty($k_str))
                {
                    $k_str=htmlspecialchars($key);
                    $v_str="'".htmlspecialchars($vaule)."'";
                }else
                {
                    $k_str=$k_str.",".htmlspecialchars($key);
                    $v_str=$v_str.","."'".htmlspecialchars($vaule)."'";
                }
            }
        }
        $str="INSERT INTO ".$t."(".$k_str.")"."value(".$v_str.")";
        return $result = mysql_query($str);
    }
}
?>

伪造IP来源对于php来说是很简单的一件事情,我们只要利用了php curl即可实现伪造IP来源哦,IP地址你可以随便写哦。

实例

 代码如下 复制代码

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://localhost/2.php");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));//IP
curl_setopt($ch, CURLOPT_REFERER, "http://www.111cn.net/ ");   //来路
curl_setopt($ch, CURLOPT_HEADER, 1);
$out = curl_exec($ch);
curl_close($ch);

2.php代码:

 代码如下 复制代码

function getClientIp() {
    if (!empty($_SERVER["HTTP_CLIENT_IP"]))
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if (!empty($_SERVER["REMOTE_ADDR"]))
        $ip = $_SERVER["REMOTE_ADDR"];
    else
        $ip = "err";
    return $ip;
}
echo "IP: " . getClientIp() . "";
echo "referer: " . $_SERVER["HTTP_REFERER"];

用1.php 请求 2.php,输出结果:

IP:8.8.8.8  referer:http://www.111cn.net

伪造成功,这是不是给采集的朋友提供了很好的换IP的方案!!当然防被刷的朋友也要注意了

PHP中的CURL函数库(Client URL Library Function)

curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息

curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

[!--infotagslink--]

相关文章

  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • PHP传值到不同页面的三种常见方式及php和html之间传值问题

    在项目开发中经常见到不同页面之间传值在web工作中,本篇文章给大家列出了三种常见的方式。接触PHP也有几个月了,本文总结一下这段日子中,在编程过程里常用的3种不同页面传值方法,希望可以给大家参考。有什么意见也希望大...2015-11-24
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • c#中分割字符串的几种方法

    单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • js控制页面控件隐藏显示的两种方法介绍

    javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visi...2013-10-13
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • jQuery实现切换页面过渡动画效果

    直接为大家介绍制作过程,希望大家可以喜欢。HTML结构该页面切换特效的HTML结构使用一个<main>元素来作为页面的包裹元素,div.cd-cover-layer用于制作页面切换时的遮罩层,div.cd-loading-bar是进行ajax加载时的loading进...2015-10-30
  • C#方法的总结详解

    本篇文章是对C#方法进行了详细的总结与介绍,需要的朋友参考下...2020-06-25
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04