完整代码:https://github.com/her-cat/wallpaper_crawler

页面分析

  • 壁纸站地址:http://www.huanse.net/

打开网站首页,通过审查元素找到详情页面和略缩图的地址(下图红框部分)。
- 详情页面地址: ./wallpaper-6873.html
- 略缩图地址:./uploads/thumb/thumb-6873.jpg

可以看到这两个地址中都有 6873 这个数字,先猜测一下这个数字是这张壁纸的id,也就是唯一标识符。

为了验证猜测是否正确,打开详情页面对 点击按钮下载 右键审查元素,就看到下载壁纸的url。

从下载地址中可以看到 wallpaper=6873 这个参数,现在就能确认 6873 是壁纸的id。

window.open('./download.php?wallpaper=6873&type=1')

也就是说只要知道壁纸的id,就可以得到壁纸的下载地址。

http://www.huanse.net/download.php?wallpaper={壁纸id}&type=1

所以爬取的流程就是获取壁纸id,拼接出下载地址,然后下载壁纸。

爬取壁纸id

壁纸的id在列表页就已经有了,所以我们只需要对列表页进行循环爬取就行了。

使用到的工具:
- QueryList QueryList具有jQuery一样的DOM操作能力,这样就不用写正则表达式了
- predis php连接redis的操作库,用来保存壁纸id


require 'vendor/autoload.php';
use QL\QueryList;
use Predis\Client;// 实例化 redis 连接
$client = new Predis\Client('tcp://127.0.0.1:6379');$page = 1;
do {// 使用 QueryList 获取 html 网页内容,找到所有 img 标签的 data-echo 属性的值$data = QueryList::get("http://www.huanse.net/new-{$page}.html")->find('img')->attrs('data-echo');if (count($data) > 0) {foreach ($data as $datum) {if ($datum) {// 通过分割字符串得到壁纸id$wallpaper_id = explode('.', explode('-', $datum)[1])[0];// 将壁纸id push 到 redis 中$client->lpush('wallpaper_id_queue', $wallpaper_id);}}} else {echo 'no data. page: ' . $page . PHP_EOL;break;}$page++;echo 'now page: ' . $page . PHP_EOL;
}while(true);

运行截图:

Redis 中保存的壁纸id

下载壁纸

下载壁纸这一步很简单,只需要从 redis 中不停的取出壁纸id,然后通过下载地址将壁纸下载到本地。

require 'vendor/autoload.php';use QL\QueryList;
use Predis\Client;$client = new Predis\Client('tcp://127.0.0.1:6379');while(true) {// 从 redis 中取出壁纸id$wallpaper_id = $client->rpop('wallpaper_id_queue');if($wallpaper_id == 'nil' || $wallpaper_id == ''){// 如果壁纸id为空的话就休眠5秒钟echo 'not have wallpaper data, sleep 5 second...' . PHP_EOL;sleep(5);continue;}try {downloadWallpaper($wallpaper_id);// 验证壁纸是否保存成功if (file_exists('./wallpaper/' . 'wallpaper-' . $wallpaper_id . '.jpg')) {echo 'success: ' . $wallpaper_id . PHP_EOL;} else {echo 'fail: ' . $wallpaper_id . PHP_EOL;}} catch (Exception $e) {echo 'img exception, sleep 1 second...' . PHP_EOL;sleep(1);}
};/*** 下载壁纸* @param $wallpaper_id* @return int*/
function downloadWallpaper($wallpaper_id) {// 拼接下载地址$download_url = $url = "http://www.huanse.net/download.php?wallpaper={$wallpaper_id}&type=1";set_time_limit (24 * 60 * 60);$destination_folder = './wallpaper/';if (!is_dir($destination_folder)) {mkdirs($destination_folder);}$newfname = $destination_folder . 'wallpaper-' . $wallpaper_id . '.jpg';$file = fopen ($url, "rb");if ($file) {$newf = fopen ($newfname, "wb");if ($newf)while (!feof($file)) {fwrite($newf, fread($file, 1024 * 8), 1024 * 8);}}if ($file) {fclose($file);}if ($newf) {fclose($newf);}return 0;
}

运行效果

运行截图:

保存的壁纸:

爬取壁纸id脚本的脚本用一个窗口执行就够了,下载壁纸的脚本可以多开几个窗口运行,提高壁纸下载速度。

