基于PHP CURL获取邮箱地址的详解
前端之家收集整理的这篇文章主要介绍了
基于PHP CURL获取邮箱地址的详解,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
CURL可谓居家旅行必备之杀人良药,为何如此形容?就是因为他好用方便能实现页面抓取模拟登录采集等一系列功能。
记得第一次接触CURL的时候是要实现完成从邮箱用户列表的抓取。当时为了赶进度没有细细研究只是网上找了一些资料实现了功能。现在把当初的代码整理一下功能依旧能用
<div class="codetitle"><a style="CURSOR: pointer" data="46081" class="copybut" id="copybut46081" onclick="doCopy('code46081')"> 代码如下:
<div class="codebody" id="code46081">
<?
PHPerror_reporting ( 0 );
set_time_limit ( 0 );
header ( "Content-Type: text/html; charset=GB2312" );//邮箱
用户名密码
$user = 'username';
$pass = 'password';//创建一个
文件用于存放cookie信息
define ( "COOKIEJAR",tempnam ( ini_get ( "upload_tmp_dir" ),"cookie" ) );$url = '
http://reg.163.com/logins.jsp?type=1&url=http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight%3D1%26verifycookie%3D1%26language%3D-1%26style%3D-1';
$refer = '
http://mail.163.com';
$fields_post = array ('username' => $user,'password' => $pass,'verifycookie' => 1,'style' => - 1,'product' => 'mail163','selType' => - 1,'secure' => 'on' );
$fields_string = http_build_query ( $fields_post,'&' );
$headers_login = array ('User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0','Referer' => '
http://www.163.com' );//
登录$ch = curl_init ( $url );
curl_setopt ( $ch,CURLOPT_RETURNTRANSFER,true );
curl_setopt ( $ch,CURLOPT_HEADER,CURLOPT_CONNECTTIMEOUT,120 );
curl_setopt ( $ch,CURLOPT_POST,CURLOPT_REFERER,$refer );
curl_setopt ( $ch,CURLOPT_COOKIESESSION,CURLOPT_COOKIEJAR,COOKIEJAR );
curl_setopt ( $ch,CURLOPT_HTTPHEADER,$headers_login );
curl_setopt ( $ch,count ( $fields ) );
curl_setopt ( $ch,CURLOPT_POSTFIELDS,$fields_string );
$result = curl_exec ( $ch );
curl_close ( $ch );//
跳转$url = '
http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=-1&username=loki_wuxi';
$headers = array ('User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0' );$ch = curl_init ( $url );
curl_setopt ( $ch,$headers );
curl_setopt ( $ch,CURLOPT_COOKIEFILE,COOKIEJAR );
$result = curl_exec ( $ch );
curl_close ( $ch );//取得sid
preg_match ( '/sid=[^\"].
/',$result,$location );
$sid = substr ( $location [0],4,- 1 );//通讯录地址
$url = 'http://g4a30.mail.163.com/jy3/address/addrlist.jsp?sid=' . $sid . '&gid=all';
$headers = array ('User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0' );$ch = curl_init ( $url );
curl_setopt ( $ch,COOKIEJAR );
$result = curl_exec ( $ch );
curl_close ( $ch );
unlink ( COOKIEJAR );//开始抓取内容
preg_match_all ( '/<td class="Ibx_Td_addrName"><a[^>]>(.
?)<\/a><\/td><td class="Ibx_Td_addrEmail"><a[^>]>(.
?)<\/a><\/td>/i',$infos,PREG_SET_ORDER );
//1:姓名2:邮箱
print_r ( $infos );
?>
建立一个PHP文件复制以上代码保存后效果立竿见影,记得更改邮箱账户和密码,账户不需要@后缀。CURL初体验,如何,还不错吧。
后来在CSDN上又看到别人发帖问一个获取快递查询的问题,他想把一些大的快递公司查询业务做在一个页面中,的确是个很不错的实用小工具,但是因为快递查询有验证码,不由的又让我想起了CURL利器。后来帮帖主实现功能,思路很简单,先用CURL模拟抓取验证码,然后显示到用户提交页面中,同时保存验证码的COOKIE等用户查询一起提交就保证了COOKIE的同步。源代码如下:
-getEms.html
<div class="codetitle">
<a style="CURSOR: pointer" data="37795" class="copybut" id="copybut37795" onclick="doCopy('code37795')"> 代码如下: <div class="codebody" id="code37795">
<
Meta http-equiv="Content-Type" content="text/html; charset=gb2312">
EMS快递查询<?
PHPfclose(fopen('cookie.txt','w')); //
文件 cookie.txt 用于存放取得的cookie
$cookiejar = realpath('cookie.txt');
$fp = fopen("example_homepage.txt","w"); //
文件 example_homepage.txt 用于存放取得的
页面内容$ch = curl_init("
http://www.ems.com.cn/servlet/ImageCaptchaServlet");
curl_setopt($ch,CURLOPT_FILE,$fp);
curl_setopt($ch,1);
curl_setopt($ch,$cookiejar);
curl_setopt($ch,0);
curl_exec($ch);
curl_close($ch);
fclose($fp);//readfile($cookiejar); //查看取到的 cookie
//readfile("example_homepage.jpg"); //查看取到的
图片?>
<form action="getems.
PHP" method="post" name="form1">
快递号:
(13位 首尾2位都是字母)
<?
PHP echo "
";?>
<input type="submit" value="提交">
-getems.
PHP<div class="codetitle">
<a style="CURSOR: pointer" data="15768" class="copybut" id="copybut15768" onclick="doCopy('code15768')"> 代码如下: <div class="codebody" id="code15768">
<?
PHPif($_POST){
//使用先前验证码的cookie
文件$cookiejar = realpath('cookie.txt');
//
获取myEmsbarCode号 和验证码变量名
$ch = curl_init("
http://www.ems.com.cn");
curl_setopt($ch,true);
curl_setopt($ch,0);
curl_setopt($ch,$cookiejar);
$result = curl_exec($ch);
curl_close($ch);
preg_match("/<input type=\"hidden\" name=\"myEmsbarCode\" value=\"(.)\"\/>/isU",$myEmsbarCode);
preg_match("/<\/span><input name=\"(.*)\" type=\"text\"/isU",$codename);$parm = array($codename[1]=>$_POST['code'],
mailNum =>$_POST['mailNum'],
myEmsbarCode=>$myEmsbarCode[1],
reqCode=>'browseBASE'
);$ch = curl_init("
http://www.ems.com.cn/qcgzOutQueryAction.do");
curl_setopt($ch,"
http://www.ems.com.cn");
curl_setopt($ch,http_build_query($parm));
$_source = curl_exec($ch);
curl_close($ch);//搞定
var_dump($_source);
exit;
}
?>
对于CURL库的参数详解,网上有很多我直接收录了
函数列表CURL库一共有17个
函数:
curl_close:
关闭CURL会话
curl_copy_handle:复制一个CURL会话句柄,同时3复制其所有参数
curl_errno:返回最后一个
错误码
curl_error:返回一个字符串,用以描述当前会话的最后一个
错误curl_exec:执行当前会话
curl_getinfo:
获取特定信息
curl_init:初始化CURL会话
curl_multi_add_handle:在一个多连接会话中
添加一个句柄
curl_multi_close:
关闭一个多句柄CRUL会话
curl_multi_exec:执行一个多句柄CURL会话
curl_multi_getcontent:返回一个句柄执行后的
内容,如果设置了CURLOPT_RETURNTRANSFER
curl_multi_info_read:
获取当前所有连接的信息
curl_multi_init:初始化一个多句柄会话
curl_multi_remove_handle:从一个多句柄会话中
删除一个句柄
curl_multi_select:
获取所有绑定的
套接字
curl_setopt:设置CURL传输选项
curl_version:
获取CURL版本
常用设置选项布尔值选项
CURLOPT_AUTOREFERER:当返回的信息头含有转向信息时,
自动设置前向连接
CURLOPT_BINARYTRANSFER:TRUEtoreturntherawoutputwhenCURLOPT_RETURNTRANSFERisused.
CURLOPT_COOKIESESSION:标志为新的cookie会话,忽略之前设置的cookie会话
CURLOPT_CRLF:将Unix系统的换行符转换为Dos换行符
CURLOPT_DNS_USE_GLOBAL_CACHE:使用全局的DNS缓存
CURLOPT_FAILONERROR:忽略返回
错误CURLOPT_FILETIME:
获取请求文档的
修改日期,该日期可以用curl_getinfo()
获取。
CURLOPT_FOLLOWLOCATION:紧随服务器返回的所有
重定向信息
CURLOPT_FORBID_REUSE:当进程处理完毕后强制
关闭会话,不再缓存供重用
CURLOPT_FRESH_CONNECT:强制建立一个新的会话,而不是重用缓存的会话
CURLOPT_HEADER:在返回的
输出中包含响应头信息
CURLOPT_HTTPGET:设置HTTP请求方式为GET
CURLOPT_HTTPPROXYTUNNEL:经由一个HTTP代理建立连接
CURLOPT_NOBODY:返回的
输出中不包含文档信息.
CURLOPT_NOPROGRESS:
禁止进程级别传输,
PHP自动设为真
CURLOPT_NOSIGNAL:忽略所有发往
PHP的信息
CURLOPT_POST:设置POST方式提交数据,POST格式为application/x-www-form-urlencoded
CURLOPT_PUTTRUE:设置PUT方式
上传文件,同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE
CURLOPT_RETURNTRANSFER:返回字符串,而不是
调用curl_exec()后直接
输出CURLOPT_SSL_VERIFYPEER:SSL验证开启
CURLOPT_UNRESTRICTED_AUTH:一直
链接后面附加
用户名和密码,同时设置CURLOPT_FOLLOWLOCATION
CURLOPT_UPLOAD:准备
上传整数值选项
CURLOPT_BUFFERSIZE:缓存大小
CURLOPT_CONNECTTIMEOUT:连接时间设置,默认0为无限制
CURLOPT_DNS_CACHE_TIMEOUT:内存中保存DNS信息的时间,默认2分钟
CURLOPT_INFILESIZE:
上传至远程
站点的
文件尺寸
CURLOPT_LOW_SPEED_LIMIT:传输最低速度限制andabort.
CURLOPT_LOW_SPEED_TIME:传输时间限制
CURLOPT_MAXCONNECTS:最大持久连接数
CURLOPT_MAXREDIRS:最大转向数
CURLOPT_PORT:连接端口
CURLOPT_PROXYAUTH:*****验证方式
CURLOPT_PROXYPORT:*****端口
CURLOPT_PROXYTYPE:*****类型
CURLOPT_TIMEOUT:CURL
函数的最大执行时间字符串选项
CURLOPT_COOKIE:HTTP头中set-cookie中的cookie信息
CURLOPT_COOKIEFILE:包含cookie信息的
文件,cookie
文件的格式可以是Netscape格式,或者只是HTTP头的格式
CURLOPT_COOKIEJAR:连接结束后保存cookie信息的
文件CURLOPT_CUSTOMREQUEST:
自定义请求头,使用相对地址
CURLOPT_ENCODING:HTTP请求头中Accept-Encoding的值
CURLOPT_POSTFIELDS:POST格式提交的数据
内容CURLOPT_PROXY:代理通道
CURLOPT_PROXYUSERPWD:代理认证
用户名和密码
CURLOPT_RANGE:返回数据的范围,以字节记
CURLOPT_REFERER:前向
链接CURLOPT_URL:要连接的
URL地址,可以在curl_init()中设置
CURLOPT_USERAGENT:HTTP头中User-Agent的值
CURLOPT_USERPWD:连接种使用的验证信息数组选项
CURLOPT_HTTP200ALIASES:200响应码数组,数组中的响应吗被认为是正确的响应
CURLOPT_HTTPHEADER:
自定义请求头信息只能是流句柄的选项:
CURLOPT_FILE:传输要写入的晚间句柄,默认是标准
输出CURLOPT_INFILE:传输要读取的
文件句柄
CURLOPT_STDERR:作为标准
错误输出的一个替换选项
CURLOPT_WRITEHEADER:传输头信息要写入的
文件回调
函数选项
CURLOPT_HEADERFUNCTION:拥有两个参数的回调
函数,第一个是参数是会话句柄,第二是HTTP响应头信息的字符串。使用此回调
函数,将自行处理响应头信息。响应头信息按行返回。设置返回值为字符串长度。
CURLOPT_READFUNCTION:拥有两个参数的回调
函数,第一个是参数是会话句柄,第二是HTTP响应头信息的字符串。使用此
函数,将自行处理返回的数据。返回值为数据尺寸。
CURLOPT_WRITEFUNCTION:拥有两个参数的回调
函数,第一个是参数是会话句柄,第二是HTTP响应头信息的字符串。使用此回调
函数,将自行处理响应头信息。响应头信息是整个字符串。设置返回值为字符串长度。
其他一些CURL的例子 (摘自网络)
<div class="codetitle">
<a style="CURSOR: pointer" data="55289" class="copybut" id="copybut55289" onclick="doCopy('code55289')"> 代码如下: <div class="codebody" id="code55289">