# curl_pics
**Repository Path**: DaDingDing/curl_pics
## Basic Information
- **Project Name**: curl_pics
- **Description**: 声明这是一篇正经文章!以一个写真图片网站为例子,分析了爬站过程中的各个环节,本次分阶教学,当前为第一阶,不涉及多进程、分页爬取等相关内容
- **Primary Language**: PHP
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: http://www.hlzblog.top/article/49.html
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2020-08-12
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 简介
为了让大家对印象深刻
本次将以一个写真站点为例
批量下载站点作品
## 打开页面
随便打开一个页面
[https://www.meitulu.com/t/yanni/](https://www.meitulu.com/t/yanni/)
## 审查元素
对着列表页的第一个信息块儿边上,鼠标右键审查元素

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

### 分析
因为这是列表信息,肯定是被一个元素包起来,然后循环渲染的
我们很容易知道
是这家伙把它包起来的
所以我们首先现在需要通过 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;
}
}
将数据拉取下来后
经过[正则匹配](http://www.hlzblog.top/Article/12.html),我们可以提取到文章内容

然后我们写几个正则匹配,按一定格式存储数据,方便一会儿批量下载
我自己设定的格式 如下
{
"src": [...],
"title": [...],
"pages": [...],
}
### 下载
这部分,云天河就不多说了
你们直接看我 `lib` 目录下的 `DownLoad.php` 是怎么写的就行
### 最后
我们命令行到项目根目录下 执行
php .\index.php
即可批量下载图片了


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