PHP 使用 QueryList + Redis 批量下载壁纸相关推荐

  1. 利用站点抓取功能批量下载壁纸

    IDM是一款简单.易上手的下载器,,使用IDM下载器可以进行文档.图片.网页等等类型文件的下载,十分方便快捷,可以极大地便利我们的生活与工作.电脑壁纸可以美化桌面,优化我们的使用体验.那么,当你有多张 ...

  2. python壁纸程序代码_python批量下载壁纸的实现代码

    复制代码 代码如下: #! /usr/bin/env python ##python2.7-批量下载壁纸 ##壁纸来自桌酷网站,所有权归属其网站 ##本代码仅做为交流学习使用,请勿用于商业用途,否则后 ...

  3. python壁纸数据抓取_python爬虫系列之 xpath实战:批量下载壁纸

    一.前言 在开始写爬虫之前,我们先了解一下爬虫 首先,我们需要知道爬虫是什么,这里直接引用百度百科的定义网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照 ...

  4. Python实现壁纸批量下载

    Python实现壁纸批量下载 最近想要一些新的壁纸,但是从网站上面找一张一张下载太慢了,所以写了个爬虫批量下载壁纸. 先看看实现的效果 需要的包: requests.bs4 .os.re 源码: # ...

  5. scrapy 下载壁纸(图片)详细教程

    利用scrapy批量下载壁纸图片 文章末尾有整个项目的链接 1.创建项目 scrapy startproject huicheSpider cd huicheSpider scrapy genspid ...

  6. python代码壁纸-python实现壁纸批量下载代码实例

    前言 好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python.这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁纸. 注意:本文所属项目仅用 ...

  7. python代码壁纸-70行python代码实现壁纸批量下载

    前言 好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python.这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁纸. 注意:本文所属项目仅用 ...

  8. 分享一个:批量下载个性化桌面壁纸和各种唯美图片的方法

    现代人很多都是在用电脑,平板工作了,那么电脑屏幕上有张喜欢的屏保,是很有必要的.今天小编给大家具体操作一下,如何批量下载到自己喜欢的图片.下面小编就以天堂图片网为例. 首先还是要去搜索下载一个工具:载 ...

  9. wallpaper代码_70 行 python 代码实现壁纸批量下载!

    好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python.这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁纸. 注意:本文所属项目仅用于py ...

最新文章

  1. 基于注解的 AOP 配置
  2. Android开机启动流程初探
  3. wxWidgets:用于测试 TAB 导航的示例
  4. 人工智能正在如何改变传统行业
  5. 树莓派Java程序运行_树莓派上Java程序作为linux服务并开机自动启动
  6. 利用 jQuery 克隆 Object
  7. byte与或运算 java_java中byte转换int时为何与0xff进行与运算
  8. 中绘制折线_统计图之折线图的结构和制作过程
  9. mysql数据库接收不了中文乱码_mysql数据库 中文乱码
  10. java中数字转换汉语中人民币的大写
  11. C++:error: passing ‘const string’ as ‘this’ argument discards qualifiers [-fpermissive]
  12. 信用卡业务愈卷愈烈,银行机构如何突围?
  13. Java后端利用腾讯云短信服务发短信
  14. 502 bad gateway是什么意思?502 bad gateway怎么解决!
  15. 云计算的认识和看法_个人对云计算的看法 我对云计算的认识
  16. EXCEl 时间戳转换为日期格式
  17. 2018年区块链十大发展势头
  18. LED灯具耐压测试怎么做?耐压测试电压多少?
  19. 微信小程序中使用iconfont(阿里矢量图标字体)
  20. TCP协议详解之TCP Flag标志位来判断TCP会话的开始和结束

热门文章

  1. java计算机毕业设计健康食谱系统服务器端源码+mysql数据库+系统+lw文档+部署
  2. [数值计算-9]:一元非线性函数求导数(数值微分)- 解析法与迭代法Python法代码示例
  3. 俄罗斯机器人雄鹿_17+11浪子回头!雄鹿362万捡宝,顶级3D内线比大洛还猛
  4. Ubuntu用nginx部署html项目
  5. chrome浏览器出现Uncaught DOMException: Failed to execute ‘postMessage‘ on ‘Window‘: HTMLUnknownElement ob
  6. 防孤岛保护装置-防孤岛保护测控装置-光伏发电防孤岛运行
  7. (DUC/DDC)数字上混频/正交下混频原理及matlab仿真
  8. Bootstrap -tabindex属性
  9. 关于const的用法
  10. CentOS(Linux)配置主机名和IP地址的映射关系