- 一、场景
- 二、猜想
- 三、验证猜想
- 1、F12尝试查看图片地址
- 2、那我们就查看是不是在网络数据中
- 3、验证其它页面数据是否同理
- 4、图片地址
- 四、代码思路
- 五、实现代码
- 六、结果
- 代码在命令行执行打印截图
- 文件夹效果图.jpg
- 七、其他
一、场景
有这么一个地址https://book.yunzhan365.com/yngc/gmhg/mobile/index.html?from=groupmessage&isappinstalled=0,
我们希望能把这本书下载到本地,用来学习
,页面如下:
二、猜想
- 1、大家可以看到这个页面类似一张图片,应该是有
图片地址
什么的。我们可以直接F12
去选中元素,尝试查看图片的地址 - 2、大家可以看到
下方中间
我圈出了一个红色的1/100
,目前猜测:这个大概意思的图片的数量
三、验证猜想
1、F12尝试查看图片地址
- 如下图,可以发现
并没有我们意料中的图片地址
2、那我们就查看是不是在网络数据中
F12
之后,先点击删除
,然后依次点击:网络
->所有
->F5刷新页面
->随便点一个链接地址
-> 点击响应
,看一下有没有哪个响应是返回一直图片的,如下图
- 还真有一个地址是响应图片的,我们再点击
消息头
,查看图片地址:https://book.yunzhan365.com/yngc/gmhg/files/thumb/1.jpg?1582796421=&x-oss-process=image/format,webp,把图片地址输入到浏览器访问,浏览器正常显示一张图片。
3、验证其它页面数据是否同理
- 我们可以发现,往右边翻的时候:页面会提前缓存下一页(就是两张图片)的数据:意思就是第一页就缓存了(1,2,3)3张图片;第二页(2,3)提前读取了下一页的(4,5)两张图片,以此类推…读到(14,15)页的时候,提前读取了(16,17)页的图片。
- 往左边翻页反之:第100页,提前读取(98,99)页的数据;第(98,99)页,提前读取(96,97)页的数据
4、图片地址
- 我们可以得出图片有100张,地址为
- https://book.yunzhan365.com/yngc/gmhg/files/thumb/1.jpg,
- https://book.yunzhan365.com/yngc/gmhg/files/thumb/2.jpg,
- …
- https://book.yunzhan365.com/yngc/gmhg/files/thumb/100.jpg
四、代码思路
根据以上结论,可以出一道题:
已知有100张图片,https://book.yunzhan365.com/yngc/gmhg/files/thumb/page.jpg,page的值为[1, 100],请把这些图片下载到本地
【编码思路(这里跟语言没什么关系)】
- 1、for循环从1-100
- 2、远程图片下载到本地
- 3、(递归)创建文件夹,给文件夹最大权限(这个看情况)
五、实现代码
//我这个Demo在命令行中执行:在命令行执行的话需要配置PHP的环境变量
public function test() {set_time_limit(0); //在命令行执行不存在超时问题,可以不设置这一句;如果是在浏览器执行,为防止超时,请设置这一句$pageTotal = 100;for ($page = 1; $page <= $pageTotal; $page ++) {$url = "https://book.yunzhan365.com/yngc/gmhg/files/mobile/{$page}.jpg";self::download($url, 'images/厨房抽油烟风机/');echo "第[{$page}]张图片下载完成" . PHP_EOL;}
}function download($url, $path = 'images/') {if (!file_exists($path)) {self::createDirectory($path);}$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);$filename = pathinfo($url, PATHINFO_BASENAME);$resource = fopen($path . $filename, 'a');fwrite($resource, $file);fclose($resource);
}function createDirectory($dir) {return is_dir ( $dir ) or self::createDirectory(dirname( $dir )) and (mkdir ( $dir , 0777) && chmod($dir, 0777));
}
六、结果
代码在命令行执行打印截图
文件夹效果图.jpg
七、其他
- 我要尝试下载更多:http://www.yunzhan365.com/explore/
- PHP设置环境变量