PHP CURL 模拟提交(支持代理)

<?php
define ( 'IS_PROXY', true ); //是否启用代理
/* cookie文件 */
$cookie_file = dirname ( __FILE__ ) . "/cookie_" . md5 ( basename ( __FILE__ ) ) . ".txt"; // 设置Cookie文件保存路径及文件名
/*模拟浏览器*/
$user_agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
function vlogin($url, $data) { // 模拟登录获取Cookie函数
    $curl = curl_init (); // 启动一个CURL会话
    if (IS_PROXY) {
        //以下代码设置代理服务器
        //代理服务器地址
        curl_setopt ( $curl, CURLOPT_PROXY, $GLOBALS ['proxy'] );
    }
    curl_setopt ( $curl, CURLOPT_URL, $url ); // 要访问的地址
    curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, 0 ); // 对认证证书来源的检查
    curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, 1 ); // 从证书中检查SSL加密算法是否存在
    curl_setopt ( $curl, CURLOPT_USERAGENT, $GLOBALS ['user_agent'] ); // 模拟用户使用的浏览器
    @curl_setopt ( $curl, CURLOPT_FOLLOWLOCATION, 1 ); // 使用自动跳转
    curl_setopt ( $curl, CURLOPT_AUTOREFERER, 1 ); // 自动设置Referer
    curl_setopt ( $curl, CURLOPT_POST, 1 ); // 发送一个常规的Post请求
    curl_setopt ( $curl, CURLOPT_POSTFIELDS, $data ); // Post提交的数据包
    curl_setopt ( $curl, CURLOPT_COOKIEJAR, $GLOBALS ['cookie_file'] ); // 存放Cookie信息的文件名称
    curl_setopt ( $curl, CURLOPT_COOKIEFILE, $GLOBALS ['cookie_file'] ); // 读取上面所储存的Cookie信息
    curl_setopt ( $curl, CURLOPT_TIMEOUT, 30 ); // 设置超时限制防止死循环
    curl_setopt ( $curl, CURLOPT_HEADER, 0 ); // 显示返回的Header区域内容
    curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); // 获取的信息以文件流的形式返回
    $tmpInfo = curl_exec ( $curl ); // 执行操作
    if (curl_errno ( $curl )) {
        echo 'Errno' . curl_error ( $curl );
    }
    curl_close ( $curl ); // 关闭CURL会话
    return $tmpInfo; // 返回数据
}
function vget($url) { // 模拟获取内容函数
    $curl = curl_init (); // 启动一个CURL会话
    if (IS_PROXY) {
        //以下代码设置代理服务器
        //代理服务器地址
        curl_setopt ( $curl, CURLOPT_PROXY, $GLOBALS ['proxy'] );
    }
    curl_setopt ( $curl, CURLOPT_URL, $url ); // 要访问的地址
    curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, 0 ); // 对认证证书来源的检查
    curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, 1 ); // 从证书中检查SSL加密算法是否存在
    curl_setopt ( $curl, CURLOPT_USERAGENT, $GLOBALS ['user_agent'] ); // 模拟用户使用的浏览器
    @curl_setopt ( $curl, CURLOPT_FOLLOWLOCATION, 1 ); // 使用自动跳转
    curl_setopt ( $curl, CURLOPT_AUTOREFERER, 1 ); // 自动设置Referer
    curl_setopt ( $curl, CURLOPT_HTTPGET, 1 ); // 发送一个常规的Post请求
    curl_setopt ( $curl, CURLOPT_COOKIEFILE, $GLOBALS ['cookie_file'] ); // 读取上面所储存的Cookie信息
    curl_setopt ( $curl, CURLOPT_TIMEOUT, 120 ); // 设置超时限制防止死循环
    curl_setopt ( $curl, CURLOPT_HEADER, 0 ); // 显示返回的Header区域内容
    curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); // 获取的信息以文件流的形式返回
    $tmpInfo = curl_exec ( $curl ); // 执行操作
    if (curl_errno ( $curl )) {
        echo 'Errno' . curl_error ( $curl );
    }
    curl_close ( $curl ); // 关闭CURL会话
    return $tmpInfo; // 返回数据
}
function vpost($url, $data) { // 模拟提交数据函数
    $curl = curl_init (); // 启动一个CURL会话
    if (IS_PROXY) {
        //以下代码设置代理服务器
        //代理服务器地址
        curl_setopt ( $curl, CURLOPT_PROXY, $GLOBALS ['proxy'] );
    }
    curl_setopt ( $curl, CURLOPT_URL, $url ); // 要访问的地址
    curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, 0 ); // 对认证证书来源的检查
    curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, 1 ); // 从证书中检查SSL加密算法是否存在
    curl_setopt ( $curl, CURLOPT_USERAGENT, $GLOBALS ['user_agent'] ); // 模拟用户使用的浏览器
    @curl_setopt ( $curl, CURLOPT_FOLLOWLOCATION, 1 ); // 使用自动跳转
    curl_setopt ( $curl, CURLOPT_AUTOREFERER, 1 ); // 自动设置Referer
    curl_setopt ( $curl, CURLOPT_POST, 1 ); // 发送一个常规的Post请求
    curl_setopt ( $curl, CURLOPT_POSTFIELDS, $data ); // Post提交的数据包
    curl_setopt ( $curl, CURLOPT_COOKIEFILE, $GLOBALS ['cookie_file'] ); // 读取上面所储存的Cookie信息
    curl_setopt ( $curl, CURLOPT_TIMEOUT, 120 ); // 设置超时限制防止死循环
    curl_setopt ( $curl, CURLOPT_HEADER, 0 ); // 显示返回的Header区域内容
    curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); // 获取的信息以文件流的形式返回
    $tmpInfo = curl_exec ( $curl ); // 执行操作
    if (curl_errno ( $curl )) {
        echo 'Errno' . curl_error ( $curl );
    }
    curl_close ( $curl ); // 关键CURL会话
    return $tmpInfo; // 返回数据
}
function delcookie($cookie_file) { // 删除Cookie函数
    unlink ( $cookie_file ); // 执行删除
}
?>

