运用cURL实现写真专辑批量下载(一)

2018-02-04 06:21:39 PHP 4775 1

简介

为了让大家对印象深刻
本次将以一个写真站点为例
批量下载站点作品

项目地址

https://gitee.com/haleyleozhang/curl_pics

打开页面

随便打开一个页面
https://www.meitulu.com/t/yanni/

审查元素

对着列表页的第一个信息块儿边上,鼠标右键审查元素

分析结构

分析列表信息所处页面结构中的位置,以方便我们获取核心信息

分析

因为这是列表信息,肯定是被一个元素包起来,然后循环渲染的
我们很容易知道

<ul class="img">

是这家伙把它包起来的
所以我们首先现在需要通过 curl 之类的东西这页信息获取到

这种站点一般都要防爬虫的
我们应该伪装自己,让这个服务器以为我们是普通浏览器正常访问
这时候我们就需要查看浏览器正常访问时 http头部信息 是怎样的了

我们点进一个作品,对着一张内容图片审查元素

可以知道这个站点的图片上传规则为

图片前缀  + 图片数量 + 图片结尾后缀
https://mtl.ttsqgs.com/images/img/7709/  1   .jpg

查看头部信息

F12 打开调试控制台,选中 NetWork 中的 Doc
通过 Ctrl + F5 模仿着第一次进来时的样子
我们就可以看到首次访问该页面的响应头与请求头了 Request Headers 就是我们请求的头部信息了

本次的头部信息大致如下

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Cookie:UM_distinctid=1615a0d9fd2166-06355844e9b39b-1571466f-1fa400-1615a0d9fd316c; CNZZDATA1255487232=1958726030-1517653567-%7C1517653567; CNZZDATA1255357127=605834772-1517631364-https%253A%252F%252Fwww.baidu.com%252F%7C1517671118; Hm_lvt_1e2b00875d672f10b4eee3965366013f=1517634298; Hm_lpvt_1e2b00875d672f10b4eee3965366013f=1517672911
Host:www.meitulu.com
Pragma:no-cache
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0
注意事项

这里面含有 gzip 头部信息
我们也得 gzip 解压

这是一个 https 的站点
我们得记着配置下 https 证书相关的东西

很多站点都是有防盗链功能的
也就是通过头部信息中的 Refer 来实现鉴别这次请求是否来自本站,然后决定要不要给你传输图片资源
所以我们下载的时候,记着带上一个头部信息就好拉

拉取信息

我们接下来封装一个可以完成本次功能的cURL功能类
并将其放置到当前项目的 lib 目录下

class CurlRequest
{
    /**
     * POST或GET请求,并返回数据
     * @param  String      url     访问地址
     * @param  Array|JSON  data    用于POST的数据
     * @param  Array       header  HTTP头请求
     * @return String  返回数据
     */
    public static function run($url, $data = null, $header = null)
    {
        //请求 URL,返回该 URL 的内容
        $ch = curl_init(); // 初始化curl
        curl_setopt($ch, CURLOPT_URL, $url); // 设置访问的 URL
        curl_setopt($ch, CURLOPT_HEADER, 0); // 放弃 URL 的头信息
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回字符串,而不直接输出
        // Add Headers?
        if ($header) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }
        // Https ?
        if (preg_match('/^https/', $url)) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 不做服务器的验证
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 做服务器的证书验证
        }
        // POST method?
        if ($data) {
            curl_setopt($ch, CURLOPT_POST, true); // 设置为 POST 请求
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // 设置POST的请求数据
        }
        // 模拟重定向
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        // gzip 解压
        curl_setopt($ch, CURLOPT_ENCODING,'gzip');
        $content = curl_exec($ch); // 开始访问指定URL
        curl_close($ch); // 关闭 cURL 释放资源
        return $content;
    }
}

将数据拉取下来后
经过正则匹配,我们可以提取到文章内容

然后我们写几个正则匹配,按一定格式存储数据,方便一会儿批量下载
我自己设定的格式 如下

{
    "src": [],
    "title": [],
    "pages": [],
}

下载

这部分,云天河就不多说了
你们直接看我 lib 目录下的 DownLoad.php 是怎么写的就行

最后

我们命令行到项目根目录下 执行

php .\index.php

即可批量下载图片了


所以 现在老哥们会爬虫了吗

注:若无特殊说明,文章均为云天河原创,请尊重作者劳动成果,转载前请一定要注明出处