Last updated on 2019-05-16
在日常开发过程中,我们对接其它平台接口的时候,可能需要获取他们已登录页面的数据,比如图片,可能他们的商品详情页存的是链接,我们需要将他们的图片抓取到本地,避免大量外链影响速度
1.分析页面元素
通过F12审查元素以及查看源代码查找,在本页面并没有form
标签,由此推断页面是通过js进行提交的。
2.查找提交地址
由于提交的js代码可能写在了外部的js文件中,直接查找很不方便,所以通过Chrome的调试模式寻找发送的http请求。
注意勾选下图的Preserve log
,避免页面跳转的请求记录丢失。
填入手机号密码,在Chrome的Network中查找登录接口请求。
很显然,Request URL 就是登陆的地址
首先使用postman
进行模拟登录测试,我这里使用的是QQ浏览器的CrapApi
登陆成功,拿到用户信息,下面用PHP代码curl的方式获取
header("Content-type:text/html;charset=utf-8"); $curl = curl_init(); $cookie_jar = tempnam('./tmp', 'cookie'); curl_setopt($curl, CURLOPT_URL, $this->login_url);//登录的页面地址 curl_setopt($curl, CURLOPT_POST, 1); $request = 'mobile=18888888888&password=123456'; curl_setopt($curl, CURLOPT_POSTFIELDS, $request);//传递数据 curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_jar);// 把返回来的cookie信息保存在$cookie_jar文件中 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设定返回的数据是否自动显示 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_MAXREDIRS, 1); curl_setopt($curl, CURLOPT_AUTOREFERER, 1); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); $res = curl_exec($curl);//返回结果 curl_close($curl); //关闭 //$res = json_decode($res,true);
3.获取登陆后的页面数据
我们这里是登陆后获取商品详情页数据
$path = '/images'; foreach($imgArr as $k=>$v){ $this->downloadImage($v,'../attachs'.$path); }
4.将图片下载到本地
/** * 获取图片 * @param $url * @param string $path */ public function downloadImage($url, $path='images/') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $this->saveAsImage($url, $file, $path); } /** * 图片保存到本地 * @param $url * @param $file * @param $path */ private function saveAsImage($url, $file, $path) { if (!file_exists($path)) { mkdir($path, 0777, true); } $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'w'); fwrite($resource, $file); fclose($resource); }