1 Star 1 Fork 2

云天河 / curl_pics

Create your Gitee Account
Explore and code with more than 8 million developers,Free private repositories !:)
Sign up
This repository doesn't specify license. Please pay attention to the specific project description and its upstream code dependency when using it.
Clone or Download
contribute
Sync branch
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README.md

简介

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

打开页面

随便打开一个页面
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

即可批量下载图片了


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

About

声明这是一篇正经文章!以一个写真图片网站为例子,分析了爬站过程中的各个环节,本次分阶教学,当前为第一阶,不涉及多进程、分页爬取等相关内容 expand collapse
Cancel

Releases

No release

Contributors

All

Activities

Load More
can not load any more
PHP
1
https://gitee.com/haleyleozhang/curl_pics.git
git@gitee.com:haleyleozhang/curl_pics.git
haleyleozhang
curl_pics
curl_pics
master

Search