python实现壁纸批量下载代码实例
项目地址:https://github.com/jrainlau/wallpaper-downloader 前言 好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python。这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁纸。 注意:本文所属项目仅用于python学习,严禁作为其他用途使用! 初始化项目 项目使用了 pip3 install virtualenv 然后在合适的地方新建一个 virtualenv venv . venv/bin/activate 接下来创建依赖目录: echo bs4 lxml requests > requirements.txt 最后yun下载安装依赖即可: pip3 install -r requirements.txt 分析爬虫工作步骤 为了简单起见,我们直接进入分类为“aero”的壁纸列表页:http://wallpaperswide.com/aer...。 可以看到,这一页里面一共有10张可供下载的壁纸。但是由于这里显示的都是缩略图,作为壁纸来说清晰度是远远不够的,所以我们需要进入壁纸详情页,去找到高清的下载链接。从第一张壁纸点进去,可以看到一个新的页面: 因为我机器是Retina屏幕,所以我打算直接下载体积最大的那个以保证高清(红圈所示体积)。 了解了具体的步骤以后,就是通过开发者工具找到对应的dom节点,提取相应的url即可,这个过程就不再展开了,读者自行尝试即可,下面进入编码部分。 访问页面 新建一个 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都对应着一个链接: 所以第一步,就是把这些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 })
获取了所有的集合之后,就可以使用 biggest_one = max(size_list,key = lambda item: item['size']) 这个 result = requests.get(PAGE_DOMAIN + biggest_one['url']) if result.status_code == 200: open('wallpapers/' + biggest_one['name'],'wb').write(result.content) 注意,首先你需要在根目录下创建一个 整理一下,完整的 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','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() 这里通过获取命令行参数,指定了三个常量 为了方便起见,再定义两个url相关的常量: PAGE_DOMAIN = 'http://wallpaperswide.com' PAGE_URL = 'http://wallpaperswide.com/' + category + '-desktop-wallpapers/page/' 接下来就可以愉快地进行批量操作了,在此之前我们来定义一个 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) 然后把之前的 def download_wallpaper(link,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',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!nn') callback() 最后指定一下启动规则: if __name__ == '__main__': start() 运行项目 在命令行输入如下代码开始测试: python3 download.py aero 1 2 然后可以看到下列输出: 拿charles抓一下包,可以看到正在脚本正在平稳地运行中: 此时,下载脚本已经开发完毕,终于不用担心壁纸荒啦! 以上就是本次为大家整理的全部内容,大家有任何疑问可以在下方的留言区讨论,感谢你对编程小技巧的支持。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |