python爬取p站排行榜并自動(dòng)發(fā)送郵件-這個(gè)項(xiàng)目賺了500

一、前言

? ? ? pixiv網(wǎng)站是一個(gè)以插圖、漫畫(huà)和小說(shuō)藝術(shù)為中心的虛擬社區(qū)網(wǎng)站。其初衷是為全球藝術(shù)家提供一個(gè)平臺(tái),發(fā)表他們作品,并透過(guò)評(píng)級(jí)系統(tǒng)反映用戶意見(jiàn)。該網(wǎng)站以用戶投稿的原創(chuàng)圖畫(huà)為中心,輔以標(biāo)簽、書(shū)簽、作品回應(yīng)、排行榜等功能形成具有其特色的社交網(wǎng)絡(luò)。

? ? ? 本文以pixiv站作為數(shù)據(jù)爬取對(duì)象,這里簡(jiǎn)稱(chēng)p站。本文工作內(nèi)容主要可分為以下內(nèi)容:

爬取p站月排行榜插畫(huà)原圖

自動(dòng)打包壓縮插畫(huà)文件

實(shí)現(xiàn)郵件發(fā)送壓縮文件

? ? ? 編寫(xiě)本文是因?yàn)槲以谂廊〈罅坎瀹?huà)后,希望把它發(fā)給手機(jī)端更換頭像,以及想分享好看的圖給好友(不得不說(shuō),p站的圖確實(shí)不少,而且原圖真的超清,之前我還想在哪里找好看又高清的電腦壁紙)。但是每次都需要自己手動(dòng)壓縮,然后再一個(gè)個(gè)地發(fā)送壓縮包,難免覺(jué)得繁瑣,因此想著用通過(guò)python實(shí)現(xiàn)自動(dòng)壓縮插畫(huà)文件然后郵件發(fā)送。

二、爬取網(wǎng)頁(yè)

? ? ? 由前文《從0實(shí)現(xiàn)python批量爬取p站插畫(huà)》可知,首先一個(gè)簡(jiǎn)單的爬取網(wǎng)頁(yè)流程大致地分為三個(gè)部分,分別是指定請(qǐng)求url、設(shè)置headers、發(fā)起訪問(wèn)請(qǐng)求。對(duì)p站月排行榜的插畫(huà)網(wǎng)頁(yè)部分進(jìn)行數(shù)據(jù)爬取,首先已知月排行榜插畫(huà)部分的網(wǎng)頁(yè)地址,然后通過(guò)右鍵瀏覽器頁(yè)面或者按F12進(jìn)入網(wǎng)頁(yè)inspect,查看network下面的XHR消息獲取個(gè)人user-agent。代碼實(shí)現(xiàn)如下:

? 運(yùn)行成功后,可以看到目錄下生成rank.html文件,打開(kāi)顯示如下內(nèi)容:

? ? ? ? ? ? ? 由上圖可知排行榜的數(shù)據(jù)可以直接進(jìn)行訪問(wèn)得到。進(jìn)入到rank.html文件保存的文件夾,選擇瀏覽器打開(kāi)rank.html文件,顯示p站的插畫(huà)排行榜,可知p站月排行榜插畫(huà)部分的網(wǎng)頁(yè)內(nèi)容爬取成功!

二、解析并構(gòu)造數(shù)據(jù)

1、網(wǎng)頁(yè)解析

? ? ? 以上爬取p站月排行榜插畫(huà)網(wǎng)頁(yè)內(nèi)容并下載到本地并不是本文的目的,而是開(kāi)始批量爬取插畫(huà)的第一步。要批量爬取插畫(huà),首先要對(duì)網(wǎng)頁(yè)本身進(jìn)行分析并對(duì)爬取的網(wǎng)頁(yè)進(jìn)行解析。使用瀏覽器打開(kāi)下載的rank.html,然后按F12鍵或者右鍵第一章圖片選擇inspect檢查網(wǎng)頁(yè),可顯示如下圖信息:

? ? ? 由上圖可知,所有的圖片都存放在一個(gè)class類(lèi)名為`ranking-items-container`的div標(biāo)簽內(nèi)。每個(gè)圖片通過(guò)一個(gè)section標(biāo)簽作為一個(gè)獨(dú)立的部分存放在div內(nèi),section標(biāo)簽包含了該作品id、排名、標(biāo)題、作者名等信息,里面嵌入的img標(biāo)簽包含了該作品的縮略圖地址(注意了?。?!這是構(gòu)建插畫(huà)原圖地址的關(guān)鍵部分)、作者id等信息。這些信息構(gòu)成了所要爬取插畫(huà)的重要線索,因此需要對(duì)爬取的網(wǎng)頁(yè)進(jìn)行解析,獲取到包含插畫(huà)信息的所有section標(biāo)簽。

