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

好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习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复制代码

分析爬虫工作步骤

为了简单起见,我们直接进入分类为“aero”的壁纸列表页: wallpaperswide.com/aero-deskto…

f735afaf62d6272468c2f7f3e0677b26.png

可以看到,这一页里面一共有10张可供下载的壁纸。但是由于这里显示的都是缩略图,作为壁纸来说清晰度是远远不够的,所以我们需要进入壁纸详情页,去找到高清的下载链接。从第一张壁纸点进去,可以看到一个新的页面:

b6adac8bdeabbaef0018737ec376753b.png

进群:960410445 即可获取数十套PDF!

因为我机器是Retina屏幕,所以我打算直接下载体积最大的那个以保证高清(红圈所示体积)。

了解了具体的步骤以后,就是通过开发者工具找到对应的dom节点,提取相应的url即可,这个过程就不再展开了,读者自行尝试即可,下面进入编码部分。

访问页面

新建一个 download.py 文件,然后引入两个库:

from bs4 import BeautifulSoupimport 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都对应着一个链接:

d4c41c1cf91f21e700f94c6d2a82037e.png

所以第一步,就是把这些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 sysif 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!') callback()复制代码

最后指定一下启动规则:

if __name__ == '__main__': start()复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言调用go函数,C中调用go中的回调函数

在用go包装某些c库时(如glut)&#xff0c;需要将go函数当作回调函数传递给c库(如glutDisplayFunc(&draw)中的draw函数&#xff0c;我想将go写的函数传过去)&#xff0c;应该怎么做&#xff1f;我写了一个示例&#xff0c;但一直不成功&#xff0c;不知道为什么&#xff1f;…

100g流量在电脑上可以用多久_三大运营商5G体验方案出炉!100G一个月够不够?...

前段时间&#xff0c;工信部向中国移动、中国联通、中国电信、中国广电发放5G商用牌照&#xff0c;这也意味着&#xff0c;我国5G网络正式开始被商用。并且目前三大运营商都已完成了5G网络下的终端组网测试&#xff0c;计划于今年第三季度开始进行试商用。而就在近期&#xff0…

easyui一行显示多行_easyui datagrid以及oracle中的多行合并一行

