1.页面与接口数据分析

首先第一步,我们打开bing首页国内版https://cn.bing.com/?FORM=BEHPTB;随手打开F12

经过分析可得到获取图片的 接口是
https://cn.bing.com/HPImageArchive.aspx?format=js&idx=2&n=1&nc=1597026531683&pid=hp&FORM=BEHPTB
返回的数据是

{"images": [{"startdate": "20200807","fullstartdate": "202008071600","enddate": "20200808","url": "/th?id=OHR.LosOrganos_ZH-CN5283582047_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","urlbase": "/th?id=OHR.LosOrganos_ZH-CN5283582047","copyright": "鸟瞰戈梅拉岛上管风琴形状的玄武岩,西班牙加那利群岛 (© Martin Siepmann/Image BROKER/Offset by Shutterstock)","copyrightlink": "/search?q=%e6%88%88%e6%a2%85%e6%8b%89%e5%b2%9b&form=hpcapt&mkt=zh-cn","title": "","quiz": "/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20200807_LosOrganos%22&FORM=HPQUIZ","wp": true,"hsh": "ec8d73ceb4d3cdfc6dab5681de21eabe","drk": 1,"top": 1,"bot": 1,"hs": []}],"tooltips": {"loading": "正在加载...","previous": "上一个图像","next": "下一个图像","walle": "此图片不能下载用作壁纸。","walls": "下载今日美图。仅限用作桌面壁纸。"}
}
然后我们切换图片,分析一下参数和返回数据的变化

可以看出接口的参数变化的是idxnc, 其中idx的可选范围是0-7,说明我们每天可以通过该接口获取8张图片;nc参数的值猜测便知是new Date().getTime()得到,其他参数固定.

