亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python實現(xiàn)壁紙批量下載代碼實例

系統(tǒng) 1811 0

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

前言

好久沒有寫文章了,因為最近都在適應新的崗位,以及利用閑暇時間學習python。這篇文章是最近的一個python學習階段性總結,開發(fā)了一個爬蟲批量下載某壁紙網(wǎng)站的高清壁紙。

注意:本文所屬項目僅用于python學習,嚴禁作為其他用途使用!

初始化項目

項目使用了 virtualenv 來創(chuàng)建一個虛擬環(huán)境,避免污染全局。使用 pip3 直接下載即可:

            
pip3 install virtualenv
          

然后在合適的地方新建一個 wallpaper-downloader 目錄,使用 virtualenv 創(chuàng)建名為 venv 的虛擬環(huán)境:

            
virtualenv venv
. venv/bin/activate
          

接下來創(chuàng)建依賴目錄:

            
echo bs4 lxml requests > requirements.txt
          

最后yun下載安裝依賴即可:

            
pip3 install -r requirements.txt
          

分析爬蟲工作步驟

為了簡單起見,我們直接進入分類為“aero”的壁紙列表頁:http://wallpaperswide.com/aer...。

python實現(xiàn)壁紙批量下載代碼實例_第1張圖片

可以看到,這一頁里面一共有10張可供下載的壁紙。但是由于這里顯示的都是縮略圖,作為壁紙來說清晰度是遠遠不夠的,所以我們需要進入壁紙詳情頁,去找到高清的下載鏈接。從第一張壁紙點進去,可以看到一個新的頁面:

python實現(xiàn)壁紙批量下載代碼實例_第2張圖片

因為我機器是Retina屏幕,所以我打算直接下載體積最大的那個以保證高清(紅圈所示體積)。

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

訪問頁面

新建一個 download.py 文件,然后引入兩個庫:

            
from bs4 import BeautifulSoup
import requests
          

接下來,編寫一個專門用于訪問url,然后返回頁面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)站反爬機制擊中,所以我們需要通過在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
          

這個函數(shù)會把列表頁所有壁紙詳情的url給提取出來。

下載壁紙

有了詳情頁的地址以后,我們就可以進去挑選合適的size了。在對頁面的dom結構分析后可以知道,每一個size都對應著一個鏈接:

python實現(xiàn)壁紙批量下載代碼實例_第3張圖片

所以第一步,就是把這些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)

          

注意,首先你需要在根目錄下創(chuàng)建一個 wallpapers 目錄,否則運行時會報錯。

整理一下,完整的 download_wallpaper 函數(shù)長這樣:

            
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)
          

批量運行

上述的步驟僅僅能夠下載 第一個壁紙列表頁 第一張壁紙 。如果我們想下載 多個列表頁 全部壁紙 ,我們就需要循環(huán)調(diào)用這些方法。首先我們定義幾個常量:

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

這里通過獲取命令行參數(shù),指定了三個常量 category , page_start page_end ,分別對應著壁紙分類,起始頁頁碼,終止頁頁碼。

為了方便起見,再定義兩個url相關的常量:

            
PAGE_DOMAIN = 'http://wallpaperswide.com'
PAGE_URL = 'http://wallpaperswide.com/' + category + '-desktop-wallpapers/page/'
          

接下來就可以愉快地進行批量操作了,在此之前我們來定義一個 start() 啟動函數(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()
          

最后指定一下啟動規(guī)則:

            
if __name__ == '__main__':
  start()
          

運行項目

在命令行輸入如下代碼開始測試:

            
python3 download.py aero 1 2
          

然后可以看到下列輸出:

python實現(xiàn)壁紙批量下載代碼實例_第4張圖片

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

python實現(xiàn)壁紙批量下載代碼實例_第5張圖片

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

以上就是本次為大家整理的全部內(nèi)容,大家有任何疑問可以在下方的留言區(qū)討論,感謝你對腳本之家的支持。


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产综合精品在线 | 精品免费在线视频 | 可以看美女隐私的网站 | 久热在线视频精品网站 | 欧美另类videosbestv | 久久99国产亚洲高清观看首页 | 国产在线观看精品 | 精品国产系列 | 四虎精品永久在线网址 | 欧美在线成人午夜影视 | 看久久 | 不卡中文字幕在线观看 | 伊人久久波多野结衣中文字幕 | 高清国产性色视频在线 | 爱操视频在线观看 | 看一级特黄a大片日本片黑人 | 国产资源精品一区二区免费 | 欧美真人毛片动作视频 | 香蕉看片 | 伊人久久久综在合线久久在播 | 国产免费福利视频 | 奇米奇米色 | 四虎影视库永久在线地址 | 免费观看91视频 | 日韩欧美理论片 | 男女一级毛片 | 四虎影院永久免费 | 精品毛片免费看 | 天天摸天天操天天干 | 香蕉tv亚洲专区在线观看 | 欧美精品专区免费观看 | 久久99亚洲精品久久久久 | 成人免费观看www视频 | 九九影院理论片在线观看 | 久久亚洲热 | 欧美日韩国产成人综合在线影院 | 天天干夜夜爽 | 亚洲区一区 | 国产精品婷婷久久爽一下 | 婷婷在线观看视频 | 狠狠色丁香婷婷久久综合不卡 |