python如何實(shí)現(xiàn)壁紙批量下載-創(chuàng)新互聯(lián)

這篇文章主要介紹python如何實(shí)現(xiàn)壁紙批量下載,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、網(wǎng)站設(shè)計(jì)、信豐網(wǎng)絡(luò)推廣、小程序制作、信豐網(wǎng)絡(luò)營(yíng)銷、信豐企業(yè)策劃、信豐品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供信豐建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:muchs.cn

前言

好久沒(méi)有寫文章了,因?yàn)樽罱荚谶m應(yīng)新的崗位,以及利用閑暇時(shí)間學(xué)習(xí)python。這篇文章是最近的一個(gè)python學(xué)習(xí)階段性總結(jié),開發(fā)了一個(gè)爬蟲批量下載某壁紙網(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

分析爬蟲工作步驟

為了簡(jiǎn)單起見(jiàn),我們直接進(jìn)入分類為“aero”的壁紙列表頁(yè):http://wallpaperswide.com/aer...。

python如何實(shí)現(xiàn)壁紙批量下載

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

python如何實(shí)現(xiàn)壁紙批量下載

因?yàn)槲覚C(jī)器是Retina屏幕,所以我打算直接下載體積大的那個(gè)以保證高清(紅圈所示體積)。

了解了具體的步驟以后,就是通過(guò)開發(fā)者工具找到對(duì)應(yīng)的dom節(jié)點(diǎn),提取相應(yīng)的url即可,這個(gè)過(guò)程就不再展開了,讀者自行嘗試即可,下面進(jìn)入編碼部分。

訪問(wèn)頁(yè)面

新建一個(gè)download.py文件,然后引入兩個(gè)庫(kù):

from bs4 import BeautifulSoup
import requests

接下來(lái),編寫一個(gè)專門用于訪問(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把爬蟲偽裝成正常的瀏覽器,然后指定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è)鏈接:

python如何實(shí)現(xiàn)壁紙批量下載

所以第一步,就是把這些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_startpage_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ù)再改寫一下:

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)目

在命令行輸入如下代碼開始測(cè)試:

python3 download.py aero 1 2

然后可以看到下列輸出:

python如何實(shí)現(xiàn)壁紙批量下載

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

python如何實(shí)現(xiàn)壁紙批量下載

此時(shí),下載腳本已經(jīng)開發(fā)完畢,終于不用擔(dān)心壁紙荒啦!

以上是“python如何實(shí)現(xiàn)壁紙批量下載”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站欄目:python如何實(shí)現(xiàn)壁紙批量下載-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)鏈接:http://muchs.cn/article28/degejp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)頁(yè)設(shè)計(jì)公司、App設(shè)計(jì)網(wǎng)站內(nèi)鏈、企業(yè)網(wǎng)站制作做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司