页面显示:前端代码:toolbar"#toolbar" rownumbers"true" singleSelect"true" fitColumns"true">大箱码关联的箱码(不同箱码用分号分开&#xff0c;相同箱码用逗号分开)关联数量data-options"total: 0,pageSize:15,pageList: […

leetcode跳跃游戏C语言,LeetCode:跳跃游戏

给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步&#xff0c;从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到…

java 获取注释_Java面试题Java语言有哪些注释的方式?

点击上方“千锋Java学院”&#xff0c;选择“置顶公众号”每天一道面试模拟真题及解析课前导读●回复"每日一练"获取以前的题目&#xff0c;持续更新&#xff01;●我希望大家积极参与&#xff01;有什么不懂可以加小千微信进行讨论★把面试准备工作&#xff0c;拆分…

度秘语音引擎app_语音机器人哪家强 度秘/小冰/Siri/小娜横向评测

关于智能语音机器人&#xff0c;想必大家都不陌生&#xff0c;它们在某种程度上给我们带来了极大的便利。近日&#xff0c;百度推出了基于百度人工智能的手机助理产品——度秘。笔者也进行了体验&#xff0c;感觉不错&#xff0c;就顺带连着微软小冰、小娜和苹果Siri一起来个横…

c语言数字储存于变量,用C语言写中文数字字符串转数值变量

用C语言写中文数字字符串转数值变量C语言写中文数字字符转数值变量最近突发奇想&#xff1a;程序中要是输入一串中文数字&#xff0c;如“十万”就能自动识别转换成数值100000储存到变量里该多好。也许你会说&#xff0c;那很简单啊&#xff0c;先将中文字符分开&#xff0c;再…

微服务微应用的安全测试_提高微服务安全性的11个方法

1.通过设计确保安全设计安全&#xff0c;意味着从一开始就应该将安全性纳入软件设计中。关于安全&#xff0c;其中最常见的一个威胁就是恶意字符。我问我的朋友罗伯温奇(Rob Winch)他对删除恶意字符的想法。Rob是Spring Security项目的负责人&#xff0c;被广泛认为是安全专家。…

密度图的密度估计_箱形图、小提琴图、直方图……统统可以卡通化!

全文共11345字&#xff0c;预计学习时长23分钟或更长对于数据科学家来说&#xff0c;可视化工具比比皆是&#xff0c;因此&#xff0c;退一步去钻研每种可视化的类型及其适用的最佳案例就变得十分重要。为了发挥工具的最佳效用&#xff0c;有时可以考虑将其拟人化&#xff0c;甚…

android 屏幕分辨率 屏幕密度,Android屏幕适配——多分辨率多屏幕密度

为什么要适配&#xff0c;适配的好处等等这里就不说了&#xff0c;直接说我们要怎么适配&#xff0c;请看下面的内容。1.重要概念px&#xff1a;pixel&#xff0c;像素Android原生API&#xff0c;UI设计计量单位&#xff0c;如获取屏幕宽高。屏幕分辨率&#xff1a;指在纵向和横…

操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...

简介上篇【从入门到放弃-Java】并发编程-线程安全中&#xff0c;我们了解到&#xff0c;可以通过加锁机制来保护共享对象&#xff0c;来实现线程安全。synchronized是java提供的一种内置的锁机制。通过synchronized关键字同步代码块。线程在进入同步代码块之前会自动获得锁&…

cocos2dx标准容器_cocos2dx[3.2](24)——内存管理机制

【唠叨】整合参考文档。【参考】【内存管理机制】在3.x版本&#xff0c;Cocos2d-x采用全新的根类 Ref&#xff0c;实现Cocos2d-x 类对象的引用计数记录。引擎中的所有类都派生自Ref。1、引用计数Cocos2d-x 提供引用计数管理内存。> 调用 retain() 方法 &#xf…

android长按加入购物车,《Android APP可能有的东西》之UI篇:加入购物车动画

很多电商app的加入购物车的动作会要求加上动画效果&#xff1a;飞进购物车&#xff0c;想来也合理&#xff0c;在listview界面时商品快速加入购物车&#xff0c;一直toast用户加入成功好像不太正常&#xff0c;所以添加一个动画&#xff0c;用户自然就懂了&#xff0c;而且也挺…

python里的shell是什么_python中的shell操作

http://blog.csdn.net/meng_tianshi/article/details/6682317 首先介绍一个函数&#xff1a; os.system(command) 这个函数可以调用shell运行命令行command并且返回它的返回值。试一下在python的解释器里输入os.system(”ls-l”)&#xff0c;就可以看到”ls”列出了当前目录下的…

基于android 定位系统,基于Android平台定位系统设计和实现

2 0 1 3牟第 1 2期文章编号&#xff1a; 1 0 0 9— 2 5 5 2 ( 2 0 1 3 ) 1 2— 0 1 8 7— 0 4 中图分类号&#xff1a; T P 3 1 6 . 8 9 文献标识码&#xff1a; A基于 A n d r o i d平台定位系统设计和实现李瑞宣&#xff0c;王山东&#xff0c;徐志远&#xff0c;王伶俐(河海…

集合竞价如何买入_集合竞价买入法 如何在集合竞价中买入股票?

集合竞价买入法、 如何在集合竞价中买入股票&#xff1f;要想集合竞价买入涨停板&#xff0c;要做到如下3点&#xff1a;快、准、狠&#xff01;文章将为你盘点这几个方法的具体做法&#xff0c;希望对股民有所帮助。快&#xff1a;就是利用9&#xff1a;15-9&#xff1a;25这1…

python 公众号爬虫_python_爬虫_微信公众号抓取

importrequests,pymysqlimportjson,jsonpath,random,re,time,datetime,os,imghdrfrom lxml importetreefrom selenium importwebdriverfrom urllib importrequestimportssl ssl._create_default_https_contextssl._create_unverified_context注意点&#xff1a;如果同一时间内刷…

开发工评价程师自我_常见“自我评价”写作范例

“自我评价”在找工作的时候是一个非常重要的内容&#xff0c;优秀的“自我评价”不仅就可以让别人对你有一个全面的认识&#xff0c;更可以通过寥寥数语就让别人对你产生浓厚的兴趣&#xff0c;让你的求职之路事半功倍。但是怎么写“自我评价”&#xff0c;却是让很多人犯愁的…

android调用服务器端口,更改运行adb服务器的默认端口(即5037)

使用环境variablesANDROID_ADB_SERVER_PORT选择端口。以下在bash下工作&#xff1a;$ export ANDROID_ADB_SERVER_PORT12345 $ adb start-server * daemon not running. starting it now on port 12345 * * daemon started successfully * $ adb devices List of devices attac…

visual studio 调试python_Visual Studio Code Python 调试设置

很意外Visual Studio Code居然支持Python代码的断点调试。一起来配置一下。工具/原料 Visual Studio Code 1.1 Python 2.7.11 方法/步骤 1 首先&#xff0c;当然是要先安装插件&#xff0c;配置Python环境。这个大家看这个文章 2 环境配置完成后&#xff0c;我们点击调试按钮&a…