php利用curl判断页面是否为404找不到

<?php

/**
 
 * @author lanren <service@kuitao8.com>
 * @link http://www.kuitao8.com/
 * @copyright 2010-2014 懒人程序
 * @since 1.0
 */
header("Content-type:text/html;charset=utf-8");
function GetCurl($url){
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY,true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true);
    curl_setopt($ch, CURLOPT_AUTOREFERER,true);
    curl_setopt($ch, CURLOPT_TIMEOUT,30);
    $rtn = curl_exec($ch);
    curl_exec($ch);
    return $rtn;
}
$resp = GetCurl("http://www.kuitao8.com/2789.shtml");
if(strpos($resp,'404 Not Found')==true) {
    exit('这个页面是404');
}


http://www.kuitao8.com/20150115/3477.shtml

PHP防抓取数据 ip 被禁止 curl 解决方法 伪造搜索引擎来采集

1.使用Snoopy或curl传搜索引擎爬虫的USERAGENT值。

查看搜索引擎爬虫的USERAGENT值:http://www.cnblogs.com/grimm/p/5068092.html (http://www.geekso.com/spdier-useragent/  )

2.使用Snoopy或curl传referer值。

如:$snoopy->referer = ‘http://www.google.com’;

$header[] = “Referer: http://www.google.com/”;

3.使用Snoopy或curl代理。

如:$snoopy->proxy_host  = “59.108.44.41”;          $

snoopy->proxy_port  = “3128”;

4.使用Snoopy或curl防造IP。

如:$snoopy->rawheaders[‘X_FORWARDED_FOR’] = ‘127.0.0.1’;

$snoopy->rawheaders[‘CLIENT-IP’] = ‘127.0.0.1’;

5.用php写一个重起路由器的程序,这样就会获得新的ip地址。

6.如果发现重起路由器还是显示被封,有可能对方封了你路由器的mac地址,现在路由器都有修改MAC的功能,可以写程序或手动修改路由器的MAC地址。

