php使用curl代理实现抓取数据的方法


Posted in PHP onFebruary 03, 2017

本文实例讲述了php使用curl代理实现抓取数据的方法。分享给大家供大家参考,具体如下:

<?php
define ( 'IS_PROXY', true ); //是否启用代理
function async_get_url($url_array, $wait_usec = 0)
{
  if (!is_array($url_array))
    return false;
  $wait_usec = intval($wait_usec);
  $data  = array();
  $handle = array();
  $running = 0;
  $mh = curl_multi_init(); // 开启多线程
  $i = 0;
  foreach($url_array as $url) {
    $ch = curl_init();
    if (IS_PROXY) {
    //以下代码设置代理服务器
    //代理服务器地址http://www.cnproxy.com/proxy1.html !!Hong Kong, China的速度比较好
    curl_setopt ($ch, CURLOPT_PROXY,'110.4.12.170:80' );
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置超时时间
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
    curl_setopt($ch, CURLOPT_MAXREDIRS, 7); //HTTp定向级别
    curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里
    $handle[$i++] = $ch;
  }
  /* 执行 */
  do {
    $mrc = curl_multi_exec($mh, $running);
    if ($wait_usec > 0) /* 每个 connect 要间隔多久 */
      usleep($wait_usec); // 250000 = 0.25 sec
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  while ($running && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
      do {
        $mrc = curl_multi_exec($mh, $running);
      } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
  }
  /* 读取资料 */
  foreach($handle as $i => $ch) {
    $content = curl_multi_getcontent($ch);
    $data[$i] = (curl_errno($ch) == 0) ? $content : false;
  }
  /* 移除 handle*/
  foreach($handle as $ch) {
    curl_multi_remove_handle($mh, $ch);
  }
  curl_multi_close($mh);
  return $data;
}
$urls = array('http://map.baidu.com');
$re = async_get_url($urls);
echo $re[0];
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
利用PHP实现与ASP Banner组件相似的类
Oct 09 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 PHP
php输出xml必须header的解决方法
Oct 17 PHP
PHP中require和include路径问题详解
Dec 25 PHP
PHP获取数组长度或某个值出现次数的方法
Feb 11 PHP
php对文件进行hash运算的方法
Apr 03 PHP
PHP使用pear自带的mail类库发邮件的方法
Jul 08 PHP
php递归实现无限分类的方法
Jul 28 PHP
PDO::inTransaction讲解
Jan 28 PHP
PHP观察者模式定义与用法实例分析
Mar 22 PHP
php基于协程实现异步的方法分析
Jul 17 PHP
laravel框架模型、视图与控制器简单操作示例
Oct 10 PHP
php实现xml转换数组的方法示例
Feb 03 #PHP
php删除txt文件指定行及按行读取txt文档数据的方法
Jan 30 #PHP
php指定长度分割字符串str_split函数用法示例
Jan 30 #PHP
php使用自定义函数实现汉字分割替换功能示例
Jan 30 #PHP
PHPExcel在linux环境下导出报500错误的解决方法
Jan 26 #PHP
超强多功能php绿色集成环境详解
Jan 25 #PHP
php 中奖概率算法实现代码
Jan 25 #PHP
You might like
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
js AspxButton的客户端操作
2009/06/26 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
浅析js封装和作用域
2013/07/09 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
flash遮住div问题的正确解决方法
2014/02/27 Javascript
简介AngularJS中使用factory和service的方法
2015/06/17 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
Python版微信红包分配算法
2015/05/04 Python
在Django的模型中执行原始SQL查询的方法
2015/07/21 Python
numpy中索引和切片详解
2017/12/15 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
Python帮你识破双11的套路
2019/11/11 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
经济信息管理专业大学生求职信
2013/09/27 职场文书
驾驶员岗位职责
2014/01/29 职场文书
高二学生评语大全
2014/04/25 职场文书
工作表扬信
2015/01/17 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
实习介绍信范文
2015/05/05 职场文书
检讨书格式
2015/05/07 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书