摘要:整理一下,完整的函數(shù)長(zhǎng)這樣批量運(yùn)行上述的步驟僅僅能夠下載第一個(gè)壁紙列表頁(yè)的第一張壁紙。
項(xiàng)目地址:https://github.com/jrainlau/w...
前言好久沒(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)建依賴(lài)目錄:
echo bs4 lxml requests > requirements.txt
最后yun下載安裝依賴(lài)即可:
pip3 install -r requirements.txt分析爬蟲(chóng)工作步驟
為了簡(jiǎn)單起見(jiàn),我們直接進(jìn)入分類(lèi)為“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è)專(zhuān)門(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" return BeautifulSoup(r.text, "lxml")
為了防止被網(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") return [link.get("href") for link in links]
這個(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 = [{ "size": eval(link.get_text().replace("x", "*")), "name": link.get("href").replace("/download/", ""), "url": link.get("href") } for link in wallpaper_size_links]
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 = [{ "size": eval(link.get_text().replace("x", "*")), "name": link.get("href").replace("/download/", ""), "url": link.get("href") } for link in wallpaper_size_links] 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)著壁紙分類(lèi),起始頁(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 = [{ "size": eval(link.get_text().replace("x", "*")), "name": link.get("href").replace("/download/", ""), "url": link.get("href") } for link in wallpaper_size_links] 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! ") 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)心壁紙荒啦!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/41291.html
摘要:爬取分辨率超清唯美壁紙簡(jiǎn)介壁紙的選擇其實(shí)很大程度上能看出電腦主人的內(nèi)心世界,有的人喜歡風(fēng)景,有的人喜歡星空,有的人喜歡美女,有的人喜歡動(dòng)物。 @[toc] 爬取5K分辨率超清唯美壁紙 簡(jiǎn)介 壁紙的選擇其實(shí)很大程度上能看出電腦主人的內(nèi)心世界,有的人喜歡風(fēng)景,有的人喜歡星空,有的人喜歡美女,有的人喜歡動(dòng)物。然而,終究有一天你已經(jīng)產(chǎn)生審美疲勞了,但你下定決定要換壁紙的時(shí)候,又發(fā)現(xiàn)網(wǎng)上的壁紙要...
摘要:愛(ài)美之心人皆有之,正所謂窈窕淑女君子好逑,美好敲代碼的一天從好看的桌面壁紙開(kāi)始,好看的桌面壁紙從美女壁紙開(kāi)始。 大家好,我是辣條,這是我爬蟲(chóng)系列的第26篇。 愛(ài)美之心人皆有之,正所謂窈窕淑女君子好逑,美好敲代碼的一天從好看的桌面壁紙開(kāi)始,好看的桌面壁紙從美女壁紙開(kāi)始。今天給大家?guī)?lái)福利啦,爬...
摘要:沒(méi)有結(jié)果返回百度搜索的可以指定頁(yè)碼,最多一頁(yè)個(gè),使用后有效減少了連接次數(shù)。但親測(cè)下來(lái)設(shè)置過(guò)以后的結(jié)果與實(shí)際用戶(hù)在百度搜索的結(jié)果排序和個(gè)數(shù)都有出入。 showImg(https://segmentfault.com/img/bVbnA0I?w=1280&h=787); 一直有一個(gè)需求,希望看到自己網(wǎng)站在百度的實(shí)時(shí)的排名用過(guò)一些工具,要么反應(yīng)遲鈍,要么結(jié)果不準(zhǔn)確或不實(shí)時(shí)于是打算用jsoup...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
閱讀 818·2023-04-25 20:18
閱讀 2099·2021-11-22 13:54
閱讀 2543·2021-09-26 09:55
閱讀 3910·2021-09-22 15:28
閱讀 2980·2021-09-03 10:34
閱讀 1716·2021-07-28 00:15
閱讀 1640·2019-08-30 14:25
閱讀 1286·2019-08-29 17:16