python實(shí)現(xiàn)壁紙批量下載代碼實(shí)例
項(xiàng)目地址:https://github.com/jrainlau/wallpaper-downloader
前言
好久沒(méi)有寫(xiě)文章了,因?yàn)樽罱荚谶m應(yīng)新的崗位,以及利用閑暇時(shí)間學(xué)習(xí)python。這篇文章是最近的一個(gè)python學(xué)習(xí)階段性總結(jié),開(kāi)發(fā)了一個(gè)爬蟲(chóng)批量下載某壁紙網(wǎng)站的高清壁紙。
注意:本文所屬項(xiàng)目?jī)H用于python學(xué)習(xí),嚴(yán)禁作為其他用途使用!
初始化項(xiàng)目
項(xiàng)目使用了virtualenv來(lái)創(chuàng)建一個(gè)虛擬環(huán)境,避免污染全局。使用pip3直接下載即可:
pip3 install virtualenv
然后在合適的地方新建一個(gè)wallpaper-downloader目錄,使用virtualenv創(chuàng)建名為venv的虛擬環(huán)境:
virtualenv venv . venv/bin/activate
接下來(lái)創(chuàng)建依賴目錄:
echo bs4 lxml requests > requirements.txt
最后yun下載安裝依賴即可:
pip3 install -r requirements.txt
分析爬蟲(chóng)工作步驟
為了簡(jiǎn)單起見(jiàn),我們直接進(jìn)入分類為“aero”的壁紙列表頁(yè):http://wallpaperswide.com/aer...。

可以看到,這一頁(yè)里面一共有10張可供下載的壁紙。但是由于這里顯示的都是縮略圖,作為壁紙來(lái)說(shuō)清晰度是遠(yuǎn)遠(yuǎn)不夠的,所以我們需要進(jìn)入壁紙?jiān)斍轫?yè),去找到高清的下載鏈接。從第一張壁紙點(diǎn)進(jìn)去,可以看到一個(gè)新的頁(yè)面:

因?yàn)槲覚C(jī)器是Retina屏幕,所以我打算直接下載體積最大的那個(gè)以保證高清(紅圈所示體積)。
了解了具體的步驟以后,就是通過(guò)開(kāi)發(fā)者工具找到對(duì)應(yīng)的dom節(jié)點(diǎn),提取相應(yīng)的url即可,這個(gè)過(guò)程就不再展開(kāi)了,讀者自行嘗試即可,下面進(jìn)入編碼部分。
訪問(wèn)頁(yè)面
新建一個(gè)download.py文件,然后引入兩個(gè)庫(kù):
from bs4 import BeautifulSoup import requests
接下來(lái),編寫(xiě)一個(gè)專門(mén)用于訪問(wèn)url,然后返回頁(yè)面html的函數(shù):
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
為了防止被網(wǎng)站反爬機(jī)制擊中,所以我們需要通過(guò)在header添加UA把爬蟲(chóng)偽裝成正常的瀏覽器,然后指定utf-8編碼,最后返回字符串格式的html。
提取鏈接
在獲取了頁(yè)面的html以后,就需要提取這個(gè)頁(yè)面壁紙列表所對(duì)應(yīng)的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
這個(gè)函數(shù)會(huì)把列表頁(yè)所有壁紙?jiān)斍榈膗rl給提取出來(lái)。
下載壁紙
有了詳情頁(yè)的地址以后,我們就可以進(jìn)去挑選合適的size了。在對(duì)頁(yè)面的dom結(jié)構(gòu)分析后可以知道,每一個(gè)size都對(duì)應(yīng)著一個(gè)鏈接:

所以第一步,就是把這些size對(duì)應(yīng)的鏈接提取出來(lái):
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就是這些鏈接的一個(gè)集合。為了方便接下來(lái)選出最高清(體積最大)的壁紙,在size中我使用了eval方法,直接把這里的5120x3200給計(jì)算出來(lái),作為size的值。
獲取了所有的集合之后,就可以使用max()方法選出最高清的一項(xiàng)出來(lái)了:
biggest_one = max(size_list, key = lambda item: item['size'])
這個(gè)biggest_one當(dāng)中的url就是對(duì)應(yīng)size的下載鏈接,接下來(lái)只需要通過(guò)requests庫(kù)把鏈接的資源下載下來(lái)即可:
result = requests.get(PAGE_DOMAIN + biggest_one['url'])
if result.status_code == 200:
open('wallpapers/' + biggest_one['name'], 'wb').write(result.content)
注意,首先你需要在根目錄下創(chuàng)建一個(gè)wallpapers目錄,否則運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。
整理一下,完整的download_wallpaper函數(shù)長(zhǎng)這樣:
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)
批量運(yùn)行
上述的步驟僅僅能夠下載第一個(gè)壁紙列表頁(yè)的第一張壁紙。如果我們想下載多個(gè)列表頁(yè)的全部壁紙,我們就需要循環(huán)調(diào)用這些方法。首先我們定義幾個(gè)常量:
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()
這里通過(guò)獲取命令行參數(shù),指定了三個(gè)常量category, page_start和page_end,分別對(duì)應(yīng)著壁紙分類,起始頁(yè)頁(yè)碼,終止頁(yè)頁(yè)碼。
為了方便起見(jiàn),再定義兩個(gè)url相關(guān)的常量:
PAGE_DOMAIN = 'http://wallpaperswide.com' PAGE_URL = 'http://wallpaperswide.com/' + category + '-desktop-wallpapers/page/'
接下來(lái)就可以愉快地進(jìn)行批量操作了,在此之前我們來(lái)定義一個(gè)start()啟動(dòng)函數(shù):
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函數(shù)再改寫(xiě)一下:
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()
最后指定一下啟動(dòng)規(guī)則:
if __name__ == '__main__': start()
運(yùn)行項(xiàng)目
在命令行輸入如下代碼開(kāi)始測(cè)試:
python3 download.py aero 1 2
然后可以看到下列輸出:

