基于PHP CURL获取邮箱地址的详解

CURL可谓居家旅行必备之杀人良药,为何如此形容?就是因为他好用方便能实现页面抓取模拟登录采集等一系列功能。
记得第一次接触CURL的时候是要实现完成从邮箱用户列表的抓取。当时为了赶进度没有细细研究只是网上找了一些资料实现了功能。现在把当初的代码整理一下功能依旧能用

PHP中的CURL函数库(Client URL Library Function)

复制代码 代码如下:

curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all
the sockets associated with the cURL extension, which can then be
“selected”
curl_setopt_array —
以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息

<?php
  error_reporting ( 0 );
  set_time_limit ( 0 );
  header ( “Content-Type: text/html; charset=GB2312” );

curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

  //邮箱用户名密码
  $user = ‘username’;
  $pass = ‘password’;

  1. php
    curl
    的默认调用方法,get方式访问url

  //创建一个文件用于存放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();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //设置http头
curl_setopt($ch, CURLOPT_ENCODING, “gzip” );
//设置为客户端支持gzip压缩
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30 ); //设置连接等待时间
curl_setopt($ch, CURLOPT_URL, $url );
curl_exec( $ch );
if ($error = curl_error($ch) ) {
//出错处理
return -1;
}
fclose($fp);

  //登录
  $ch = curl_init ( $url );
  curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
  curl_setopt ( $ch, CURLOPT_HEADER, true );
  curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 120 );
  curl_setopt ( $ch, CURLOPT_POST, true );
  curl_setopt ( $ch, CURLOPT_REFERER, $refer );
  curl_setopt ( $ch, CURLOPT_COOKIESESSION, true );
  curl_setopt ( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );
  curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers_login );
  curl_setopt ( $ch, CURLOPT_POST, count ( $fields ) );
  curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields_string );
  $result = curl_exec ( $ch );
  curl_close ( $ch );

$curl_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//获取http返回值
if( $curl_code == 200 ) {
//正常访问url
}
//异常
….

  //跳转
  $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’ );

  1. 设置http header支持curl访问lighttpd服务器
    Java代码

  $ch = curl_init ( $url );
  curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
  curl_setopt ( $ch, CURLOPT_HEADER, true );
  curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 120 );
 curl_setopt ( $ch, CURLOPT_POST, true );
  curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
  curl_setopt ( $ch, CURLOPT_COOKIEFILE, COOKIEJAR );
  curl_setopt ( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );
  $result = curl_exec ( $ch );
  curl_close ( $ch );

 代码如下

 //取得sid
  preg_match ( ‘/sid=[^\”].*/’, $result, $location );
  $sid = substr ( $location [0], 4, – 1 );

$header[]= ‘Expect:’;

  //通讯录地址
  $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’ );

$header[]= ‘Expect:’;

  $ch = curl_init ( $url );
  curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
  curl_setopt ( $ch, CURLOPT_HEADER, true );
  curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 120 );
  curl_setopt ( $ch, CURLOPT_POST, true );
  curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
  curl_setopt ( $ch, CURLOPT_COOKIEFILE, COOKIEJAR );
  curl_setopt ( $ch, CURLOPT_COOKIEJAR, COOKIEJAR );
  $result = curl_exec ( $ch );
  curl_close ( $ch );
  unlink ( COOKIEJAR );

  1. 设置curl,只获取http header,不获取body:
    Java代码

  //开始抓取内容
  preg_match_all ( ‘/<td
class=”Ibx_Td_addrName”><a[^>]*>(.*?)<\/a><\/td><td
class=”Ibx_Td_addrEmail”><a[^>]*>(.*?)<\/a><\/td>/i’,
$result, $infos, PREG_SET_ORDER );
  //1:姓名2:邮箱
  print_r ( $infos );
  ?>

 代码如下

