写于 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 代码实现壁纸批量下载相关推荐

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

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

  2. python读取文件第n行-Python读取文件后n行的代码示例

    这篇文章主要介绍了Python实现读取文件最后n行的方法,涉及Python针对文件的读取.遍历与运算相关操作技巧,需要的朋友可以参考下# -*- coding:utf8-*- import os im ...

  3. python自动化--如何用10行Python代码调一个闹钟 #电脑调闹钟

    python自动化--如何用10行Python代码写一个闹钟 前言: 文末彩蛋--轻松一刻 更多关于Python的知识请加关注哟~~.若需联系博主请私信或者加博主联系方式:       QQ:1542 ...

  4. python壁纸数据抓取_70行python代码实现壁纸批量下载

    注意:本文所属项目仅用于python学习,严禁作为其他用途使用! 初始化项目 项目使用了virtualenv来创建一个虚拟环境,避免污染全局.使用pip3直接下载即可: pip3 install vi ...

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

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

  6. python代码壁纸-70行python代码实现壁纸批量下载

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

  7. python 爬取财经新闻股票_70行python代码爬取新浪财经中股票历史成交明细

    70行python代码爬取新浪财经中股票历史成交明细 发布时间:2018-07-28 01:55, 浏览次数:635 , 标签: python 最近在研究股票量化,想从每笔成交的明细着手,但历史数据的 ...

  8. python实现直播功能rtmo_30 行 Python 代码实现 Twitch 主播上线实时通知

    在 freeCodeCamp 社区阅读原文. 大家好 :) 今天我将开始写作一个新的文章系列,特别面向 Python 初学者.简言之,我将会尝试更多新的工具,编写尽可能少的代码,来完成一个有趣的项目. ...

  9. 用python画动态樱花_利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白...

    利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白 此处感谢知乎大佬 小白练手 练习一下比较流行的turtle(海龟库) 画一棵漂亮的樱花树,效果如下: ps: 是动态 ...

最新文章

  1. 【OpenCV3】将图像指定区域使用另一图像(或ROI)覆盖
  2. Condition接口详解
  3. Python的魔法方法 .
  4. c语言 tcl.exe 自动登录,Tcl命令操作实验-----(3)---字符串
  5. 基于Android Classic Bluetooth的蓝牙聊天软件
  6. oracle 改变受限模式,oracle之受限模式修改
  7. iOS-项目开发1-UIImage
  8. springboot 添加 lombok 报错更新 版本号
  9. QEMU学习笔记——QOM(Qemu Object Model)
  10. AI人工智能仿写在线v.1.2.3
  11. 如何解决CAN FD与CAN网络共存问题
  12. Java内存模型—JMM详解
  13. android 倒计时类,Android倒计时工具类
  14. 电感电容之开关电源的原理
  15. 4G模组EC20在使用电信物联网专用卡时无信号问题
  16. SSL证书怎么部署,SSL证书需要怎么安装你知道吗?
  17. 一次手动查杀永恒之蓝病毒木马文件
  18. A095_day01_微信小程序入门与组件
  19. 为什么互联网人不说“人话”?
  20. 75个最佳网络安全工具

热门文章

  1. 2.5 知识点 pri文件有啥用
  2. Android热更新十:自己写一个Android热修复
  3. Android源代码编译的准备工作
  4. Linux端的qbittorrent目录,qBittorrent v4.3.0.10便携增强版-BT/磁力下载软件
  5. 最能激发员工的不是薪水,而是成就感
  6. 【30天从入门到放弃】我的机器学习之路 4
  7. 图片批量压缩工具哪个好用?这3个工具可以解决你的压缩烦恼
  8. 【强行点出机械师天赋,修复无脸男储钱罐】
  9. 小米有品5月12日上线了首款挂耳咖啡——龢言挂耳咖啡
  10. NOI2002银河英雄传说——带权并查集