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读取PDF内容配合Xpdf的使用
Nov 24 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
Jan 05 PHP
9个比较实用的php代码片段
Mar 15 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
Mar 22 PHP
PHP getallheaders无法获取自定义头(headers)的问题
Mar 23 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 PHP
详解thinkphp的Auth类认证
May 28 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中jsonp的跨域实例
2013/06/21 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
2015/10/10 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
详解PHP swoole process的使用方法
2017/08/26 PHP
PHP 多任务秒级定时器的实现方法
2018/05/13 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
jquery dialog键盘事件代码
2010/08/01 Javascript
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
防止jQuery ajax Load使用缓存的方法小结
2014/02/22 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
Python实现list反转实例汇总
2014/11/11 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
对python多线程与global变量详解
2018/11/09 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
生物科学专业自荐书
2014/06/20 职场文书
放假通知格式
2015/04/14 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python
mysql分表之后如何平滑上线详解
2021/11/01 MySQL
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android