例如:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0 ); // 过滤HTTP头
curl_setopt($ch, CURLOPT_TIMEOUT, 40);
curl_setopt($ch, CURLOPT_USERAGENT, ‘Baiduspider+(+http://www.baidu.com/search/spider.htm)’);

$ip = ‘220.181.7.121’;
curl_setopt($ch, CURLOPT_HTTPHEADER, array(‘X-FORWARDED-FOR:’ . $ip, ‘CLIENT-IP:’ . $ip));
curl_setopt($ch, CURLOPT_REFERER, “http://www.baidu.com/search/spider.html”);

curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
echo $responseText = curl_exec($ch);
curl_close($ch)

http://www.cnblogs.com/grimm/p/5068082.html

php使用curl来获取远程图片


/*
*@通过curl方式获取指定的图片到本地
*@ 完整的图片地址
*@ 要存储的文件名
*/
function getImg($url = "", $filename = "")
{

 //去除URL连接上面可能的引号
  //$url = preg_replace( '/(?:^['"]+|['"/]+$)/', '', $url );
  $hander = curl_init();
  $fp =<span class="Apple-converted-space"> </span><a href="http://www.php100.com/tags.php/fopen/" target="_blank">fopen</a>($filename,'wb');
  <a href="http://www.php100.com/tags.php/curl_setopt/" target="_blank">curl_setopt</a>($hander,CURLOPT_URL,$url);
  curl_setopt($hander,CURLOPT_FILE,$fp);
  curl_setopt($hander,CURLOPT_HEADER,0);
  curl_setopt($hander,CURLOPT_FOLLOWLOCATION,1);
  //curl_setopt($hander,CURLOPT_RETURNTRANSFER,false);//以数据流的方式返回数据,当为false是直接显示出来
  curl_setopt($hander,CURLOPT_TIMEOUT,60);
  curl_exec($hander);
  curl_close($hander);
  fclose($fp);
  Return true;
}

调用时,直接getImg("/logo.jpg","upload/image.jpg")

&nbsp;

&nbsp;

 


<?php

$url = "图片绝对地址/thumbnail.jpg";

$filename = 'curl.jpg';

getImg($url, $filename);
/*
  *@通过curl方式获取制定的图片到本地
  *@ 完整的图片地址
  *@ 要存储的文件名
 */
function getImg($url = "", $filename = "") {
    if(is_dir(basename($filename))) {
        echo "The Dir was not exits";
        return false;
    }
    //去除URL连接上面可能的引号
    $url = preg_replace( '/(?:^['"]+|['"/]+$)/', '', $url );

    $hander = curl_init();
    $fp = fopen($filename,'wb');

    curl_setopt($hander,CURLOPT_URL,$url);
    curl_setopt($hander,CURLOPT_FILE,$fp);
    curl_setopt($hander,CURLOPT_HEADER,0);
    curl_setopt($hander,CURLOPT_FOLLOWLOCATION,1);
    //curl_setopt($hander,CURLOPT_RETURNTRANSFER,false);//以数据流的方式返回数据,当为false是直接显示出来
    curl_setopt($hander,CURLOPT_TIMEOUT,60);

    /*$options = array(
        CURLOPT_URL=> '/thum-f3ccdd27d2000e3f9255a7e3e2c4880020110622095243.jpg',
        CURLOPT_FILE => $fp,
        CURLOPT_HEADER => 0,
        CURLOPT_FOLLOWLOCATION => 1,
        CURLOPT_TIMEOUT => 60
    );
    curl_setopt_array($hander, $options);
    */

    curl_exec($hander);
    curl_close($hander);
    fclose($fp);
    return  true;
}

?>

php curl报错:Couldn’t resolve host “XXXXXX” 解决方法

PHP脚本里使用curl系列的函数GET某资源地址, 结果报错:Couldn’t resolve host “ip.taobao.com”

PHP代码:

  1. public function actionDemo()
  2. {
  3. $url = “http://ip.taobao.com”;
  4. $rs = Helper_Tool::curlGet($url);
  5. var_dump($rs);
  6. }

问题原因:

1.  问题最终出在 ipv6 上

2.  附:博主自身已经校验确保主机的DNS 以及 hosts均无问题

3.  附:另外使用如下代码使用DNS缓存或者禁用ipv6也无济于事:

curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false );

curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 2 );

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

解决方法:

系统层面禁用 ipv6 模块即可

禁用ipv6:

  1. #vi /etc/modprobe.d/dist.conf
  2. 添加下面两行内容
  3. alias netpf10 off
  4. alias ipv6 off
  5. 保存退出,并且重新启动系统
  6.  
  7. 验证ipv6模块是否加载
  8. #lsmod|grep ipv6
  9.  
  10. 开机不启动
  11. #chkconfig ip6tables off

http://www.blogdaren.com/post-2306.html

curl获取去接口数据报错 解决办法 curl: (6) Couldn’t resolve host ‘www.goonls.com’

上周, 部分站点出现Couldn’t resolve host…..问题,  导致公司所有走api的程序都无法正常使用(系统redhat 6.3的都出现问题, redhat 5一切OK). 最后解决方法找到了,但是具体原因目前还未知.

