您好,登錄后才能下訂單哦!
這篇“python怎么實現壁紙批量下載”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“python怎么實現壁紙批量下載”文章吧。
初始化項目
該項目使用virtualenv創建一個虛擬環境,以避免污染整個情況。使用pip3直接下載:
Pip3installvirtualenv然后在合適的地方創建一個新的壁紙-下載器目錄,使用virtualenv創建一個名為venv的虛擬環境:
virtualenvvenv。venv/bin/激活下一步,創建一個依賴目錄:
最后,yun下載并安裝依賴項:
pip 3 install-requirements . txt分析爬蟲工作步驟
為了簡單起見,我們直接進入分類為“航空”的壁紙列表頁面
如您所見,本頁有10張壁紙可供下載。但是因為這里顯示的都是縮略圖,作為壁紙的定義遠遠不夠,所以需要進入壁紙詳情頁才能找到HD的下載鏈接。點擊第一張壁紙,你可以看到一個新的頁面:
因為我的機器是Retina屏幕,所以打算直接下載最大的,保證高清(紅圈顯示的音量)。
了解具體步驟后,就是通過開發者工具找到對應的dom節點,提取對應的url。這個過程不再進行,讀者可以自行嘗試。接下來,輸入編碼部分。
訪問頁面
創建一個新的download.py文件,然后引入兩個庫:
from bs4 import美化組
導入請求接下來,編寫一個訪問url然后返回頁面html的特殊函數:
defvisit_page(url):
標題={
用戶代理' : ' Mozilla/5.0(Macintosh;intelmacosx 10 _ 13 _ 1)apple WebKit/537.36(KHTML,like gecko)Chrome/63 . 0 . 3239 . 108 safari/537.36’
}
r=requests.get(url,headers=headers)
r.encoding='utf-8 '
soup=美化組(r.text,' lxml ')
為了防止returnsoup被網站的反抓取機制擊中,我們需要通過在頭部添加UA來將爬蟲偽裝成普通瀏覽器,然后指定utf-8編碼,最后以字符串格式返回html。
提取鏈接
獲取頁面html后,需要提取該頁面壁紙列表對應的url:
defget_paper_link(第:頁)
links=page . select(# contentidivullidiva)
collect=[]
forlinkinlinks:
collect.append(link.get('href '))
函數returncollect將提取列表頁面中所有壁紙詳細信息的url。
下載壁紙
有了詳細頁面的地址,我們就可以進去選擇合適的尺寸。分析頁面的dom結構后,我們可以知道每個大小對應一個鏈接:
所以第一步是提取對應于這些大小的鏈接:
墻
paper_source=visit_page(link) wallpaper_size_links=wallpaper_source.select('#wallpaper-resolutions>a') size_list=[] forlinkinwallpaper_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=lambdaitem:item['size'])
這個biggest_one
當中的url
就是對應size的下載鏈接,接下來只需要通過requests
庫把鏈接的資源下載下來即可:
result=requests.get(PAGE_DOMAIN+biggest_one['url']) ifresult.status_code==200: open('wallpapers/'+biggest_one['name'],'wb').write(result.content)
注意,首先你需要在根目錄下創建一個wallpapers
目錄,否則運行時會報錯。
整理一下,完整的download_wallpaper
函數長這樣:
defdownload_wallpaper(link): wallpaper_source=visit_page(PAGE_DOMAIN+link) wallpaper_size_links=wallpaper_source.select('#wallpaper-resolutions>a') size_list=[] forlinkinwallpaper_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=lambdaitem:item['size']) print('Downloadingthe'+str(index+1)+'/'+str(total)+'wallpaper:'+biggest_one['name']) result=requests.get(PAGE_DOMAIN+biggest_one['url']) ifresult.status_code==200: open('wallpapers/'+biggest_one['name'],'wb').write(result.content)
批量運行
上述的步驟僅僅能夠下載第一個壁紙列表頁的第一張壁紙。如果我們想下載多個列表頁的全部壁紙,我們就需要循環調用這些方法。首先我們定義幾個常量:
importsys iflen(sys.argv)!=4: print('3argumentswererequiredbutonlyfind'+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('Thesecondandthirdargumentsmustbeanumberbutnotastring!') exit()
這里通過獲取命令行參數,指定了三個常量category
, page_start
和page_end
,分別對應著壁紙分類,起始頁頁碼,終止頁頁碼。
為了方便起見,再定義兩個url相關的常量:
PAGE_DOMAIN='http://wallpaperswide.com' PAGE_URL='http://wallpaperswide.com/'+category+'-desktop-wallpapers/page/'
接下來就可以愉快地進行批量操作了,在此之前我們來定義一個start()
啟動函數:
defstart(): ifpage_start[0]<=page_end: print('Preparingtodownloadthe'+str(page_start[0])+'pageofallthe"'+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 forindex,linkinenumerate(WALLPAPER_LINKS): download_wallpaper(link,index,len(WALLPAPER_LINKS),start)
然后把之前的download_wallpaper
函數再改寫一下:
defdownload_wallpaper(link,index,total,callback): wallpaper_source=visit_page(PAGE_DOMAIN+link) wallpaper_size_links=wallpaper_source.select('#wallpaper-resolutions>a') size_list=[] forlinkinwallpaper_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=lambdaitem:item['size']) print('Downloadingthe'+str(index+1)+'/'+str(total)+'wallpaper:'+biggest_one['name']) result=requests.get(PAGE_DOMAIN+biggest_one['url']) ifresult.status_code==200: open('wallpapers/'+biggest_one['name'],'wb').write(result.content) ifindex+1==total: print('Downloadcompleted!\n\n') callback()
最后指定一下啟動規則:
if__name__=='__main__': start()
運行項目
在命令行輸入如下代碼開始測試:
python3download.pyaero12
然后可以看到下列輸出:
拿charles抓一下包,可以看到正在腳本正在平穩地運行中:
以上就是關于“python怎么實現壁紙批量下載”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。