? ? ? 網(wǎng)頁(yè)的解析主要有三種方式,分別是正則表達(dá)式、beautiful soup、xpath,詳細(xì)介紹與使用可以參照《python爬蟲(chóng)入門(mén)總結(jié)》。xpath具有較強(qiáng)的通用性與高效性,這里通過(guò)該方式對(duì)網(wǎng)頁(yè)進(jìn)行解析,關(guān)鍵代碼如下:

2、構(gòu)造數(shù)據(jù)? ? ?

? ? ? 通過(guò)上述對(duì)網(wǎng)頁(yè)進(jìn)行分析,img標(biāo)簽里面的data-src屬性的內(nèi)容為插畫(huà)的縮略圖地址,該地址包含了原圖地址的唯一的特殊子串“2020/0827/00/00/09/83955373”,通過(guò)該子串參與字符串的拼接可獲得插畫(huà)的原圖地址。

? ? ? 由于插畫(huà)原圖作為p站的靜態(tài)資源,網(wǎng)站設(shè)置了referer參數(shù),只允許訪問(wèn)自己的靜態(tài)資源,因此在請(qǐng)求插畫(huà)原圖過(guò)程中需要設(shè)置referer參數(shù)。經(jīng)過(guò)分析,插畫(huà)的id參與該參數(shù)的構(gòu)成,因此除了縮略圖地址,還需要獲取插畫(huà)的id,section標(biāo)簽重重地`data-id`便是該插畫(huà)的id。

? ? ? 另外,為方便存儲(chǔ)更多與該圖相關(guān)的信息,獲取該插畫(huà)的標(biāo)題作為圖片文件存儲(chǔ)的名字,標(biāo)題信息位于section標(biāo)簽中的屬性`data-title`中。下面,通過(guò)設(shè)置三個(gè)列表origin_url_list、origin_title_list、origin_id_list,分別保存插畫(huà)原圖的地址、標(biāo)題以及id數(shù)據(jù)。

? ? ? 具體的代碼實(shí)現(xiàn)如下:

? 結(jié)果如下圖所示,說(shuō)明數(shù)據(jù)已準(zhǔn)備好!

三、批量爬取原圖

? ? ? 批量爬取的核心還是數(shù)據(jù)爬取,參照上述提到的模板即可。已經(jīng)獲得所有的插畫(huà)原圖數(shù)據(jù),那么在爬取一條數(shù)據(jù)的基礎(chǔ)上增加一個(gè)循環(huán)操作便可以實(shí)現(xiàn)批量爬取所有的圖片數(shù)據(jù)。代碼實(shí)現(xiàn)如下:

? 運(yùn)行成功后,生成month_rank文件夾,并保存爬取的所有圖片數(shù)據(jù),如下圖所示。至此,排行榜的插畫(huà)作品原圖爬取成功?。ǔ咔濉梢杂脕?lái)作電腦桌面、頭像什么的~)

四、壓縮插畫(huà)目錄

? ? ? 有時(shí)候,對(duì)于下載的這些插畫(huà)可能想分享給其他人,或者發(fā)送到其他設(shè)備。比如使用電腦保存了這些圖片文件,可以換作電腦壁紙等等,如果想把下載的這些插畫(huà)換作手機(jī)壁紙或者微信頭像等等,那么可以通過(guò)微信的方式發(fā)送到手機(jī)端。但是過(guò)程中不可以發(fā)送整個(gè)文件夾,所以要么選擇一張一張地發(fā)送,要么就是將文件夾打包壓縮,這樣可以簡(jiǎn)單方便地整體遷移到另一個(gè)設(shè)備??傊?,通過(guò)文件壓縮的方式可以很方便地進(jìn)行數(shù)據(jù)遷移與分享等等。

? ? ? 該部分主要涉及到文件壓縮功能。首先需要導(dǎo)入提供壓縮功能的模塊zipfile,然后指定壓縮的路徑,進(jìn)行壓縮操作。這里主要用到zipfile模塊的ZipFile方法。具體代碼實(shí)現(xiàn)如下:

