【NodeJS】必应搜索每日壁纸的爬虫实现(4K/8K)

本文由花朝网原创首发,授权转载请以链接形式注明出处,本文唯一永久链接:http://www.huazhaox.com/article/43

经常或偶尔使用必应搜索的小伙伴都知道,必应搜索每天都会更新一张背景壁纸,有时候是一段视频,据了解必应搜索的每日壁纸十年如一日,从未间断,最早可以追溯到2010年1月。。。

我经常使用必应查找资料,所以经常发现:哎哟,今天的壁纸真好看。

时间一长就有了想法,来做个网站吧,说干就干:分析必应的壁纸数据来源、分析可获取的壁纸尺寸、是否可以抓取历史的必应每日壁纸、找个合适的域名、思考合适的网站结构和页面布局等~

一、必应每日壁纸数据来源

打开 必应搜索,按Ctrl + Alt + I打开调试工具 > 网络,切换到 Fetch/XHR,用最笨的方法挨个查看调用的接口,最后定位到这个接口:https://www.bing.com/hp/api/model?mkt=zh-CN,右键新标签页打开,可以直接访问,开发工具可以看到每日壁纸数据在 response.data.MediaContents 中,只有7行,看来只能得到最近七天的壁纸数据,从必应搜索界面的壁纸切换也可以证实。

此时心中有个小疑问:以前的壁纸获取不到吗?先不管这个,先看看壁纸有没有高清晰的吧!

二、可获取的壁纸尺寸(4K/8K清晰度)

从接口的返回response.data.MediaContents[0].ImageContent.Image中可以得到两个图片地址,分别是UrlWallpaper,复制到新标签中,加上前缀 https://www.bing.com 查看图片,分别是不带水印的 1920x1080 和带水印的 1920x1200,再次检查了 model 接口,没有发现更多的图片地址,难道没有4K/8K的图片吗?通过搜索引擎查找相关资料,确定是有4K图片资源的,最终确定需要抓取的图片有两个(带水印的就不要了):

  • (1920x1080)https://www.bing.com/th?id=OHR.Balsamroot_ZH-CN9456182640_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&qlt=100
  • (4K/8K)https://www.bing.com/th?id=OHR.Balsamroot_ZH-CN9456182640_UHD.jpg&rf=LaDigue_UHD.jpg&pid=hp&rs=1&c=4&qlt=100

有趣的是,4K/8K的图片地址不是每次都会返回4K/8K图片尺寸的,有时是1920的图片,所以这里要通过判断,如果没有返回4K/8K的,那么要在图片地址上再加两个参数,想知道的小伙伴在底部留言吧,文章没人看说出来有什么意思呢~^_^

三、爬虫的实现

爬虫的具体实现在这里不详细写了,相信会的都会,使用自己熟悉的语言都是一套撸,请求接口、解析HTML提取需要的数据、下载壁纸图片、存数据库等。。

NodeJS 爬虫实现所需依赖:

  • axios: 基于 promise 的 HTTP 库,用于请求网页,得到网页HTML源码;
  • cheerio: Node.js 端的 jQuery 核心实现,用于解析HTML源码,可以像 jQuery 一样在 NodeJS 端操作DOM;
  • Jimp: 图像处理库;
  • node-schedule: 用于 Node.js 管理定时任务,每日定时爬取壁纸。

写这文章只是想告诉大家,必应搜索其实提供了4K甚至8K的图片,只是没有在接口给出来而已,细心胆大的小伙伴早都从URL上尝试出来了,O(∩_∩)O哈哈~ 你如果不相信可以来我网站瞅瞅 http://www.bingbz.com/image/OHR.OiaVillage_ZH-CN2495652522

四、www.bingbz.com 壁纸标签系统

顺便说一说自己的心得,通过开发这个壁纸网站,最近还学会了第一次用数据库做简单的相似推荐,准确度的话还行吧,。。

我是通过给每张壁纸加标签,用壁纸标签交叉计算相似度来实现壁纸的相似推荐,目前壁纸数量比较少,壁纸数量越多准确度越高。后来想了想其实可以做到更精确,每张壁纸在添加标签时,给标签分配一个匹配度,这样再结合壁纸和标签的匹配值就能把相似推荐做得更好啦,只是这样太麻烦了,所以不了了之。


最后,欢迎参观我的网站,必应高清壁纸:http://www.bingbz.com

