摘要:整理一下,完整的函數長這樣批量運行上述的步驟僅僅能夠下載第一個壁紙列表頁的第一張壁紙。
項目地址:https://github.com/jrainlau/w...
前言好久沒有寫文章了,因為最近都在適應新的崗位,以及利用閑暇時間學習python。這篇文章是最近的一個python學習階段性總結,開發了一個爬蟲批量下載某壁紙網站的高清壁紙。
注意:本文所屬項目僅用于python學習,嚴禁作為其他用途使用!初始化項目
項目使用了virtualenv來創建一個虛擬環境,避免污染全局。使用pip3直接下載即可:
pip3 install virtualenv
然后在合適的地方新建一個wallpaper-downloader目錄,使用virtualenv創建名為venv的虛擬環境:
virtualenv venv . venv/bin/activate
接下來創建依賴目錄:
echo bs4 lxml requests > requirements.txt
最后yun下載安裝依賴即可:
pip3 install -r requirements.txt分析爬蟲工作步驟
為了簡單起見,我們直接進入分類為“aero”的壁紙列表頁:http://wallpaperswide.com/aer...。
可以看到,這一頁里面一共有10張可供下載的壁紙。但是由于這里顯示的都是縮略圖,作為壁紙來說清晰度是遠遠不夠的,所以我們需要進入壁紙詳情頁,去找到高清的下載鏈接。從第一張壁紙點進去,可以看到一個新的頁面:
因為我機器是Retina屏幕,所以我打算直接下載體積最大的那個以保證高清(紅圈所示體積)。
了解了具體的步驟以后,就是通過開發者工具找到對應的dom節點,提取相應的url即可,這個過程就不再展開了,讀者自行嘗試即可,下面進入編碼部分。
訪問頁面新建一個download.py文件,然后引入兩個庫:
from bs4 import BeautifulSoup import requests
接下來,編寫一個專門用于訪問url,然后返回頁面html的函數:
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")
為了防止被網站反爬機制擊中,所以我們需要通過在header添加UA把爬蟲偽裝成正常的瀏覽器,然后指定utf-8編碼,最后返回字符串格式的html。
提取鏈接在獲取了頁面的html以后,就需要提取這個頁面壁紙列表所對應的url了:
def get_paper_link(page): links = page.select("#content > div > ul > li > div > div a") return [link.get("href") for link in links]
這個函數會把列表頁所有壁紙詳情的url給提取出來。
下載壁紙有了詳情頁的地址以后,我們就可以進去挑選合適的size了。在對頁面的dom結構分析后可以知道,每一個size都對應著一個鏈接:
所以第一步,就是把這些size對應的鏈接提取出來:
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就是這些鏈接的一個集合。為了方便接下來選出最高清(體積最大)的壁紙,在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)
注意,首先你需要在根目錄下創建一個wallpapers目錄,否則運行時會報錯。
整理一下,完整的download_wallpaper函數長這樣:
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)批量運行
上述的步驟僅僅能夠下載第一個壁紙列表頁的第一張壁紙。如果我們想下載多個列表頁的全部壁紙,我們就需要循環調用這些方法。首先我們定義幾個常量:
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()
這里通過獲取命令行參數,指定了三個常量category, page_start和page_end,分別對應著壁紙分類,起始頁頁碼,終止頁頁碼。
為了方便起見,再定義兩個url相關的常量:
PAGE_DOMAIN = "http://wallpaperswide.com" PAGE_URL = "http://wallpaperswide.com/" + category + "-desktop-wallpapers/page/"
接下來就可以愉快地進行批量操作了,在此之前我們來定義一個start()啟動函數:
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函數再改寫一下:
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()
最后指定一下啟動規則:
if __name__ == "__main__": start()運行項目
在命令行輸入如下代碼開始測試:
python3 download.py aero 1 2
然后可以看到下列輸出:
拿charles抓一下包,可以看到腳本正在平穩地運行中:
此時,下載腳本已經開發完畢,終于不用擔心壁紙荒啦!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41291.html
摘要:爬取分辨率超清唯美壁紙簡介壁紙的選擇其實很大程度上能看出電腦主人的內心世界,有的人喜歡風景,有的人喜歡星空,有的人喜歡美女,有的人喜歡動物。 @[toc] 爬取5K分辨率超清唯美壁紙 簡介 壁紙的選擇其實很大程度上能看出電腦主人的內心世界,有的人喜歡風景,有的人喜歡星空,有的人喜歡美女,有的人喜歡動物。然而,終究有一天你已經產生審美疲勞了,但你下定決定要換壁紙的時候,又發現網上的壁紙要...
摘要:愛美之心人皆有之,正所謂窈窕淑女君子好逑,美好敲代碼的一天從好看的桌面壁紙開始,好看的桌面壁紙從美女壁紙開始。 大家好,我是辣條,這是我爬蟲系列的第26篇。 愛美之心人皆有之,正所謂窈窕淑女君子好逑,美好敲代碼的一天從好看的桌面壁紙開始,好看的桌面壁紙從美女壁紙開始。今天給大家帶來福利啦,爬...
摘要:沒有結果返回百度搜索的可以指定頁碼,最多一頁個,使用后有效減少了連接次數。但親測下來設置過以后的結果與實際用戶在百度搜索的結果排序和個數都有出入。 showImg(https://segmentfault.com/img/bVbnA0I?w=1280&h=787); 一直有一個需求,希望看到自己網站在百度的實時的排名用過一些工具,要么反應遲鈍,要么結果不準確或不實時于是打算用jsoup...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
閱讀 811·2023-04-25 20:18
閱讀 2092·2021-11-22 13:54
閱讀 2527·2021-09-26 09:55
閱讀 3857·2021-09-22 15:28
閱讀 2969·2021-09-03 10:34
閱讀 1710·2021-07-28 00:15
閱讀 1629·2019-08-30 14:25
閱讀 1281·2019-08-29 17:16