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 相关文章推荐
我的论坛源代码(十)
Oct 09 PHP
在PHP中实现Javascript的escape()函数代码
Aug 08 PHP
drupal 代码实现URL重写
May 04 PHP
php获取用户IPv4或IPv6地址的代码
Nov 15 PHP
PHP中ob_start函数的使用说明
Nov 11 PHP
php 生成自动创建文件夹并上传文件的示例代码
Mar 07 PHP
PHP5中实现多态的两种方法实例分享
Apr 21 PHP
PHP中加密解密函数与DES加密解密实例
Oct 17 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
May 12 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程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
用PHP代码给图片加水印
2015/07/01 PHP
Symfony核心类概述
2016/03/17 PHP
offsetParent 算法分析
2010/04/05 Javascript
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
2015/12/03 Javascript
Javascript中的几种继承方式对比分析
2016/03/22 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
js实现简单页面全屏
2019/09/17 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
pandas取出重复数据的方法
2019/07/04 Python
wxPython实现画图板
2020/08/27 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
新郎父亲婚宴答谢词
2014/01/11 职场文书
房屋委托书范本
2014/04/04 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
幼儿园老师新年寄语2015
2014/12/08 职场文书
小学安全工作总结2015
2015/05/18 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android