拿charles抓一下包,可以看到正在腳本正在平穩(wěn)地運(yùn)行中:

此時(shí),下載腳本已經(jīng)開(kāi)發(fā)完畢,終于不用擔(dān)心壁紙荒啦!
以上就是本次為大家整理的全部?jī)?nèi)容,大家有任何疑問(wèn)可以在下方的留言區(qū)討論,感謝你對(duì)腳本之家的支持。
- Python實(shí)現(xiàn)壁紙下載與輪換
- Python 下載Bing壁紙的示例
- 編寫(xiě)Python腳本批量下載DesktopNexus壁紙的教程
- python批量下載壁紙的實(shí)現(xiàn)代碼
- python Requsets下載開(kāi)源網(wǎng)站的代碼(帶索引 數(shù)據(jù))
- 用Python自動(dòng)下載網(wǎng)站所有文件
- python 制作網(wǎng)站小說(shuō)下載器
- python批量下載網(wǎng)站馬拉松照片的完整步驟
- python抓取網(wǎng)站的圖片并下載到本地的方法
- Python 批量下載陰陽(yáng)師網(wǎng)站壁紙
相關(guān)文章
Django跨域請(qǐng)求無(wú)法傳遞Cookie的解決
這篇文章主要介紹了Django跨域請(qǐng)求無(wú)法傳遞Cookie的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
Python接口自動(dòng)化之淺析requests模塊get請(qǐng)求
這篇文章主要介紹了requests模塊get請(qǐng)求,在Python語(yǔ)言中,雖然提供了urllib2和urllib的庫(kù),但是相比較而言,Requests仍然是實(shí)現(xiàn)接口測(cè)試最好的選擇,因?yàn)樗怯闷饋?lái)更加簡(jiǎn)便2021-08-08
Python中uuid模塊生成唯一標(biāo)識(shí)符的方法詳解
這篇文章主要給大家介紹了關(guān)于Python中uuid模塊生成唯一標(biāo)識(shí)符的相關(guān)資料,uuid庫(kù)是Python標(biāo)準(zhǔn)庫(kù)中的一個(gè)功能強(qiáng)大的庫(kù),可以用于生成全局唯一標(biāo)識(shí)符(UUID),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
python pandas cumsum求累計(jì)次數(shù)的用法
這篇文章主要介紹了python pandas cumsum求累計(jì)次數(shù)的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
何用Python實(shí)現(xiàn)一個(gè) “系統(tǒng)聲音” 的實(shí)時(shí)律動(dòng)掛件
這篇文章將給大家介紹了如何用 Python 實(shí)現(xiàn)一個(gè) “系統(tǒng)聲音” 的實(shí)時(shí)律動(dòng)掛件,采集后直接實(shí)時(shí)地在電腦上繪制波形動(dòng)畫(huà),主要是用來(lái)作為 FL Studio 播放時(shí)的一個(gè)桌面小掛件,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-01-01
Python數(shù)據(jù)處理之savetxt()和loadtxt()使用詳解
這篇文章主要介紹了Python數(shù)據(jù)處理之savetxt()和loadtxt()使用詳解,NumPy提供了多種存取數(shù)組內(nèi)容的文件操作函數(shù),保存數(shù)組數(shù)據(jù)的文件可以是二進(jìn)制格式或者文本格式,今天我們來(lái)看看savetxt()和loadtxt()的用法,需要的朋友可以參考下2023-08-08
python導(dǎo)入坐標(biāo)點(diǎn)的具體操作
在本篇文章里小編給大家分享了關(guān)于python導(dǎo)入坐標(biāo)點(diǎn)的具體操作步驟和圖解,有需要的朋友們跟著學(xué)習(xí)下。2019-05-05

