PHP中使用CURL模拟登录并获取数据实例


Posted in PHP onJuly 01, 2014

cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信息。本文以模拟登录开源中国(oschina)为例,和大家分享cURL的使用。
PHP的curl()在抓取网页的效率方面是比较高的,而且支持多线程,而file_get_contents()效率就要稍低些,当然,使用curl时需要开启下curl扩展。

代码实战

先来看登录部分的代码:

//模拟登录 

function login_post($url, $cookie, $post) { 

    $curl = curl_init();//初始化curl模块 

    curl_setopt($curl, CURLOPT_URL, $url);//登录提交的地址 

    curl_setopt($curl, CURLOPT_HEADER, 0);//是否显示头信息 

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);//是否自动显示返回的信息 

    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); //设置Cookie信息保存在指定的文件中 

    curl_setopt($curl, CURLOPT_POST, 1);//post方式提交 

    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));//要提交的信息 

    curl_exec($curl);//执行cURL 

    curl_close($curl);//关闭cURL资源,并且释放系统资源 

}

函数login_post()首先初始化curl_init(),然后使用curl_setopt()设置相关选项信息,包括要提交的url地址,保存的cookie文件,post的数据(用户名和密码等信息),是否返回信息等等,然后curl_exec执行curl,最后curl_close()释放资源。注意PHP自带的http_build_query()可以将数组转换成相连接的字符串。
接下来如果登录成功后,我们要获取登录成功后的页面信息。

//登录成功后获取数据 

function get_content($url, $cookie) { 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, $url); 

    curl_setopt($ch, CURLOPT_HEADER, 0); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //读取cookie 

    $rs = curl_exec($ch); //执行cURL抓取页面内容 

    curl_close($ch); 

    return $rs; 

}

函数get_content()中也是先初始化curl,然后设置相关选项,执行curl,释放资源。其中我们设置CURLOPT_RETURNTRANSFER为1即自动返回信息,而CURLOPT_COOKIEFILE可以读取到登录时保存的cookie信息,最后将页面内容返回。

我们的最终目的是要获取到模拟登录后的信息,也就是只有正常登录成功后才能获取的有用信息。接下来我们以登录开源中国的移动版为例,看看如何抓取到登录成功后的信息。

//设置post的数据 

$post = array ( 

    'email' => 'oschina账户', 

    'pwd' => 'oschina密码', 

    'goto_page' => '/my', 

    'error_page' => '/login', 

    'save_login' => '1', 

    'submit' => '现在登录' 

); 

 

//登录地址 

$url = "http://m.3water.com/action/user/login"; 

//设置cookie保存路径 

$cookie = dirname(__FILE__) . '/cookie_3water.txt'; 

//登录后要获取信息的地址 

$url2 = "http://m.3water.com/my"; 

//模拟登录 

login_post($url, $cookie, $post); 

//获取登录页的信息 

$content = get_content($url2, $cookie); 

//删除cookie文件 

@ unlink($cookie); 

//匹配页面信息 

$preg = "/<td class='portrait'>(.*)<\/td>/i"; 

preg_match_all($preg, $content, $arr); 

$str = $arr[1][0]; 

//输出内容 

echo $str;

运行上述代码后,我们会看到最终获取到登录用户的头像图片。

PHP中使用CURL模拟登录并获取数据实例

使用总结:
1、初始化curl;
2、使用curl_setopt设置目标url,和其他选项;
3、curl_exec,执行curl;
4、执行后,关闭curl;
5、输出数据。

PHP 相关文章推荐
用Flash图形化数据(一)
Oct 09 PHP
一个用于网络的工具函数库
Oct 09 PHP
php环境下利用session防止页面重复刷新的具体实现
Jan 09 PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 PHP
PHP处理Oracle的CLOB实例
Nov 03 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP借助phpmailer发送邮件
May 11 PHP
php  单例模式详细介绍及实现源码
Nov 05 PHP
Yii框架实现多数据库配置和操作的方法
May 25 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
因str_replace导致的注入问题总结
Aug 08 PHP
2个比较经典的PHP加密解密函数分享
Jul 01 #PHP
PHP实现生成唯一编号(36进制的不重复编号)
Jul 01 #PHP
ThinkPHP使用smarty模板引擎的方法
Jul 01 #PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 #PHP
ThinkPHP模板IF标签用法详解
Jul 01 #PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
Jul 01 #PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
Jul 01 #PHP
You might like
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
MySQL连接数超过限制的解决方法
2011/07/17 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
IE6弹出“已终止操作”的解决办法
2010/11/27 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
JS实现随机点名器
2020/04/12 Javascript
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
python http接口自动化脚本详解
2018/01/02 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
华润集团网上药店:健一网
2016/09/19 全球购物
台湾生鲜宅配:大口市集
2017/10/14 全球购物
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
物业管理求职自荐信
2013/09/25 职场文书
酒店公关部经理岗位职责
2013/11/24 职场文书
电话营销开场白
2015/05/29 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书