一般我们会用curl抓取其他网站的数据,不过一些网站会设置成登录后才可以获取数据,这样一来我们就需要利用curl模拟登录保存cookie,并且传递cookie伪装和网站建立通信,获取到数据。
curl模拟post登录
/**
* 模拟post登录
* @param string $url 登录地址
* @param string $post 登录参数
* @param string $cookie cookie文件地址
* @return mixed
*/
function curl_login($url, $post, $cookie){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json; charset=utf-8', 'Content-Length:' . strlen($post)]
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //提交方式为post,数据为json格式的。
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
$b = curl_exec($ch);
curl_close($ch);
return $b;
}
调用示例:
$cookie = '/login_cookie.txt';
//模拟登录
curl_login("/api/login", json_encode(['account' => 'xxx', 'password' => 'xxx']) ,$cookie);
获取cookie
/**
* 获取cookie
* @param string $url 登录地址
* @param string $cookie cookie文件地址
* @return mixed
*/
function curl_cookie($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);
$a = curl_exec($ch);
curl_close($ch);
return $a;
}
调用示例:
$cookie = '/login_cookie.txt';
//生成口令
curl_cookie("/api/login", $cookie);
模拟get获取数据
/**
* 模拟get获取数据
* @param $url
* @param $cookie
* @return mixed
*/
function curl_get($url, $cookie) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); //指定gzip压缩
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回数据不直接输出
curl_setopt($ch, CURLOPT_REFERER, '/static/index.html');//来路模拟
//curl_setopt($ch, CURLOPT_HOST, '');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
调用示例:
$cookie = '/login_cookie.txt';
//获取礼包
$content = json_decode(curl_get("/api/customermobile?customerMobile=".$mobile, $cookie), true);
模拟post获取数据
/**
模拟post获取数据
@param $url
@param $post
@param $cookie
@return mixed
*/
function curl_post($url, $post, $cookie) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); //指定gzip压缩
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json; charset=utf-8', 'Content-Length:' . strlen($post)]);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回数据不直接输出
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //提交方式为post
curl_setopt($ch, CURLOPT_REFERER, '/static/index.html');//来路模拟
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
调用示例:
$cookie = '/login_cookie.txt';
//获取数据
$ressult = curl_post("/api/exchangecode/verifycode", json_encode($post), $cookie);