当前位置:主页 > python教程 > python实现壁纸批量下载代码实例

python实现壁纸批量下载的方法详解

发布:2019-12-20 11:39:07 65


给网友朋友们带来一篇python批量下载相关的编程文章,网友芮德水根据主题投稿了本篇教程内容,涉及到python、批量下载、python实现壁纸批量下载代码实例相关内容,已被956网友关注,如果对知识点想更进一步了解可以在下方电子资料中获取。

python实现壁纸批量下载代码实例

项目地址:https://github.com/jrainlau/wallpaper-downloader

前言

好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习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”的壁纸列表页:http://wallpaperswide.com/aer...。

python实现壁纸批量下载代码实例

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

python实现壁纸批量下载代码实例

因为我机器是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'
 soup = BeautifulSoup(r.text, 'lxml')
 return soup

为了防止被网站反爬机制击中,所以我们需要通过在header添加UA把爬虫伪装成正常的浏览器,然后指定utf-8编码,最后返回字符串格式的html。

提取链接

在获取了页面的html以后,就需要提取这个页面壁纸列表所对应的url了:

def get_paper_link(page):
 links = page.select('#content > div > ul > li > div > div a')
 collect = []
 for link in links:
  collect.append(link.get('href'))
 return collect

这个函数会把列表页所有壁纸详情的url给提取出来。

下载壁纸

有了详情页的地址以后,我们就可以进去挑选合适的size了。在对页面的dom结构分析后可以知道,每一个size都对应着一个链接:

python实现壁纸批量下载代码实例

所以第一步,就是把这些size对应的链接提取出来:

wallpaper_source = visit_page(link)
wallpaper_size_links = wallpaper_source.select('#wallpaper-resolutions > a')
size_list = []
for link in wallpaper_size_links:
 href = link.get('href')
 size_list.append({
  'size': eval(link.get_text().replace('x', '*')),
  'name': href.replace('/download/', ''),
  'url': href
 })

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 = []
 for link in wallpaper_size_links:
  href = link.get('href')
  size_list.append({
   'size': eval(link.get_text().replace('x', '*')),
   'name': href.replace('/download/', ''),
   'url': href
  })
 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_startpage_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 = []
 for link in wallpaper_size_links:
  href = link.get('href')
  size_list.append({
   'size': eval(link.get_text().replace('x', '*')),
   'name': href.replace('/download/', ''),
   'url': href
  })
 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

然后可以看到下列输出:

python实现壁纸批量下载代码实例

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

python实现壁纸批量下载代码实例

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

以上就是本次为大家整理的全部内容,大家有任何疑问可以在下方的留言区讨论,感谢你对码农之家的支持。


参考资料

相关文章

  • python读取相对路径和绝对路径的方法

    发布:2023-04-14

    这篇文章主要介绍了python读取相对路径和绝对路径,下面的路径介绍针对windows,在编写的py文件中打开文件的时候经常见到下面其中路径的表达方式,需要的朋友可以参考下


  • Python与PHP实现插入排序实例

    发布:2019-11-18

    下面小编就为大家带来一篇插入排序_Python与PHP的实现版(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧


  • 电脑从cmd中怎么进不去python

    发布:2021-05-24

    电脑cmd进不去Python可能是因为安装Python是没有进行环境变量的配置,从cmd中无法找到Python的安装路径,所以导致从cmd无法启动Python。只要在系统变量path后加上Python的安装路径就可以了。


  • Python基于jieba分词实现snownlp情感分析

    发布:2023-04-25

    情感分析(sentiment analysis)是2018年公布的计算机科学技术名词,它可以根据文本内容判断出所代表的含义是积极的还是负面的等。本文将通过jieba分词实现snownlp情感分析,感兴趣的可以了解一下


  • python学生管理系统id号不能重复典型问题

    发布:2019-07-05

    在本篇文章中小编给各位分享的是关于python学生管理系统id号不能重复典型问题以及相关代码内容,有兴趣的朋友们学习下。


  • Python之列表推导式最全汇总(下篇)

    发布:2023-03-05

    这篇文章主要介绍了Python之列表推导式最全汇总(下篇),本文章内容详细,通过案例可以更好的理解列表推导式的相关知识,本模块分为了三部分,本次为下篇,需要的朋友可以参考下


  • python 类对象和实例对象动态添加方法(分享)

    发布:2022-04-11

    下面小编就为大家分享一篇python 类对象和实例对象动态添加方法。具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧


  • Python输入字符串的方法和实例代码

    发布:2019-07-03

    输入使用input函数,字符串可以乘一个整数,表示重复几次,可以加另一个字符串,表示拼接。字符串内的\n\t默认被转义,如果在字符串之前加r,则它们不会被转义。


网友讨论