0 条评论
请不要发布违法违规有害信息,如发现请及时举报或反馈
还没有人评论呢,速度抢占沙发!
相关文章
  • 封装一个重试方法,爬虫网络错误后进行重试文件名:net-error-retry.js/** * 网络请求出错重试 * @param {[type]} request 请求函数 * @par...

  • //中间件import jwt from "jsonwebtoken"; import {resultFail} from "../common/utils"; import {SECRET} fro...

  • 概述写这篇blog的原因,想找个node的ORM框架用用,确很难找到一篇对比分析这些ORM框架的文章,唯一找到了一篇,居然是通过star数来论英雄,我觉着很难服众,于是就找几个看看。后来又不想分析,因...

  • Express 快速创建 Web 服务器 express 的基本使用 先安装express包 npm i express@4.17.1 1.导入 express const express = re...

  • 前言消息队列是存储数据的一个中间件,可以理解为一个容器。生产者生产消息投递 到队列中,消费者可以拉取消息进行消费,如果消费者目前没有消费的打算,则消息队列会保留消息,直到消费者有消费的打算。设计思路生...

  • nodejs是单线程执行的,同时它又是基于事件驱动的非阻塞IO编程模型。这就使得我们不用等待异步操作结果返回,就可以继续往下执行代码。当异步事件触发之后,就会通知主线程,主线程执行相应事件的回调。以上...

  • Renode 是一个开发框架,通过让你模拟物理硬件系统来加速物联网和嵌入式系统开发。 Renode 可以模拟 Cortex-M、RISC-V 等微控制器,不仅可以模拟 CPU指令,还可以模拟外设,甚至...

  • node.js 初探Node.js 是一个 JS 的服务端运行环境,简单的来说,它是在 JS 语言规范的基础上,封装了一些服务端的运行时对象,让我们能够简单实现非常多的业务功能。如果我们只使用 JS ...

  • 读取文件夹fs.readdirSync('./')判断文件类型fs.statSync(item).isDirectory()路径拼接path.resolve(dir, item)封装function ...

  • jwt是json web token的简称,本文介绍它的原理,最后后端用nodejs自己实现如何为客户端生成令牌token和校验token1.为什么需要会话管理我们用nodejs为前端或者其他服务提供...

  • 大家好,我卡颂。22年11月14日,Deno发布了v1.28,距离他第一个稳定版本v1.0.0发布(2020年5月13日)已过去2年。作为Node.js的竞争者,Deno似乎并没有达到取代前者的目标。...

  • Node.js 有哪些特性?在应用构建的时候有哪些注意事项?入门同学如何实现技术进阶?本期大咖说,阿里云高级技术专家朴灵携作品《深入浅出 Node.js》展开分享。https://www.youku....

  • 进程:process模块process 模块是 nodejs 提供给开发者用来和当前进程交互的工具,它的提供了很多实用的 API。从文档出发,管中窥豹,进一步认识和学习 process 模块:如何处理...

  • 1.前言 Node.js 是一个开源和跨平台的 JavaScript 运行时环境 Node.js 在浏览器之外运行 V8 JavaScript 引擎(Google Chrome 的内核)。 这...

  • nodejs的出现为前端行业带来了无限的可能性,让很多原来只负责客户端开发的同学也慢慢开始接触和使用服务器端技术.虽然nodejs带来了很多的好处,但是它也存在自身的局限性.和那些传统老牌的编程语言相...

  • 一、常见的全局对象 1.全局对象的定义 全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。 在浏览器JavaScript中,通常window是全局对象 在...

  • 此处如无特殊指出的话,event loop的语境都是指nodejs本文研究所用的nodejs环境是:操作系统window10 + nodejs版本号为v12.16.2什么是event loop?eve...

  • 本文只讨论 CommonJS 规范,不涉及 ESM我们知道 JavaScript 这门语言诞生之初主要是为了完成网页上表单的一些规则校验以及动画制作,所以布兰登.艾奇(Brendan Eich)只花了...

  • 百度站长 post 推送示例是这样的:POST /urls?site=www.huazhaox.com&token=jxa26LMj9x1An7QhHTTP/1.1 User-Agent: curl...

  • 我们都知道Nodejs遵循的是CommonJS规范,当我们require('moduleA')时,模块是怎么通过名字或者路径获取到模块的呢?首先要聊一下模块引用、模块定义、模块标识三个概念。1 Com...