一、前言
pixiv網站是一個以插圖、漫畫和小說藝術為中心的虛擬社區網站。其初衷是為全球藝術家提供一個平台,發表他們作品,並透過評級系統反映用戶意見。該網站以用戶投稿的原創圖畫為中心,輔以標簽、書簽、作品回應、排行榜等功能形成具有其特色的社交網絡。
本文以pixiv站作為數據爬取對象,這里簡稱p站。本文工作內容主要可分為以下內容:
-
爬取p站月排行榜插畫原圖
-
自動打包壓縮插畫文件
-
實現郵件發送壓縮文件
編寫本文是因為我在爬取大量插畫后,希望把它發給手機端更換頭像,以及想分享好看的圖給好友(不得不說,p站的圖確實不少,而且原圖真的超清,之前我還想在哪里找好看又高清的電腦壁紙)。但是每次都需要自己手動壓縮,然后再一個個地發送壓縮包,難免覺得繁瑣,因此想着用通過python實現自動壓縮插畫文件然后郵件發送。
二、爬取網頁
由前文《從0實現python批量爬取p站插畫》可知,首先一個簡單的爬取網頁流程大致地分為三個部分,分別是指定請求url、設置headers、發起訪問請求。對p站月排行榜的插畫網頁部分進行數據爬取,首先已知月排行榜插畫部分的網頁地址,然后通過右鍵瀏覽器頁面或者按F12進入網頁inspect,查看network下面的XHR消息獲取個人user-agent。代碼實現如下:

運行成功后,可以看到目錄下生成rank.html文件,打開顯示如下內容:

由上圖可知排行榜的數據可以直接進行訪問得到。進入到rank.html文件保存的文件夾,選擇瀏覽器打開rank.html文件,顯示p站的插畫排行榜,可知p站月排行榜插畫部分的網頁內容爬取成功!
二、解析並構造數據
1、網頁解析
以上爬取p站月排行榜插畫網頁內容並下載到本地並不是本文的目的,而是開始批量爬取插畫的第一步。要批量爬取插畫,首先要對網頁本身進行分析並對爬取的網頁進行解析。使用瀏覽器打開下載的rank.html,然后按F12鍵或者右鍵第一章圖片選擇inspect檢查網頁,可顯示如下圖信息:

由上圖可知,所有的圖片都存放在一個class類名為`ranking-items-container`的div標簽內。每個圖片通過一個section標簽作為一個獨立的部分存放在div內,section標簽包含了該作品id、排名、標題、作者名等信息,里面嵌入的img標簽包含了該作品的縮略圖地址(注意了!!!這是構建插畫原圖地址的關鍵部分)、作者id等信息。這些信息構成了所要爬取插畫的重要線索,因此需要對爬取的網頁進行解析,獲取到包含插畫信息的所有section標簽。
網頁的解析主要有三種方式,分別是正則表達式、beautiful soup、xpath,詳細介紹與使用可以參照《python爬蟲入門總結》。xpath具有較強的通用性與高效性,這里通過該方式對網頁進行解析,關鍵代碼如下:

2、構造數據
通過上述對網頁進行分析,img標簽里面的data-src屬性的內容為插畫的縮略圖地址,該地址包含了原圖地址的唯一的特殊子串“2020/0827/00/00/09/83955373”,通過該子串參與字符串的拼接可獲得插畫的原圖地址。
由於插畫原圖作為p站的靜態資源,網站設置了referer參數,只允許訪問自己的靜態資源,因此在請求插畫原圖過程中需要設置referer參數。經過分析,插畫的id參與該參數的構成,因此除了縮略圖地址,還需要獲取插畫的id,section標簽重重地`data-id`便是該插畫的id。
另外,為方便存儲更多與該圖相關的信息,獲取該插畫的標題作為圖片文件存儲的名字,標題信息位於section標簽中的屬性`data-title`中。下面,通過設置三個列表origin_url_list、origin_title_list、origin_id_list,分別保存插畫原圖的地址、標題以及id數據。
具體的代碼實現如下:

結果如下圖所示,說明數據已准備好!

三、批量爬取原圖
批量爬取的核心還是數據爬取,參照上述提到的模板即可。已經獲得所有的插畫原圖數據,那么在爬取一條數據的基礎上增加一個循環操作便可以實現批量爬取所有的圖片數據。代碼實現如下:

