前言

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

callback()

最后指定一下启动规则:

if __name__ == '__main__':

start()

运行项目

在命令行输入如下代码开始测试:

python3 download.py aero 1 2

然后可以看到下列输出:

拿charles抓一下包,可以看到脚本正在平稳地运行中:

此时,下载脚本已经开发完毕,终于不用担心壁纸荒啦!

python代码壁纸-70行python代码实现壁纸批量下载相关推荐

  1. python代码手机壁纸_70行python代码实现壁纸批量下载

    前言 好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python.这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁纸. 注意:本文所属项目仅用 ...

  2. python实现动态壁纸_70 行 python 代码实现壁纸批量下载

    写于 2018.01.24 前言 好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python.这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁 ...

  3. python 小说爬虫_从零开始写Python爬虫 --- 1.7 爬虫实践: 排行榜小说批量下载

    从零开始写Python爬虫 --- 1.7 爬虫实践: 排行榜小说批量下载Ehco 5 个月前 本来只是准备做一个爬起点小说名字的爬虫,后来想了一下,为啥不顺便把小说的内容也爬下来呢?于是我就写了这个 ...

  4. 从零开始写Python爬虫 --- 1.7 爬虫实践: 排行榜小说批量下载

    从零开始写Python爬虫 --- 1.7 爬虫实践: 排行榜小说批量下载 Ehco 5 个月前 本来只是准备做一个爬起点小说名字的爬虫,后来想了一下,为啥不顺便把小说的内容也爬下来呢?于是我就写了这 ...

  5. 无需代码即可实现Excel中图片链接的批量下载

    今天在使用腾讯文档收集截图时,发现导出的Excel表格中是一列图片链接,不能直观的看到上传的图片,上网找了很多方法,但大多数是通过敲代码的形式来实现图片链接的批量下载的,对于编程不厉害的我来说,实现起 ...

  6. 遗传算法解决TSP问题 Python实现【160行以内代码】

    简述 之前通过遗传算法(Genetic Algorithm )+C++实现解决TSP问题 写了一些基本的原理.并且给出了C++版本代码. 相比于近300行的C++程序,Python只用了160行就解决 ...

  7. python写一个游戏多少代码-使用50行Python代码从零开始实现一个AI平衡小游戏

    集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym, ...

  8. python代码大全p-21行Python代码实现拼写检查器

    引入 大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供非常好的拼写检查,比如你输入 speling,谷歌会马上返回 spelling. 下面是用21行python代码实现的一个简易但是具备 ...

  9. python小游戏代码大全-20行python代码的入门级小游戏的详解

    背景: 作为一个python小白,今天从菜鸟教程上看了一些python的教程,看到了python的一些语法,对比起来(有其他语言功底),感觉还是非常有趣,就随手添了一点内容,改了一个小例程,当着练练手 ...

最新文章

  1. React 父组件给子组件传值,子组件接收
  2. YIFullScreenScroll
  3. java.lang包—对象基类Object
  4. 深入理解Spark 2.1 Core (十四):securityManager 类源码分析
  5. 双曲线和直线联立公式_圆锥曲线联解公式
  6. linux mysql授权远程登录,Linux中 MySQL 授权远程连接的方法步骤
  7. python开发公司网站_用python开发网站
  8. 运用经验模态分解方法(EMD)对实测探地雷达数据进行处理
  9. python 退出自定义函数_python通过自定义异常,提前退出方法
  10. 详解文本分类之多通道CNN的理论与实践
  11. 2×125MW发电厂升压站电气部分设计
  12. python小玩意——敏感词汇检测
  13. 知其然,知其所以然!
  14. 移动app用户体验与性能优化
  15. 关于同构关系的一些证明(1)
  16. 民航票务管理系统-C语言--录入,查询,订票,退票,修改航班信息以及主菜单和子菜单。
  17. mac电脑无法识别移动硬盘怎么解决?看过来!
  18. Myeclipse反向工程后造成的SQL syntax
  19. Pyghon学习记录
  20. Vue slot-scope的理解(适合初学者)

热门文章

  1. 解放你内心的自然领袖,从你的内心而非你的自我来领导你自己
  2. Python环境变量设置
  3. PHP Session变量
  4. Redis 存储字符串和对象
  5. SQLServer内置函数
  6. C#代码与javaScript函数的相互调用
  7. Rational Purify 使用及分析实例(转载)
  8. 谈谈IT界8大恐怖预言!
  9. 使用vscode调试Nodejs
  10. Atitit apache 和guava的反射工具