├── README.md ├── auto.js ├── bing-china.py ├── bing-china_linux.py ├── bing-global.py └── bing-global_linux.py /README.md: -------------------------------------------------------------------------------- 1 | # BingWallpaper 2 | 用python+termux+auto.js 在安卓平板上实现每日定时爬取必应壁纸 3 | ## 简介 4 | 利用Python写好的爬虫脚本,主要功能是抓取[必应](https://cn.bing.com)上的每日图片。因为身边并没有服务器,再说跑一个爬虫脚本也没必要去购买一个服务器来专门做爬虫。windows的笔记本也不可能每天都开着。所以想到了能不能利用自己身边其他的电子设备来帮助自己完成这个每天爬取图片的任务。 5 | 经过上网查询后了解到可以使用安卓设备安装一个[termux](https://termux.com/)的软件来完成任务。下面是termux软件的有关介绍。 6 | 7 | >Termux是一个Android下一个高级的终端模拟器, 开源且不需要root, 支持apt管理软件包,十分方便安装软件包, 完美支持Python, PHP, Ruby, Go, Nodejs, MySQL等。随着智能设备的普及和性能的不断提升,如今的手机、平板等的硬件标准已达到了初级桌面计算机的硬件标准, 用心去打造完全可以把手机变成一个强大的工具. 8 | 9 | 简单来说安卓系统(本身就是基于Linux系统)的设备安装了termux的软件后,就可以在termux中用命令操作linux。和真正的linux系统还是有差别的。这个软件是不需要安卓设备拥有root权限的。 10 | 11 | * [Termux下载地址](https://www.coolapk.com/apk/com.termux) 12 | 13 | Termux可以运行数据库、部署博客等等还有其他的用处,具体的详细情况见下: 14 | * [Termux 高级终端安装使用配置教程](https://www.sqlsec.com/2018/05/termux.html) 15 | 16 | >Auto.js 是一个不需要Root权限的JavaScript自动化软件。 17 | 18 | Auto.js 是可以在安卓系统上运行JS脚本的软件。这个软件可以做每天早上定时收取支付宝蚂蚁能量、各种app的签到、手机游戏脚本等等能做的事情很多。这个app之前是免费试用的,现在酷安只能找到Auto.js.pro 版本,需要注册并支付一定数额的金钱。下面会给出之前免费版本的下载地址。 19 | 20 | * [Auto.js官方网站](https://hyb1996.github.io/AutoJs-Docs/#/) 21 | * [Auto.js下载](https://github.com/Ericwyn/Auto.js/releases) 22 | 23 | ## 操作步骤 24 | 25 | 1. 首先在安卓设备上安装好termux。在上面的 [Termux 高级终端安装使用配置教程](https://www.sqlsec.com/2018/05/termux.html) 中完成阅读"快速上手"到"访问外置存储优化",并且在termux中安装好python3和git。 26 | 27 | 2. 直接在termux中输入 28 | > git clone git@github.com:xiaoliu66/BingWallpaper.git 29 | 30 | 其中bing-china.py和bing-global.py 就是必应的国内版和国际版的爬虫。在termux中输入 31 | > crontab -e #添加定时脚本任务 32 | 33 | > crontab -l #查看当前的定时脚本任务 34 | 35 | 比如:自己的定时任务如下: 36 | > 00 16 * * * python /你的python脚本所在的目录/bing-china.py >> /data/data/bing-china.log # 意思是每天的下午16点会定时执行这个爬取必应国内版的脚本并把信息添加到一个日志文件中。 37 | 38 | 3. 上面的定时任务需要在termux中启动crond服务,命令如下: 39 | > crond start # crontab 服务启动 40 | 41 | > crond stop # crontab 服务停止 42 | 43 | > crond restart # crontab 服务重启 44 | 45 | 这个命令需要开启termux中自动输入,但是我在网上找资料是需要在Google play中下载一个Termux:boot 软件(需要付费且几年无更新过、Android 8不能安装该软件)。所以,我选择了在Auto.js中写了一个js脚本在启动termux后,自动输入crond start 启动crontab服务。 46 | 47 | 安卓设备不可能24小时都亮屏,Auto.js 有定时执行脚本功能。所以这套流程大致如下: 48 | 平板息屏--->Auto.js 定时执行脚本唤醒平板----->Auto.js执行脚本模拟人点击键盘输入“crond start” 命令---->termux中crontab 定时执行python脚本爬取必应首页图片--->Auto.js 执行脚本模拟输入“exit”退出termux(记得设置termux运行时屏幕常亮)---->流程结束 49 | 50 | 其中每个人的安卓设备都是不一样的,我的是小米平板4。屏幕分辨率也不一样,所以在模拟输入命令时,需要准确的获取你自己安卓设备上的几个字母的准确坐标值。详见[auto.js简单入门教学autojs教程第一课认识auto以及编写简单脚本连接电脑手机方法投屏软件](https://www.bilibili.com/video/av54488377) 51 | 52 | 53 | 4. 以上就是自己瞎折腾完成的满足自己需求的过程,不喜勿喷:) -------------------------------------------------------------------------------- /auto.js: -------------------------------------------------------------------------------- 1 | auto(); // 自动打开无障碍服务,注意平板屏幕要横着放置,因为脚本代码是根据平板横置写的。 2 | 3 | /*判断屏幕锁定,解锁屏幕 小米平板的滑动解锁用auto.js 不能模拟 所以直接在“开发者选项中” 开启“直接进入系统”功能*/ 4 | if (!device.isScreenOn()) {//息屏状态将屏幕唤醒 5 |     device.wakeUp();//唤醒设备 6 |     sleep(1000); // 等待屏幕亮起 7 | 8 |     //miui10 向上锁屏滑动不论是swipe函数还是gtesure函数都不行,miui9之前是可以的 9 | // 直接进入开发者模式,启动“点亮屏幕直接进入桌面”  10 | } 11 | 12 | // 启动 Termux 13 | var appName = "Termux" 14 | launchApp(appName); 15 | sleep(2000); // 等待2s 16 | 17 | // 在平板界面弹出的键盘输入“crond start”并回车 18 | click(766,1047); 19 | click(668,803); 20 | click(1620,807); 21 | click(1346,1048); 22 | click(572,922); 23 | click(954,1151); 24 | click(385,932); 25 | click(861,809); 26 | click(193,933); 27 | click(679,807); 28 | click(862,806); 29 | click(1750,1154); 30 | 31 | 32 | sleep(600000); //等待10min 33 | 34 | // 输入“exit”退出Termux 35 | click(478,809); 36 | click(578,1048); 37 | click(1434,794); 38 | click(859,800); 39 | click(1750,1154); 40 | 41 | /* 返回桌面 42 | back(); // 模拟按下返回键。 43 | back();*/ 44 | -------------------------------------------------------------------------------- /bing-china.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | from urllib import request 4 | import time 5 | import os 6 | # 爬取每日必应壁纸(国内版) 7 | ''' 8 | 必应国内版和国际版的区别是国内的时间比美国时间快13h,所以国内版的当日壁纸比国际版的图片要早出来。 9 | 国际版的页面上提供下载地址,且有水印。 10 | ''' 11 | 12 | # 给出具体网址,并用requests进行网页爬取 13 | url = 'https://cn.bing.com/' 14 | webdata = requests.get(url).text 15 | 16 | # 用BeautifulSoup对网页进行解析 17 | soup = BeautifulSoup(webdata,'lxml') 18 | 19 | # 找出图片所在的标签 20 | img_address = soup.find('div',id ='bgImgProgLoad') 21 | a = 'https://cn.bing.com/' 22 | 23 | # 图片的具体地址 24 | # print(a + img_address.get('data-ultra-definition-src')) 25 | link = a + img_address.get('data-ultra-definition-src') 26 | 27 | # 获取当前时间 格式为 ‘2019-11-21’ 28 | date = time.strftime('%Y-%m-%d',time.localtime(time.time())) 29 | # print ('D:/bing/BingWallpaper-' + date + '.jpg') 30 | 31 | # 创建文件夹函数 32 | def mkdir(path): 33 | folder = os.path.exists(path) 34 | 35 | if not folder: #判断是否存在文件夹如果不存在则创建为文件夹 36 | os.makedirs(path) 37 | print(path + " 文件夹创建成功!") 38 | else: 39 | return 0 40 | #print(path + " 文件夹已经存在.") 41 | # 创建文件夹,将爬取的gif下载到所创建的文件夹中 42 | file = "D:\\bing" 43 | mkdir(file) 44 | 45 | # 使用urllib库的urlretrieve()方法下载 46 | request.urlretrieve(link,file + '/BingWallpaper-' + date + '.jpg') # 图片文件示例名----BingWallpaper-2019-11-21.jpg 47 | -------------------------------------------------------------------------------- /bing-china_linux.py: -------------------------------------------------------------------------------- 1 | #!/usr/local/bin/python3 2 | import requests 3 | from bs4 import BeautifulSoup 4 | from urllib import request 5 | import time 6 | import os 7 | # 爬取每日必应壁纸(国内版) 8 | ''' 9 | 必应国内版和国际版的区别是国内的时间比美国时间快13h,所以国内版的当日壁纸比国际版的图片要早出来。 10 | 国际版的页面上提供下载地址,且有水印。 11 | ''' 12 | 13 | # 给出具体网址,并用requests进行网页爬取 14 | url = 'https://cn.bing.com/' 15 | webdata = requests.get(url).text 16 | 17 | # 用BeautifulSoup对网页进行解析 18 | soup = BeautifulSoup(webdata,'lxml') 19 | 20 | # 找出图片所在的标签 21 | img_address = soup.find('div',id ='bgImgProgLoad') 22 | a = 'https://cn.bing.com/' 23 | 24 | # 图片的具体地址 25 | # print(a + img_address.get('data-ultra-definition-src')) 26 | link = a + img_address.get('data-ultra-definition-src') 27 | 28 | # 获取当前时间 格式为 ‘2019-11-21’ 29 | date = time.strftime('%Y-%m-%d',time.localtime(time.time())) 30 | datetime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) 31 | # print ('D:/bing/BingWallpaper-' + date + '.jpg') 32 | 33 | # 创建文件夹函数 34 | def mkdir(path): 35 | folder = os.path.exists(path) 36 | 37 | if not folder: #判断是否存在文件夹如果不存在则创建为文件夹 38 | os.makedirs(path) 39 | print(path + " 文件夹创建成功!") 40 | else: 41 | return 0 42 | #print(path + " 文件夹已经存在.") 43 | # 创建文件夹,将爬取的图片下载到所创建的文件夹中 44 | file = "/home/liudao/BingWallpaper/bing-china" + "_" + date[0:7] 45 | mkdir(file) 46 | 47 | # 使用urllib库的urlretrieve()方法下载 48 | request.urlretrieve(link,file + '/BingWallpaper-' + date + '.jpg') # 图片文件示例名----BingWallpaper-2019-11-21.jpg 49 | print(datetime + " 图片下载成功!") 50 | -------------------------------------------------------------------------------- /bing-global.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | from urllib import request 4 | import time 5 | import os 6 | 7 | # 爬取每日必应壁纸(国际版) 8 | ''' 9 | 必应国内版和国际版的区别是国内的时间比美国时间快13h,所以国内版的当日壁纸比国际版的图片要早出来。 10 | 国际版的页面上提供下载地址,且有水印。 11 | ''' 12 | 13 | # 给出具体网址,并用requests进行网页爬取 国际版的下载按钮是进入网站后滚轮下滑出现的,不是静态页面,是通过js生成的动态页面。 14 | url = 'https://cn.bing.com/hpm?FORM=BEHPTB&ensearch=1&IG=BD5D76C020BB4FE98F33E01CF1F3CF28&IID=SERP.1001&chunk=1' 15 | webdata = requests.get(url).text 16 | 17 | # 用BeautifulSoup对网页进行解析 18 | soup = BeautifulSoup(webdata,'lxml') 19 | 20 | # 找出图片所在的标签 21 | img_address = soup.find('a',id='vs_bs_download') 22 | a = 'https://cn.bing.com/' 23 | 24 | # 图片的具体地址 25 | link = a + img_address.get('href') 26 | #print(link) 27 | 28 | # 获取当前时间 格式为 ‘2019-11-21’ 29 | date = time.strftime('%Y-%m-%d',time.localtime(time.time())) 30 | # print ('D:/bing/BingWallpaper-' + date + '.jpg') 31 | 32 | # 创建文件夹函数 33 | def mkdir(path): 34 | folder = os.path.exists(path) 35 | 36 | if not folder: #判断是否存在文件夹如果不存在则创建为文件夹 37 | os.makedirs(path) 38 | print(path + " 文件夹创建成功!") 39 | else: 40 | return 0 41 | #print(path + " 文件夹已经存在.") 42 | # 创建文件夹,将爬取的gif下载到所创建的文件夹中 43 | file = "D:\\bing" 44 | mkdir(file) 45 | 46 | 47 | try: 48 | # 使用urllib库的urlretrieve()方法下载 49 | request.urlretrieve(link,file + '/BingWallpaper-global-' + date + '.jpg') # 图片文件示例名----BingWallpaper-2019-11-21.jpg 50 | except Exception: 51 | # 国际版有时会遇到网页上声明不能下载,只好下载无水印版的。 52 | img_address = soup.select("#vert_iotd > div > div > div.vs_rowitem.vs_iotd_img > a > img") 53 | 54 | for i in img_address: 55 | link = i.get("src") 56 | links = a + link[0:-11] + "1920x1080.jpg" 57 | request.urlretrieve(links, file + '/BingWallpaper-global-' + date + '.jpg') 58 | 59 | -------------------------------------------------------------------------------- /bing-global_linux.py: -------------------------------------------------------------------------------- 1 | #!/usr/local/bin/python3 2 | import requests 3 | from bs4 import BeautifulSoup 4 | from urllib import request 5 | import time 6 | import os 7 | 8 | # 爬取每日必应壁纸(国际版) 9 | ''' 10 | 必应国内版和国际版的区别是国内的时间比美国时间快13h,所以国内版的当日壁纸比国际版的图片要早出来。 11 | 国际版的页面上提供下载地址,且有水印。 12 | ''' 13 | 14 | # 给出具体网址,并用requests进行网页爬取 国际版的下载按钮是进入网站后滚轮下滑出现的,不是静态页面,是通过js生成的动态页面。 15 | url = 'https://cn.bing.com/hpm?FORM=BEHPTB&ensearch=1&IG=BD5D76C020BB4FE98F33E01CF1F3CF28&IID=SERP.1001&chunk=1' 16 | webdata = requests.get(url).text 17 | 18 | # 用BeautifulSoup对网页进行解析 19 | soup = BeautifulSoup(webdata,'lxml') 20 | 21 | # 找出图片所在的标签 22 | img_address = soup.find('a',id='vs_bs_download') 23 | a = 'https://cn.bing.com/' 24 | 25 | # 图片的具体地址 26 | link = a + img_address.get('href') 27 | #print(link) 28 | 29 | # 获取当前时间 格式为 ‘2019-11-21’ 30 | date = time.strftime('%Y-%m-%d',time.localtime(time.time())) 31 | datetime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) 32 | # print ('D:/bing/BingWallpaper-' + date + '.jpg') 33 | 34 | # 创建文件夹函数 35 | def mkdir(path): 36 | folder = os.path.exists(path) 37 | 38 | if not folder: #判断是否存在文件夹如果不存在则创建为文件夹 39 | os.makedirs(path) 40 | print(path + " 文件夹创建成功!") 41 | else: 42 | return 0 43 | #print(path + " 文件夹已经存在.") 44 | # 创建文件夹,将爬取的gif下载到所创建的文件夹中 45 | file = "/home/liudao/BingWallpaper/bing-global" + "_" + date[0:7] 46 | mkdir(file) 47 | 48 | 49 | try: 50 | # 使用urllib库的urlretrieve()方法下载 51 | request.urlretrieve(link,file + '/BingWallpaper-global-' + date + '.jpg') # 图片文件示例名----BingWallpaper-2019-11-21.jpg 52 | except Exception: 53 | # 国际版有时会遇到网页上声明不能下载,只好下载无水印版的。 54 | img_address = soup.select("#vert_iotd > div > div > div.vs_rowitem.vs_iotd_img > a > img") 55 | 56 | for i in img_address: 57 | link = i.get("src") 58 | links = a + link[0:-11] + "1920x1080.jpg" 59 | request.urlretrieve(links, file + '/BingWallpaper-global-' + date + '.jpg') 60 | 61 | print(datetime + " 图片下载成功!") 62 | --------------------------------------------------------------------------------