運行成功后,生成month_rank文件夾,並保存爬取的所有圖片數據,如下圖所示。至此,排行榜的插畫作品原圖爬取成功!(超高清~可以用來作電腦桌面、頭像什么的~)

四、壓縮插畫目錄
有時候,對於下載的這些插畫可能想分享給其他人,或者發送到其他設備。比如使用電腦保存了這些圖片文件,可以換作電腦壁紙等等,如果想把下載的這些插畫換作手機壁紙或者微信頭像等等,那么可以通過微信的方式發送到手機端。但是過程中不可以發送整個文件夾,所以要么選擇一張一張地發送,要么就是將文件夾打包壓縮,這樣可以簡單方便地整體遷移到另一個設備。總之,通過文件壓縮的方式可以很方便地進行數據遷移與分享等等。
該部分主要涉及到文件壓縮功能。首先需要導入提供壓縮功能的模塊zipfile,然后指定壓縮的路徑,進行壓縮操作。這里主要用到zipfile模塊的ZipFile方法。具體代碼實現如下:

運行成功在,如下圖所示在指定目錄下生成.zip壓縮文件。打包壓縮文件夾可以對文件很便捷地統一發送管理,但是這里爬取的圖片都是比較高清的原圖,一個圖片文件就可能達到2M的大小,這樣以來,整個壓縮文件就比較大,在傳輸的過程中需要耗費更長的時間。另外,在后文中使用郵件進行附件發送,一般來說郵件服務器會對郵件大小作一定的要求,如果附件超過一定的大小,那么將會發送失敗。因此,一個較好的方式是,將一個文件夾壓縮成多個壓縮文件,一次發送或者上傳多個文件,以確保發送的文件尺寸在規定范圍內,該方法將在后續進行整理。

五、發送插畫郵件
經過以上的批量爬取以及壓縮的工作,在本地可以得到一個包含所有爬取插畫原圖的壓縮包文件。這時,通過郵箱的方式,可以在手極端打開郵箱下載插畫壓縮文件,也可以通過郵件方式發送給多個好友,從而可以實現多設備、多用戶之間共享。
該部分qq郵箱服務器進行郵件發送服務。要想使用該服務,需要獲取本人郵箱的授權碼,獲取方式為:qq郵箱首頁-->設置-->賬戶-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務-->開啟POP3/SMTP服務-->獲取授權碼,然后保存該授權碼,在發送郵件時需要用到。重點關注如下圖:

在發送插畫郵件部分,主要用到smtplib以及email兩個第三方庫。首先需要導包。

然后需要指定發送者的郵箱以及授權碼,接收者的郵箱列表(如果列表只有一個那么就發送給一個人,如果有多個就實現了同時給多人發送郵件),附件的絕對路徑以及要使用的郵件服務器,這里用到的是qq郵箱服務器。

接下來的工作便是郵件的主體部分:正文和附件。在這一部分,需要創建一個帶附件的實例,可以對郵件的的信息頭進行設置,比如發送者名字、接收者名字以及郵件主題。其次添加郵件正文,比如你有什么想對接收者說的或者有什么需要注明的。最后創建一個MIMEApplication實例讀取要發送的附件並添加到郵件主體中。代碼如下:

最后,開始發送郵件。大致分為以下步驟:
-
連接服務器
-
登錄郵箱
-
發送郵件
-
關閉服務器
代碼如下:

六、完整python實現
在理解上面這些之后,在下面代碼的基礎上,可以把其中涉及到的文件操作以及郵件操作等部分都可以進行封裝,然后通過函數調用,這樣的方式應該更為通用。另外對於郵件的接收者、正文、附件等等,可以通過列表對象存儲,然后通過參數傳遞的方式進行郵件發送。自行解決hhh~~

然后接收者將收到下圖這樣的郵件:

寫在最后:
1、本文的部分操作學習參考以下資料:
-
郵件部分1:菜鳥教程
-
郵件部分2:python實現自動發送郵件
-
壓縮部分1:python壓縮文件夾
2、如果有錯誤歡迎指正~
3、幫我康康左下角的小拇指亮了沒~
此文轉載文,著作權歸作者所有,如有侵權聯系小編刪除! 原文地址:https://blog.csdn.net/VinWqx/article/details/
需要完整代碼和素材的 加群:928874516