? 運(yùn)行成功在,如下圖所示在指定目錄下生成.zip壓縮文件。打包壓縮文件夾可以對(duì)文件很便捷地統(tǒng)一發(fā)送管理,但是這里爬取的圖片都是比較高清的原圖,一個(gè)圖片文件就可能達(dá)到2M的大小,這樣以來(lái),整個(gè)壓縮文件就比較大,在傳輸?shù)倪^(guò)程中需要耗費(fèi)更長(zhǎng)的時(shí)間。另外,在后文中使用郵件進(jìn)行附件發(fā)送,一般來(lái)說(shuō)郵件服務(wù)器會(huì)對(duì)郵件大小作一定的要求,如果附件超過(guò)一定的大小,那么將會(huì)發(fā)送失敗。因此,一個(gè)較好的方式是,將一個(gè)文件夾壓縮成多個(gè)壓縮文件,一次發(fā)送或者上傳多個(gè)文件,以確保發(fā)送的文件尺寸在規(guī)定范圍內(nèi),該方法將在后續(xù)進(jìn)行整理。

五、發(fā)送插畫(huà)郵件

? ? ? 經(jīng)過(guò)以上的批量爬取以及壓縮的工作,在本地可以得到一個(gè)包含所有爬取插畫(huà)原圖的壓縮包文件。這時(shí),通過(guò)郵箱的方式,可以在手極端打開(kāi)郵箱下載插畫(huà)壓縮文件,也可以通過(guò)郵件方式發(fā)送給多個(gè)好友,從而可以實(shí)現(xiàn)多設(shè)備、多用戶之間共享。

? ? ? 該部分qq郵箱服務(wù)器進(jìn)行郵件發(fā)送服務(wù)。要想使用該服務(wù),需要獲取本人郵箱的授權(quán)碼,獲取方式為:qq郵箱首頁(yè)-->設(shè)置-->賬戶-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù)-->開(kāi)啟POP3/SMTP服務(wù)-->獲取授權(quán)碼,然后保存該授權(quán)碼,在發(fā)送郵件時(shí)需要用到。重點(diǎn)關(guān)注如下圖:

? ? ? 在發(fā)送插畫(huà)郵件部分,主要用到smtplib以及email兩個(gè)第三方庫(kù)。首先需要導(dǎo)包。

然后需要指定發(fā)送者的郵箱以及授權(quán)碼,接收者的郵箱列表(如果列表只有一個(gè)那么就發(fā)送給一個(gè)人,如果有多個(gè)就實(shí)現(xiàn)了同時(shí)給多人發(fā)送郵件),附件的絕對(duì)路徑以及要使用的郵件服務(wù)器,這里用到的是qq郵箱服務(wù)器。

接下來(lái)的工作便是郵件的主體部分:正文和附件。在這一部分,需要?jiǎng)?chuàng)建一個(gè)帶附件的實(shí)例,可以對(duì)郵件的的信息頭進(jìn)行設(shè)置,比如發(fā)送者名字、接收者名字以及郵件主題。其次添加郵件正文,比如你有什么想對(duì)接收者說(shuō)的或者有什么需要注明的。最后創(chuàng)建一個(gè)MIMEApplication實(shí)例讀取要發(fā)送的附件并添加到郵件主體中。代碼如下:

? ? 最后,開(kāi)始發(fā)送郵件。大致分為以下步驟:

連接服務(wù)器

登錄郵箱

發(fā)送郵件

關(guān)閉服務(wù)器

? ? ? 代碼如下:

六、完整python實(shí)現(xiàn)

? ? ? 在理解上面這些之后,在下面代碼的基礎(chǔ)上,可以把其中涉及到的文件操作以及郵件操作等部分都可以進(jìn)行封裝,然后通過(guò)函數(shù)調(diào)用,這樣的方式應(yīng)該更為通用。另外對(duì)于郵件的接收者、正文、附件等等,可以通過(guò)列表對(duì)象存儲(chǔ),然后通過(guò)參數(shù)傳遞的方式進(jìn)行郵件發(fā)送。自行解決hhh~~

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

寫(xiě)在最后:

1、本文的部分操作學(xué)習(xí)參考以下資料:

郵件部分1:菜鳥(niǎo)教程

郵件部分2:python實(shí)現(xiàn)自動(dòng)發(fā)送郵件

壓縮部分1:python壓縮文件夾

2、如果有錯(cuò)誤歡迎指正~

3、幫我康康左下角的小拇指亮了沒(méi)~

此文轉(zhuǎn)載文,著作權(quán)歸作者所有,如有侵權(quán)聯(lián)系小編刪除!

原文地址:https://blog.csdn.net/VinWqx/article/details/

需要完整代碼和素材的?點(diǎn)擊這里下載

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容