php登录抓取网页指定内容(使用CURL的PHP扩展完成一个HTTP请求的发送(组图) )

优采云 发布时间: 2022-01-21 15:02

  php登录抓取网页指定内容(使用CURL的PHP扩展完成一个HTTP请求的发送(组图)

)

  CURL 是一个非常强大的开源库,支持多种协议,包括 HTTP、FTP、TELNET 等。我们使用它来发送 HTTP 请求。它给我们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL 可以根据 URL 前缀是“HTTP”还是“HTTPS”,自动选择是否对发送的内容进行加密。

  使用 CURL 的 PHP 扩展发送 HTTP 请求一般有以下步骤:

  初始化连接句柄;设置 CURL 选项;执行并获得结果;释放 CURL 连接句柄。一、使用curl模拟一个GET请求

  $curl=curl_init(); //初始化curl句柄

$url="http://www.conglinfeng.com/together/detail.php?show_ID=5"; //要请求的url地址

curl_setopt($curl, CURLOPT_URL,$url); //设置curl的参数,即要请求的url是$url

curl_exec($curl); //执行操作

curl_close($curl); //关闭句柄

  执行curl_exec()时,成功时输出网页代码,返回值为TRUE,失败时返回FALSE。但是,如果选择了 CURLOPT_RETURNTRANSFER

  设置项,函数成功时返回执行结果,失败时返回FALSE。

  二、使用curl模拟post请求

  $curl=curl_init();

$url="./register.php";

curl_setopt($curl, CURLOPT_URL,$url);

curl_setopt($curl, CURLOPT_POST, true); //设置请求为post

$post_data=array('username'=>"嘿嘿",'password'=>'111111','confirm'=>'111111',

'email'=>"986992484@qq.com"); //要发送的数据组装成一个数组

curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); //post的数据内容

curl_exec($curl);

curl_close($curl);

  注册.php:

  var_dump($_POST);

  三、处理响应数据

  执行 curl_exec() 时,会直接输出响应数据。如果不需要直接输出,可以加上: curl_setopt($curl, CURLOPT_RETURNTRANSFER, true) ;

  $url="./register.php";

curl_setopt($curl, CURLOPT_URL,$url);

curl_setopt($curl, CURLOPT_POST, true); //设置请求为post

$post_data=array('username'=>"嘿嘿",'password'=>'111111','confirm'=>'111111',

'email'=>"986992484@qq.com");

curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); //post的数据内容

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true) ; //请求执行时,不将响应数据直接输出,而是以返回值的形式输出响应数据

$res=curl_exec($curl);

echo $res; //少了这句就输不出来了

curl_close($curl);

  四、模拟post文件上传

  $url="./register.php";

curl_setopt($curl, CURLOPT_URL,$url);

curl_setopt($curl, CURLOPT_POST, true); //设置请求为post

$post_data=array('logo'=>'@D:\wamp\wamp\www\czbk\php&mysql\1.png'); // logo是$_FILES的name,后面的是图片路径,加@表示这是一个文件而不是字符串

curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); //post的数据内容

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true) ; //请求执行时,不将响应数据直接输出,而是以返回值的形式输出响应数据

$res=curl_exec($curl);

echo $res;

curl_close($curl);

  五、输出响应头

  curl 默认不输出响应头。如果要输出,需要加上: curl_setopt($curl, CURLOPT_HEADER, true);

  $url="http://www.conglinfeng.com/together/member/index.php";

curl_setopt($curl, CURLOPT_URL,$url);

curl_setopt($curl, CURLOPT_HEADER, true); //将响应头输出,默认是不输出的

// HTTP/1.1 200 OK Date: Thu, 15 Sep 2016 14:49:28 GMT Server: Apache/2.4.4 (Win32) PHP/5.4.16 X-Powered-By: PHP/5.4.16 Content-Length: 692 Content-Type: text/html

curl_exec($curl);

curl_close($curl);

  六、示例: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.oschina.net/action/user/login";

//设置cookie保存路径

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

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

$url2 = "http://m.oschina.net/my";

//模拟登录

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

//获取登录页的信息

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

//删除cookie文件

@ unlink($cookie);

//匹配页面信息

$preg = "/(.*)/i";

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

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

//输出内容

echo $str;

  七、封装 CURL

  为了方便以后调用,我们可以封装这些操作。

  1. 模拟 get 或 post 请求

  /**

* curl() curl模拟请求---一个参数是get请求,两个参数是post请求

*

* 上传文件$post=array('logo'=>'@D:\wamp\wamp\www\czbk\php&mysql\1.png');

* logo是$_FILES的name,后面的是图片路径,加@表示这是一个文件而不是字符串

*

* @param string $url 模拟请求的url

* @param array $post post请求时要提交的数据

* @param boolean $header 是否要将响应头输出

* @return string $str 返回响应结果

*/

function curl($url,$post=array(),$header=false){

if(!$url) return;

//设置资源句柄

$curl=curl_init();

curl_setopt($curl, CURLOPT_URL,$url);

//如果传$post,则说明是post请求

if($post && is_array($post) && count($post)>0){

curl_setopt($curl, CURLOPT_POST, 1);

curl_setopt($curl, CURLOPT_POSTFIELDS, $post);

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //不验证证书

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); //不验证证书

}

//请求执行时,不将响应数据直接输出,而是以返回值的形式输出响应数据

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

//决定要不要将响应头输出

curl_setopt($curl, CURLOPT_HEADER,$header);

$str=curl_exec($curl);

//IGNORE 忽略转换时的错误,如果没有ignore参数,所有该字符后面的字符串都无法被保存。

$str = iconv("UTF-8","GBK//IGNORE",$str);

curl_close($curl);

return $str;

}

  2.模拟登录

  /**

* curl_login() curl模拟登陆

*

* @param string $logUrl 登陆地址url

* @param string $desUrl 要访问页面的url

* @param array $post 要提交的数据

* @param string $cookie='' 存储cookie的文件路径

* @return string $str 返回响应结果

*/

function curl_login($logUrl,$desUrl,$post,$cookie=''){

/********模拟登陆**********/

//初始化curl模块

$curl = curl_init();

//登录提交的地址

curl_setopt($curl, CURLOPT_URL,$logUrl);

//是否显示头信息

curl_setopt($curl, CURLOPT_HEADER, 0);

//是否自动显示返回的信息

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);

//设置Cookie信息保存在指定的文件中

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

if(!file_exists($cookie))}{

$fp=fopen($cookie, 'w'); fclose($fp);

}

curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);

//post方式提交

curl_setopt($curl, CURLOPT_POST, 1);

//提交信息,http_build_query()可以将数组转换成相连接的字符串。

curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));

//执行cURL并关闭cURL资源,并且释放系统资源

curl_exec($curl);

curl_close($curl);

/********登陆后获取数据**********/

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $desUrl);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//读取cookie

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);

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

curl_close($ch);

return $rs;

}

  也可以将curl的操作封装成一个类Curl.class.php

<p>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线