Press "Enter" to skip to content

php模拟登陆,curl,并抓取登陆后的页面内容图片下载到本地

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);
    }

 

Leave a Reply

Your email address will not be published. Required fields are marked *