最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年01月25日 08:46:46   投稿:laozhang  
本篇文章通過代碼實(shí)例給大家分享了用python實(shí)現(xiàn)壁紙批量下載這個(gè)功能,有興趣的朋友參考下吧。

項(xiàng)目地址:https://github.com/jrainlau/wallpaper-downloader

前言

好久沒有寫文章了,因?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來創(chuàng)建一個(gè)虛擬環(huán)境,避免污染全局。使用pip3直接下載即可:

pip3 install virtualenv

然后在合適的地方新建一個(gè)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

分析爬蟲工作步驟

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

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

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

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

訪問頁(yè)面

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

from bs4 import BeautifulSoup
import requests

接下來,編寫一個(gè)專門用于訪問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ī)制擊中,所以我們需要通過在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給提取出來。

下載壁紙

有了詳情頁(yè)的地址以后,我們就可以進(jìn)去挑選合適的size了。在對(duì)頁(yè)面的dom結(jié)構(gòu)分析后可以知道,每一個(gè)size都對(duì)應(yīng)著一個(gè)鏈接:

所以第一步,就是把這些size對(duì)應(yīng)的鏈接提取出來:

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è)集合。為了方便接下來選出最高清(體積最大)的壁紙,在size中我使用了eval方法,直接把這里的5120x3200給計(jì)算出來,作為size的值。

獲取了所有的集合之后,就可以使用max()方法選出最高清的一項(xiàng)出來了:

biggest_one = max(size_list, key = lambda item: item['size'])

這個(gè)biggest_one當(dāng)中的url就是對(duì)應(yīng)size的下載鏈接,接下來只需要通過requests庫(kù)把鏈接的資源下載下來即可:

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

這里通過獲取命令行參數(shù),指定了三個(gè)常量category, page_startpage_end,分別對(duì)應(yīng)著壁紙分類,起始頁(yè)頁(yè)碼,終止頁(yè)頁(yè)碼。

為了方便起見,再定義兩個(gè)url相關(guān)的常量:

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

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

然后可以看到下列輸出:

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

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

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

相關(guān)文章

  • Scipy稀疏矩陣bsr_array的使用

    Scipy稀疏矩陣bsr_array的使用

    本文主要介紹了Scipy稀疏矩陣bsr_array的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 淺析Python中的套接字編程

    淺析Python中的套接字編程

    不可否認(rèn),互聯(lián)網(wǎng)已成為“存在之魂”,其活動(dòng)以“連接”或“網(wǎng)絡(luò)”為特征。使用套接字的最關(guān)鍵的基礎(chǔ)之一,使這些網(wǎng)絡(luò)成為可能。本文涵蓋了有關(guān)使用Python進(jìn)行套接字編程的所有領(lǐng)域。套接字可以幫助您建立這些連接,而Python無疑可以簡(jiǎn)化連接
    2021-06-06
  • 詳解Python中的type和object

    詳解Python中的type和object

    這篇文章主要介紹了Python中type和object的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • python實(shí)現(xiàn)數(shù)據(jù)庫(kù)跨服務(wù)器遷移

    python實(shí)現(xiàn)數(shù)據(jù)庫(kù)跨服務(wù)器遷移

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)數(shù)據(jù)庫(kù)之間的數(shù)據(jù)遷移,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 使用Python可視化支持向量機(jī)SVM

    使用Python可視化支持向量機(jī)SVM

    支持向量機(jī)是用于分類和回歸任務(wù)的強(qiáng)大監(jiān)督學(xué)習(xí)模型,本文我們將探索使用Python和流行的庫(kù)(如scikit-learn和Matplotlib)可視化SVM,有需要的可以了解下
    2024-11-11
  • pytest全局變量的使用詳解

    pytest全局變量的使用詳解

    全局變量是在函數(shù)外部定義的變量,所有函數(shù)內(nèi)部都可以使用這個(gè)變量,本文就來介紹一下pytest全局變量的使用,感興趣的可以了解一下
    2023-11-11
  • 詳解python變量的命名和使用

    詳解python變量的命名和使用

    變量名只能包含字母、數(shù)字和下劃線,本文主要介紹了詳解python變量的命名和使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • Python將列表中的元素轉(zhuǎn)化為數(shù)字并排序的示例

    Python將列表中的元素轉(zhuǎn)化為數(shù)字并排序的示例

    今天小編就為大家分享一篇Python將列表中的元素轉(zhuǎn)化為數(shù)字并排序的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python數(shù)據(jù)分析之線性回歸選擇基金

    python數(shù)據(jù)分析之線性回歸選擇基金

    這篇文章主要介紹了python數(shù)據(jù)分析之線性回歸選擇基金,文章基于前幾篇的文章內(nèi)容展開詳細(xì)的基金的趨勢(shì)分析,感興趣的小伙伴可以參考一下
    2022-05-05
  • python使用writerows寫csv文件產(chǎn)生多余空行的處理方法

    python使用writerows寫csv文件產(chǎn)生多余空行的處理方法

    這篇文章主要介紹了python使用writerows寫csv文件產(chǎn)生多余空行的處理方法,需要的朋友可以參考下
    2019-08-08

最新評(píng)論

额敏县| 临颍县| 遂平县| 恩平市| 九江县| 乡宁县| 临澧县| 石楼县| 庆安县| 雷州市| 肇庆市| 应城市| 潜江市| 精河县| 桐城市| 德阳市| 夹江县| 高雄县| 福泉市| 文安县| 明溪县| 如皋市| 朝阳市| 抚顺市| 德令哈市| 德兴市| 临高县| 宜丰县| 常宁市| 广丰县| 隆化县| 贞丰县| 邵武市| 林西县| 威远县| 清苑县| 潼关县| 宁都县| 平顺县| 姚安县| 广宗县|