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 相关文章推荐
优化NFR之一 --MSSQL Hello Buffer Overflow
Oct 09 PHP
有关PHP中MVC的开发经验分享
May 17 PHP
php文本转图片自动换行的方法
Mar 13 PHP
PHP实现AES256加密算法实例
Sep 22 PHP
php简单实现快速排序的方法
Apr 04 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
May 16 PHP
ThinkPHP实现更新数据实例详解(demo)
Jun 29 PHP
PHP二维数组去重实例分析
Nov 18 PHP
Laravel中的chunk组块结果集处理与注意问题
Aug 15 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
Oct 16 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
May 27 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工厂模式的好处
2013/06/18 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
vue2.0使用swiper组件实现轮播的示例代码
2018/03/03 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
Vue.extend 登录注册模态框的实现
2020/12/29 Vue.js
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
Python读写unicode文件的方法
2015/07/10 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
利用Opencv中Houghline方法实现直线检测
2018/02/11 Python
详解python实现线程安全的单例模式
2018/03/05 Python
python 2.7.14安装图文教程
2018/04/08 Python
python matlibplot绘制3D图形
2018/07/02 Python
Python shelve模块实现解析
2019/08/28 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
雅诗兰黛澳大利亚官网:Estée Lauder澳大利亚
2019/05/31 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
护士求职信范文
2014/05/24 职场文书
代理人委托书
2014/08/01 职场文书
工程索赔意向书
2014/08/30 职场文书
廉政文化进校园广播稿
2014/10/20 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
Python读写yaml文件
2022/03/20 Python