python实现动态壁纸_70 行 python 代码实现壁纸批量下载
写于 2018.01.24
前言
好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python。这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁纸。
注意:本文所属项目仅用于python学习,严禁作为其他用途使用!
初始化项目
项目使用了virtualenv来创建一个虚拟环境,避免污染全局。使用pip3直接下载即可:
pip3 install virtualenv
复制代码
然后在合适的地方新建一个wallpaper-downloader目录,使用virtualenv创建名为venv的虚拟环境:
virtualenv venv
. venv/bin/activate
复制代码
接下来创建依赖目录:
echo bs4 lxml requests > requirements.txt
复制代码
最后yun下载安装依赖即可:
pip3 install -r requirements.txt
复制代码
分析爬虫工作步骤
可以看到,这一页里面一共有10张可供下载的壁纸。但是由于这里显示的都是缩略图,作为壁纸来说清晰度是远远不够的,所以我们需要进入壁纸详情页,去找到高清的下载链接。从第一张壁纸点进去,可以看到一个新的页面:
因为我机器是Retina屏幕,所以我打算直接下载体积最大的那个以保证高清(红圈所示体积)。
了解了具体的步骤以后,就是通过开发者工具找到对应的dom节点,提取相应的url即可,这个过程就不再展开了,读者自行尝试即可,下面进入编码部分。
访问页面
新建一个download.py文件,然后引入两个库:
from bs4 import BeautifulSoup
import requests
复制代码
接下来,编写一个专门用于访问url,然后返回页面html的函数:
def visit_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'
}
r = requests.get(url, headers = headers)
r.encoding = 'utf-8'
return BeautifulSoup(r.text, 'lxml')
复制代码
为了防止被网站反爬机制击中,所以我们需要通过在header添加UA把爬虫伪装成正常的浏览器,然后指定utf-8编码,最后返回字符串格式的html。
提取链接
在获取了页面的html以后,就需要提取这个页面壁纸列表所对应的url了:
def get_paper_link(page):
links = page.select('#content > div > ul > li > div > div a')
return [link.get('href') for link in links]
复制代码
这个函数会把列表页所有壁纸详情的url给提取出来。
下载壁纸
有了详情页的地址以后,我们就可以进去挑选合适的size了。在对页面的dom结构分析后可以知道,每一个size都对应着一个链接:
所以第一步,就是把这些size对应的链接提取出来:
wallpaper_source = visit_page(link)
wallpaper_size_links = wallpaper_source.select('#wallpaper-resolutions > a')
size_list = [{
'size': eval(link.get_text().replace('x', '*')),
'name': link.get('href').replace('/download/', ''),
'url': link.get('href')
} for link in wallpaper_size_links]
复制代码
size_list就是这些链接的一个集合。为了方便接下来选出最高清(体积最大)的壁纸,在size中我使用了eval方法,直接把这里的5120x3200给计算出来,作为size的值。
获取了所有的集合之后,就可以使用max()方法选出最高清的一项出来了:
biggest_one = max(size_list, key = lambda item: item['size'])
复制代码
这个biggest_one当中的url就是对应size的下载链接,接下来只需要通过requests库把链接的资源下载下来即可:
result = requests.get(PAGE_DOMAIN + biggest_one['url'])
if result.status_code == 200:
open('wallpapers/' + biggest_one['name'], 'wb').write(result.content)
复制代码
注意,首先你需要在根目录下创建一个wallpapers目录,否则运行时会报错。
整理一下,完整的download_wallpaper函数长这样:
def download_wallpaper(link):
wallpaper_source = visit_page(PAGE_DOMAIN + link)
wallpaper_size_links = wallpaper_source.select('#wallpaper-resolutions > a')
size_list = [{
'size': eval(link.get_text().replace('x', '*')),
'name': link.get('href').replace('/download/', ''),
'url': link.get('href')
} for link in wallpaper_size_links]
biggest_one = max(size_list, key = lambda item: item['size'])
print('Downloading the ' + str(index + 1) + '/' + str(total) + ' wallpaper: ' + biggest_one['name'])
result = requests.get(PAGE_DOMAIN + biggest_one['url'])
if result.status_code == 200:
open('wallpapers/' + biggest_one['name'], 'wb').write(result.content)
复制代码
批量运行
上述的步骤仅仅能够下载第一个壁纸列表页的第一张壁纸。如果我们想下载多个列表页的全部壁纸,我们就需要循环调用这些方法。首先我们定义几个常量:
import sys
if len(sys.argv) != 4:
print('3 arguments were required but only find ' + str(len(sys.argv) - 1) + '!')
exit()
category = sys.argv[1]
try:
page_start = [int(sys.argv[2])]
page_end = int(sys.argv[3])
except:
print('The second and third arguments must be a number but not a string!')
exit()
复制代码
这里通过获取命令行参数,指定了三个常量category, page_start和page_end,分别对应着壁纸分类,起始页页码,终止页页码。
为了方便起见,再定义两个url相关的常量:
PAGE_DOMAIN = 'http://wallpaperswide.com'
PAGE_URL = 'http://wallpaperswide.com/' + category + '-desktop-wallpapers/page/'
复制代码
接下来就可以愉快地进行批量操作了,在此之前我们来定义一个start()启动函数:
def start():
if page_start[0] <= page_end:
print('Preparing to download the ' + str(page_start[0]) + ' page of all the "' + category + '" wallpapers...')
PAGE_SOURCE = visit_page(PAGE_URL + str(page_start[0]))
WALLPAPER_LINKS = get_paper_link(PAGE_SOURCE)
page_start[0] = page_start[0] + 1
for index, link in enumerate(WALLPAPER_LINKS):
download_wallpaper(link, index, len(WALLPAPER_LINKS), start)
复制代码
然后把之前的download_wallpaper函数再改写一下:
def download_wallpaper(link, index, total, callback):
wallpaper_source = visit_page(PAGE_DOMAIN + link)
wallpaper_size_links = wallpaper_source.select('#wallpaper-resolutions > a')
size_list = [{
'size': eval(link.get_text().replace('x', '*')),
'name': link.get('href').replace('/download/', ''),
'url': link.get('href')
} for link in wallpaper_size_links]
biggest_one = max(size_list, key = lambda item: item['size'])
print('Downloading the ' + str(index + 1) + '/' + str(total) + ' wallpaper: ' + biggest_one['name'])
result = requests.get(PAGE_DOMAIN + biggest_one['url'])
if result.status_code == 200:
open('wallpapers/' + biggest_one['name'], 'wb').write(result.content)
if index + 1 == total:
print('Download completed!\n\n')
callback()
复制代码
最后指定一下启动规则:
if __name__ == '__main__':
start()
复制代码
运行项目
在命令行输入如下代码开始测试:
python3 download.py aero 1 2
复制代码
然后可以看到下列输出:
拿charles抓一下包,可以看到脚本正在平稳地运行中:
此时,下载脚本已经开发完毕,终于不用担心壁纸荒啦!
python实现动态壁纸_70 行 python 代码实现壁纸批量下载相关推荐
- python代码手机壁纸_70行python代码实现壁纸批量下载
前言 好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python.这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁纸. 注意:本文所属项目仅用 ...
- python读取文件第n行-Python读取文件后n行的代码示例
这篇文章主要介绍了Python实现读取文件最后n行的方法,涉及Python针对文件的读取.遍历与运算相关操作技巧,需要的朋友可以参考下# -*- coding:utf8-*- import os im ...
- python自动化--如何用10行Python代码调一个闹钟 #电脑调闹钟
python自动化--如何用10行Python代码写一个闹钟 前言: 文末彩蛋--轻松一刻 更多关于Python的知识请加关注哟~~.若需联系博主请私信或者加博主联系方式: QQ:1542 ...
- python壁纸数据抓取_70行python代码实现壁纸批量下载
注意:本文所属项目仅用于python学习,严禁作为其他用途使用! 初始化项目 项目使用了virtualenv来创建一个虚拟环境,避免污染全局.使用pip3直接下载即可: pip3 install vi ...
- wallpaper代码_70 行 python 代码实现壁纸批量下载!
好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python.这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁纸. 注意:本文所属项目仅用于py ...
- python代码壁纸-70行python代码实现壁纸批量下载
前言 好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python.这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁纸. 注意:本文所属项目仅用 ...
- python 爬取财经新闻股票_70行python代码爬取新浪财经中股票历史成交明细
70行python代码爬取新浪财经中股票历史成交明细 发布时间:2018-07-28 01:55, 浏览次数:635 , 标签: python 最近在研究股票量化,想从每笔成交的明细着手,但历史数据的 ...
- python实现直播功能rtmo_30 行 Python 代码实现 Twitch 主播上线实时通知
在 freeCodeCamp 社区阅读原文. 大家好 :) 今天我将开始写作一个新的文章系列,特别面向 Python 初学者.简言之,我将会尝试更多新的工具,编写尽可能少的代码,来完成一个有趣的项目. ...
- 用python画动态樱花_利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白...
利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白 此处感谢知乎大佬 小白练手 练习一下比较流行的turtle(海龟库) 画一棵漂亮的樱花树,效果如下: ps: 是动态 ...
最新文章
- 【OpenCV3】将图像指定区域使用另一图像(或ROI)覆盖
- Condition接口详解
- Python的魔法方法 .
- c语言 tcl.exe 自动登录,Tcl命令操作实验-----(3)---字符串
- 基于Android Classic Bluetooth的蓝牙聊天软件
- oracle 改变受限模式,oracle之受限模式修改
- iOS-项目开发1-UIImage
- springboot 添加 lombok 报错更新 版本号
- QEMU学习笔记——QOM(Qemu Object Model)
- AI人工智能仿写在线v.1.2.3
- 如何解决CAN FD与CAN网络共存问题
- Java内存模型—JMM详解
- android 倒计时类,Android倒计时工具类
- 电感电容之开关电源的原理
- 4G模组EC20在使用电信物联网专用卡时无信号问题
- SSL证书怎么部署,SSL证书需要怎么安装你知道吗?
- 一次手动查杀永恒之蓝病毒木马文件
- A095_day01_微信小程序入门与组件
- 为什么互联网人不说“人话”?
- 75个最佳网络安全工具