建立一个PHP文件复制以上代码保存后效果立竿见影,记得更改邮箱账户和密码,账户不需要@后缀。CURL初体验,如何,还不错吧。
后来在CSDN上又看到别人发帖问一个获取快递查询的问题,他想把一些大的快递公司查询业务做在一个页面中,的确是个很不错的实用小工具,但是因为快递查询有验证码,不由的又让我想起了CURL利器。后来帮帖主实现功能,思路很简单,先用CURL模拟抓取验证码,然后显示到用户提交页面中,同时保存验证码的COOKIE等用户查询一起提交就保证了COOKIE的同步。

curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);

源代码如下:
-getEms.html

curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);

复制代码 代码如下:

或者只获取body:
Java代码

<html>
  <head>
  <meta http-equiv=”Content-Type” content=”text/html;
charset=gb2312″>
  <title>EMS快递查询</title>
  </head>
  <body>
  <?php
  fclose(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, CURLOPT_COOKIESESSION, 1);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
 curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
  curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_exec($ch);
  curl_close($ch);
  fclose($fp);

 代码如下

  //readfile($cookiejar); //查看取到的 cookie
  //readfile(“example_homepage.jpg”); //查看取到的图片
  ?>
  <form action=”getems.php” method=”post” name=”form1″>
  快递号:<input name=”mailNum” type=”text” value=”EA739701017CS”
/>(13位 首尾2位都是字母)
 <input name=”code” type=”text” value=”” />
  <?php echo “<img src=’example_homepage.txt’>”;?>
  <input type=”submit” value=”提交”>
  </form>

curl_setopt($ch, CURLOPT_HEADER, 0); // make sure we get the body
curl_setopt($ch, CURLOPT_NOBODY, 0);

  </body>
  </html>

curl_setopt($ch, CURLOPT_HEADER, 0); // make sure we get the body
curl_setopt($ch, CURLOPT_NOBODY, 0);

-getems.php

  1. 访问虚拟主机,需设置Host

复制代码 代码如下:

 代码如下

<?php
  if($_POST){
  //使用先前验证码的cookie文件
  $cookiejar = realpath(‘cookie.txt’);
  //获取myEmsbarCode号 和验证码变量名
  $ch = curl_init(“http://www.ems.com.cn“);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
  $result = curl_exec($ch);
  curl_close($ch);
  preg_match(“/<input type=\”hidden\” name=\”myEmsbarCode\”
value=\”(.*)\”\/>/isU”,$result,$myEmsbarCode);
  preg_match(“/<\/span><input name=\”(.*)\”
type=\”text\”/isU”,$result,$codename);

$header[]= ‘Host: ‘.$host;

  $parm = array($codename[1]=>$_POST[‘code’],
  mailNum =>$_POST[‘mailNum’],
  myEmsbarCode=>$myEmsbarCode[1],
  reqCode=>’browseBASE’
  );

  1. 使用post, put, delete等REStful方式访问url
    post:

  $ch = curl_init(“http://www.ems.com.cn/qcgzOutQueryAction.do“);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_REFERER, “http://www.ems.com.cn“);
  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parm));
  $_source = curl_exec($ch);
  curl_close($ch);

 代码如下

  //搞定
  var_dump($_source);
  exit;
  }
  ?>

curl_setopt($ch, CURLOPT_POST, 1 );
put, delete:
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, “DELETE”);
//或者PUT,需要服务器支持这些方法。

对于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的例子 (摘自网络)

  1. 保存下载内容为文件

复制代码 代码如下:

 代码如下

  /*
  *判断一个url是否为有效链接
  */
  function isRealUrl($url){
  $ch = curl_init();
  $options = array(
  CURLOPT_URL => $url,
  CURLOPT_HEADER => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_NOBODY => true
  );
  curl_setopt_array($ch, $options);
  curl_exec($ch);
  if(!curl_errno($ch)){
  return 200==curl_getinfo($ch,CURLINFO_HTTP_CODE)?true:false;
  }
  curl_close($ch);
  }

curl_setopt($ch, CURLOPT_FILE, $fp);

相关文章