然后分析一下返回的数据。切换图片可以发现其实变化的是背景图background-image: url("/th?id=OHR.LassenPeak_ZH-CN5435067682_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp");
这时候就会一眼看出,这个背景图的url 不就是返回的images[0].url`嘛,so嘎 。

2.梳理实现思路

后端

云开发端需要的就是启用微信云函数每天定时调用这个接口;然后呢,把获取到的图片数据;存入微信小程序的json数据库啦。

前端

小程序的前端页面需要做的就是调用云函数获取图片数据以及展示数据

3.代码实现

思路理清楚之后;就是代码的一步步实现了。
接下来话不多说 直接上码

// 云函数入口文件 index.js
const env = 'test'
// 云函数入口文件
const cloud = require('wx-server-sdk')cloud.init({env
})
const db = cloud.database({env
})
let preFix = 'https://cn.bing.com'
const fetch = require('./fetch')
async function getBingImg(params = {}) {return fetch({url: `${preFix}/HPImageArchive.aspx?format=js&n=1&pid=hp&FORM=BEHPTB`,params,method: 'get',timeout: 3000,// headers: {// }})
}
async function getImg(params = {}) {const wxContext = cloud.getWXContext()let stop = falselet idx = 0let count = 0while (!stop) {let res = await getBingImg({idx: idx,nc: new Date().getTime()})idx ++if(res && res.images && res.images.length) {try {let data = res.images[0]// 将获取的数据保存到数据库commonImageListlet res2 = await cloud.callFunction({name: 'addDataToCloud',data: {dbName: 'commonImageList',primaryKey: 'src',list: [{src: `${preFix}${data.url}`,title: data.copyright}]}})count += res2.result.data.addCount}catch (e) {stop = true}} else {stop = true}if(idx >=10) {stop = true}}return count
}
// 云函数入口函数
exports.main = async (event, context) => {let count = await getImg()return {count}
}```javascript
// fetch.js
// 这里使用了axios库, 统一的异步请求发送处理
const axios = require('axios')// 创建axios实例
const fetch = axios.create({timeout: 60000 // 请求超时时间
})// request拦截器
fetch.interceptors.request.use(config => {return config
})// 响应拦截器
fetch.interceptors.response.use(response => {// 抛出接口数据return response.data},error => {return Promise.reject(error)}
)module.exports = fetch;
// 云函数的配置文件config.json
{"triggers": [{"name": "myTrigger","type": "timer",// 这里是每天的23.00执行"config": "0 0 23 * * * *"}]
}
// package.json
{"name": "interval","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "","license": "ISC","dependencies": {"wx-server-sdk": "~2.1.2","axios": "^0.19.2"}
}

以上是4个文件是目录位置如下图


下面是小程序图片展现页面

<!--new.vue-->
<template><view class="index"><block v-for="(item, index) in dataList" :key="item.src"><view class="card" @click="goDetail(item,index)"><image class="card-img" :src="item.src" mode="aspectFill"></image><!--<text class="card-num-view">{{item.img_num}}P</text>--><view class="card-bottm row"><view class="car-title-view row"><text class="card-title">{{item.title}}</text></view><view @click.stop="share(item)" class="card-share-view"></view></view></view></block><text class="loadMore">{{loadMoreText}}</text></view>
</template><script>export default {data() {return {refreshing: false,loadMoreText: '加载中...',dataList: [],totalCount: 0,fetchPageNum: 0,fetchPageSize: 5}},onLoad() {this.getData();uni.getProvider({service: 'share',success: (e) => {let data = []for (let i = 0; i < e.provider.length; i++) {switch (e.provider[i]) {case 'weixin':data.push({name: '分享到微信好友',id: 'weixin'})data.push({name: '分享到微信朋友圈',id: 'weixin',type: 'WXSenceTimeline'})break;case 'qq':data.push({name: '分享到QQ',id: 'qq'})break;default:break;}}this.providerList = data;},fail: (e) => {console.log('获取分享通道失败', e);}});},onReachBottom() {console.log('滑动到页面底部')if ((this.fetchPageNum) *this.fetchPageSize >= this.totalCount || this.dataList.length >= this.totalCount) {this.loadMoreText = '没有更多了'return;}this.getData();},onPullDownRefresh() {console.log('下拉刷新');this.refreshing = true;this.fetchPageNum = 0;this.getData();},methods: {async getData() {this.loadMoreText = '加载中...'const db = wx.cloud.database()let ret = await wx.cloud.callFunction({name: 'getDbListData',data: {dbName: 'commonImageList',pageNo: this.fetchPageNum + 1,pageSize: this.fetchPageSize,limitType: 3,params: {},}})// errMsg: "collection.get:ok"if (ret.errMsg !== 'cloud.callFunction:ok') {console.log('请求失败', ret)return;}this.totalCount = ret.result.totalCountconst data = ret.result.data;if (this.refreshing && data[0] && data[0]._id === this.dataList[0]._id) {uni.showToast({title: '已经最新',icon: 'none',});this.refreshing = false;uni.stopPullDownRefresh();return;}let list = [];for (var i = 0; i < data.length; i++) {var item = data[i];list.push({fileID: item.fileID,img_num: 1,_id: item._id,title: item.nickName || item.title,src: item.fileID || item.src});}if (this.refreshing) {this.refreshing = false;uni.stopPullDownRefresh();this.dataList = list;} else {this.dataList = this.dataList.concat(list);this.fetchPageNum += 1;}if(data.length < this.fetchPageSize) {this.loadMoreText = '没有更多了'}if(this.dataList && this.dataList.length<=0) {this.loadMoreText = '暂无数据'this.refreshing = false;uni.stopPullDownRefresh();this.dataList = list;}},goDetail(e,index) {uni.navigateTo({url: `/pages/detail/detail?list=${encodeURIComponent(JSON.stringify(this.dataList))}&index=${index}`});},share(e) {if (this.providerList.length === 0) {uni.showModal({title: '当前环境无分享渠道!',showCancel: false})return;}let itemList = this.providerList.map(function(value) {return value.name})uni.showActionSheet({itemList: itemList,success: (res) => {uni.share({provider: this.providerList[res.tapIndex].id,scene: this.providerList[res.tapIndex].type && this.providerList[res.tapIndex].type === 'WXSenceTimeline' ?'WXSenceTimeline' : 'WXSceneSession',type: 0,title: 'uni-app模版',summary: e.title,imageUrl: e.img_src,href: 'https://uniapp.dcloud.io',success: (res) => {console.log('success:' + JSON.stringify(res));},fail: (e) => {uni.showModal({content: e.errMsg,showCancel: false})}});}})}}}
</script><style></style>

4.来吧;展示。

小程序现已发布,有兴趣可以体验一下;目前爬取图片数量有限。后面会越来多

5.PS

做这个小程序的初衷是为了了解一下uni-app打包成微信小程序,然后熟悉一下微信小程序的云开发功能;期间还是踩到了不少坑;这里不一一说明;有兴趣同学可以试着搞一下,遇到问题可以互相交流学习。

uni-app+微信小程序+云开发 爬取必应首页每日图片相关推荐

  1. 基于微信小程序云开发(校园许愿墙app)2.0稳定版,以发布上线

    大家好~我是c站的一个小博主,我会定期更新博文,本篇是围绕微信小程序基于腾讯云开发展开的一个项目,如果看着还不错,或者对您有帮助的话,可以进我的专栏看看我的小程序的其他作品https://blog.c ...

  2. 微信小程序云开发不完全指北

    微信小程序云开发不完全指北 首先必须说明云开发的"云"并不是类似云玩家里的云的意思,而是微信小程序真的提供了云开发的接口以及一个简单的提供存储.数据库服务的虚拟后台(对于一些轻量小 ...

  3. 微信小程序云开发用户身份登录_你必须要掌握的微信小程序云开发

    微信小程序开发已经成为目前最火爆的技能之一,无论是在求职.毕设.兴趣培养等方面都已经成为一项必备技能,而小程序云开发技术的出现更是点燃了整个小程序生态圈. 在2019微信公开课PRO小程序分论坛上,腾 ...

  4. 微信小程序云开发实战:网上商城(二)

    微信小程序云开发实战:网上商城(二) 主页面 入口页面 云函数与云数据库 代码实现 云端实现 小程序端实现 选择UI组件库 WeUI Vant 整合UI组件库 以扩展包的方式引入weui 接下来 主页 ...

  5. 【系】微信小程序云开发实战坚果商城-云开发开篇

    第 3-2 课:云开发开篇 目录 开篇 [系]微信小程序云开发实战坚果商城-开篇 基础篇 [系]微信小程序云开发实战坚果商城-弹性盒子 [系]微信小程序云开发实战坚果商城-ES6 简单入门 [系]微信 ...

  6. 怎么实现微信小程序云开发拼团功能?

    [微信云开发教程]怎么实现微信小程序云开发拼团功能? 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 [微 ...

  7. 微信小程序云开发 · 从0搭建商业级校园跑腿平台(已开源)

    微信小程序云开发  ·  从零搭建商业级校园跑腿平台 小秃僧 新生代农民工,一枚准毕业的大四学生,热爱前端开发,做个有态度.有思想.有价值的公众号. 好久不更新了,再更新已是打工人! 我将分享用云开发 ...

  8. 微信小程序云开发数据库操作

    1.在app.js中初始化云环境 // app.js App({onLaunch() {//初始化云服务if (!wx.cloud) {console.error('请使用 2.2.3 或以上的基础库 ...

  9. 【系】微信小程序云开发实战坚果商城-商城项目搭建

    第 2-1 课:商城项目搭建 目录 开篇 [系]微信小程序云开发实战坚果商城-开篇 基础篇 [系]微信小程序云开发实战坚果商城-弹性盒子 [系]微信小程序云开发实战坚果商城-ES6 简单入门 [系]微 ...

  10. 【系】微信小程序云开发实战坚果商城-扩展篇

    第 5-1 课:扩展篇 目录 开篇 [系]微信小程序云开发实战坚果商城-开篇 基础篇 [系]微信小程序云开发实战坚果商城-弹性盒子 [系]微信小程序云开发实战坚果商城-ES6 简单入门 [系]微信小程 ...

最新文章

  1. 为什么对高斯分布的方差的极大似然估计是有偏的?
  2. 【PHPWord】列表ListItem
  3. 基础知识(三)-网络
  4. 课堂练习---最低价格买书
  5. MOSS 2007的备份与恢复
  6. RHEL5.1下安装GCC
  7. 阿里小程序云应用上线了,有哪些看点?
  8. spark学习-69-源代码:Endpoint模型介绍(1)
  9. Layui导航、面包屑
  10. 邪恶的编码魔咒,你中招没?
  11. JSONObject put,accumulate,element的区别
  12. Python—字典(当索引不好用时)
  13. ad敷铜后还有部分飞线_眼花缭乱!超级无敌的飞线大法,打造一把超低功耗无线机械键盘...
  14. java生成word,营业执照获取信息,cookie
  15. 光学仿真(python菲涅尔公式)
  16. 信源编码程序设计实验C语言实现,霍夫曼信源编码实验报告.docx
  17. element-ui使用踩坑记录 2022/8/24
  18. 个人总结 onSaveInstanceState方法会在什么时候被执行
  19. POJ - 1679 The Unique MST (次小生成树) 板子
  20. 【他山之石】康师傅的本地化策略

热门文章

  1. 国家医保移动支付国密算法SM2签名验签、SM4加解密测试工具
  2. 使用CSS3制作一个简单的导航栏
  3. 浙江大学计算机学院科研团队,科研团队
  4. 利用C51单片机内部函数_corl_函数实现LED流水灯。
  5. 达梦数据库启动、停止,集群环境监视器服务启动、停止,查看各机器状态
  6. 坦白说php源码,qq坦白说新思路解密 附源码
  7. 计算机农林科学类sci期刊,农林科学类sci期刊有哪些
  8. 华硕天选3笔记本电脑WiFi功能消失
  9. 算术平均数、几何平均数、
  10. Cox与KM生存分析及结果解读 不同的生存分析方法 单因素和多因素生存分析的比较km cox回归分析差异 生存分析结果详解 结果解读 参数详细解释 全因死亡率