从这个报错,可以很明显的发现是域名解析不了。于是做如下排查。

1. 故障排除

1. 1 测试域名是否能解析到

简单的使用ping来测试,发现DNS解析是OK。

1.2 测试curl是否有故障

因为php程序调用的是curl,所以我们测试一下curl是否能够正常解析dns

竟然真的不行,这种奇葩问题首次遇到.

2. 解决问题

尝试解决方法:

修改dns

重新测试curl,问题得到解决。

3. ttlsa群友提供解决方法

于此同时,群里的一个福建群友在也反应这个问题,看来应该是电信DNS有调整的缘故,但是具体的原因还是不得而知。告知其修改dns,问题也得到解决。

今天ttlsa群里的”福州 – 要上天“(藏得很深很低调的大牛)询问此问题是否解决,并提供另外的解决方法。

3.1 执行curl指定ipv4

3.2 关闭ipv6

请参考CentOS6 / RHCE6 禁用IPv6协议模块:http://www.ttlsa.com/html/3640.html

如果是php程序,那么请在使用curl的时候指定ipv4的参数:CURL_IPRESOLVE_V4

感谢群友提供的解决方案. 如果你也遇到如上问题,不烦尝试下上面的解决方案.

 4. curl无法解析原因

本文发出之后, 咱们ttlsa群主”north-boy”也找到原因所在,并且在“CentOS6 / RHCE6 禁用IPv6协议模块

转自 http://www.ttlsa.com/linux/curl-6-couldnt-resolve-host/

php通过curl 检测网站能否打开


function openstatus($url)
{
//$url = 'http://sywater.gov.cn';
$curl = curl_init();
$timeout = 10;
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
$contents = curl_exec($curl);
if(false == $contents) {
return '错误信息:'.curl_error($curl);
} else {
return '正常打开';
}
}

php 正则配备网页a标签 内容及网址


function curl_get_contents($url)
{
$curl = curl_init();

// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL,$url);

// 设置header
curl_setopt($curl, CURLOPT_HEADER, 0);

// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT,10);
// 运行cURL,请求网页
$data = curl_exec($curl);
if($data === false){
echo curl_error($curl);

exit;
}
$info = curl_getinfo($curl);
//print_r($info);
// 关闭URL请求
curl_close($curl);

// 显示获得的数据
//print_r($data);
return $data;

}

/*获取页面的URL地址*/
function geturl($url)
{
$http=substr($url,0,12);
// $strSource = file_get_contents($url);
$strSource = curl_get_contents($url);

preg_match_all('/<a.*?(?: |\\t|\\r|\\n)?href=[\'"]?(.+?)[\'"]?(?:(?: |\\t|\\r|\\n)+.*?)?>(.+?)<\/a.*?>/sim', $strSource, $strResult, PREG_PATTERN_ORDER);
$urllist = array();
for($i = 0; $i < count($strResult[1]); $i++)
{

// printf("%d href=(%s) title=(%s) \n", $i, $strResult[1][$i], $strResult[2][$i]);
//printf("<a href=%s> %s </a>", $strResult[1][$i], $strResult[2][$i]);

$url=$strResult[1][$i];
if(substr($url,0,12)==$http)
{
//判断是否重复
if(!in_array($strResult[1][$i], $urllist))
{
$urllist[]=$strResult[1][$i];
}

}

}
return $urllist;
}

curl_get_contents curl获取网页内容 php


function curl_get_contents($url)
{
$curl = curl_init();

// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL,$url);

// 设置header
curl_setopt($curl, CURLOPT_HEADER, 0);

// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT,10);
// 运行cURL,请求网页
$data = curl_exec($curl);
if($data === false){
echo curl_error($curl);

exit;
}
$info = curl_getinfo($curl);
//print_r($info);
// 关闭URL请求
curl_close($curl);

// 显示获得的数据
//print_r($data);
return $data;

}

php curl 获取网页内容 并输出


<?php
$curl = curl_init();

// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com');

// 设置header
curl_setopt($curl, CURLOPT_HEADER, 0);

// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

// 运行cURL,请求网页
$data = curl_exec($curl);
if($data === false){
echo curl_error($curl);

exit;
}
$info = curl_getinfo($curl);
//print_r($info);
// 关闭URL请求
curl_close($curl);

// 显示获得的数据
//print_r($data);
echo $data;
?>