如何從0實現(xiàn)python批量爬取p站插畫。這樣的插畫太好看了

一、本文編寫緣由

? ? ? 很久沒有寫過爬蟲,已經(jīng)忘得差不多了。以爬取p站圖片為著手點,進(jìn)行爬蟲復(fù)習(xí)與實踐。

二、獲取網(wǎng)頁源碼

? ? ? 爬取網(wǎng)頁數(shù)據(jù)的過程主要用到request庫,一個簡單的網(wǎng)頁爬蟲實現(xiàn)過程大致可以分為一下步驟:

指定爬取url

發(fā)起爬取請求

存儲爬取數(shù)據(jù)

? ? ? 下面以爬取pixiv網(wǎng)站為例,獲取pixiv網(wǎng)站首頁源碼并存儲到pixiv1.html文件中。

? ? 經(jīng)過上述操作,將會在當(dāng)前目錄下生成一個“pixiv1.html”文件。雙擊文件打開,會發(fā)現(xiàn)是下圖這樣子,訪問該網(wǎng)站首先需要登錄,所以會跳入到登錄注冊頁面,且頁面都為日文。

? ? ? 針對這個問題,右鍵檢查網(wǎng)頁,進(jìn)入network,然后刷新頁面,發(fā)現(xiàn)有數(shù)據(jù)更新,點擊查看Headers。發(fā)現(xiàn)request headers里面帶有cookie,因此需要偽裝UA,設(shè)置請求頭header,將request header復(fù)制到代碼塊中。

? 再次打開保存的網(wǎng)頁文件“pixiv2.html”,發(fā)現(xiàn)頁面并不像我們登錄進(jìn)去的一樣,而是如下圖所示。

? ? ? 小朋友,你是不是有很多問號......

三、爬取單張縮略圖片

? ? ? 由上一個章節(jié)可知,首頁的插畫部分并不是首頁的直接源碼,而是引入了另外的網(wǎng)頁地址和腳本。這里,通過進(jìn)入到網(wǎng)頁并進(jìn)行分析,右鍵圖片再點擊檢查獲取圖片地址,該圖片比較小,為縮略圖片。復(fù)制圖片地址,并粘貼到瀏覽器的地址欄,可顯示圖片。

? ? ? 根據(jù)獲得的圖片的地址,直接對圖片地址進(jìn)行訪問,獲取圖片數(shù)據(jù),并存儲到本地。

? 于是名為“1.jpg”的圖片在當(dāng)前目錄下生成,雙擊打開發(fā)現(xiàn)出錯。如下圖所示。

? ? ? ? 這是因為請求頭信息缺失,需要添加請求頭,代碼如下:

? “1.jpg”文件生成,雙擊可打開,爬取單張圖片成功。

三、爬取單張高清原圖

1、獲取原圖地址

? ? ? 要爬取原圖,首先還是得獲取圖片地址。點擊插畫的縮略圖,進(jìn)入插畫的詳情頁面,右鍵插畫圖片inspect網(wǎng)頁,如下圖所示。

? ? ? 點擊左側(cè)圖片進(jìn)入大圖預(yù)覽模式,再右鍵inspect網(wǎng)頁,可知右邊紅色框中a標(biāo)簽的鏈接地址就是插畫的原圖地址。但是復(fù)制該地址到瀏覽器地址欄,顯示403狀態(tài)碼。這時點擊返回原始網(wǎng)頁中點擊圖片,進(jìn)入大圖模式,然后再在瀏覽器地址欄復(fù)制地址查看圖片,發(fā)現(xiàn)可以成功顯示圖片。

2、爬取高清原圖

? ? ? 先附上爬取原圖的代碼。

? 根據(jù)上面已經(jīng)獲取了原圖地址,在請求原圖的過程中需設(shè)置headers的referer參數(shù),否則請求不成功。

? ? ? 對于請求,可能存在不成功的情況,可以根據(jù)返回的狀態(tài)碼進(jìn)行判斷。如果狀態(tài)為200,那么說明ok,請求成功,否則說明請求不成功,打印狀態(tài)碼信息。

四、批量爬取高清原圖

? ? ? 上述爬取單張圖片相比于“”手動右鍵另存為“,實在耗時費力且非但沒有體現(xiàn)任何爬蟲的優(yōu)勢。但是如果喜歡這個網(wǎng)站的大多數(shù)圖片,并希望可以全部保存到本地,手動就太繁瑣機(jī)械了,使用爬蟲可以方便且快速地實現(xiàn)這個操作。

1、分析原圖地址

? ? ? 由上一小節(jié)可知,這里是直接通過查看圖片地址,然后獲取多張圖片。要獲取多張圖片,那么一種方法是記錄下所有的圖片地址并保存到文件,通過讀取文件中的圖片地址下載圖片;另一種方式是分析圖片地址的邏輯、構(gòu)成、關(guān)系。顯然后者更為科學(xué)與便捷。通過右擊多張圖片,獲取如下圖片地址:

https://i.pximg.net/img-original/img/2020/09/20/19/00/02/84495797_p0.jpg

https://i.pximg.net/img-original/img/2020/09/19/18/00/29/84470884_p0.jpg

https://i.pximg.net/img-original/img/2020/09/20/06/17/10/84484828_p0.png

https://i.pximg.net/img-original/img/2020/09/19/00/00/44/84457006_p0.jpg

? ? ? 以第一張圖片地址為例,發(fā)現(xiàn)該地址前面的”https://i.pximg.net/img-original/img/“以及后面的”_p0.jpg“為公共部分,僅有中間的”2020/09/19/18/00/29/84470884“與其他圖片地址不同。

? ? ? ? 通過查看network中XHR的Preview來查看每條xhr信息的主題內(nèi)容,獲知以下圖片內(nèi)容。

? ? ? 上圖中的json數(shù)據(jù)中包含了不同的圖片信息,比如最后一條的key參與構(gòu)成原圖地址和referer,且里面url的內(nèi)容為原圖的縮略圖地址,具有原圖特殊部分的信息。因此,可以通過解析該json數(shù)據(jù)來構(gòu)造原圖的url。

2、構(gòu)造原圖地址

? ? ? 首先找到該preview對應(yīng)的xhr信息,然后復(fù)制request url,進(jìn)行請求訪問,編碼實現(xiàn)如下:

運行結(jié)果如下所示:

? ? ? 由此可知,該request url就是json數(shù)據(jù)對應(yīng)的接口地址,通過訪問該地址,返回所需要的包含圖片信息的json數(shù)據(jù)。

? ? ? 根據(jù)顯示的json數(shù)據(jù),可知其中包含了不止一個的圖片信息,通過解析請求結(jié)果可以構(gòu)造多個圖片地址。請求結(jié)果返回的數(shù)據(jù)為字典類型的數(shù)據(jù),真正有用到的是body中的內(nèi)容。首先或許結(jié)果數(shù)據(jù)的body部分,然后通過list方法可以獲取字典所有的key,即圖片的id。通過定義兩個數(shù)組分別為origin_url_list和origin_title_list,分別保存所有的原圖地址和原圖名稱。通過直接取值的方式獲取圖片的title并添加到列表中,通過正則表達(dá)式解析縮略圖的地址來獲取原圖中的特殊部分,然后進(jìn)行字符串拼接獲得原圖地址。最后可以通過打印的方式,檢查構(gòu)造的數(shù)據(jù)是否正確。

結(jié)果如下圖所示:

3、批量爬取原圖

? ? ? 經(jīng)過上述步驟,可以獲得圖片的網(wǎng)址、標(biāo)題、referer參數(shù)涉及到的圖片id等信息,然后根據(jù)這些信息,發(fā)起請求訪問,然后保存圖片至本地即可。至此,批量爬取圖片成功!

? ? ? 代碼如下:

保存結(jié)果如下圖:

寫在最后:

1、本文的圖片爬取在博主so long引導(dǎo)下完成,并參考了其博客P站爬蟲,分析過程批量爬取原圖png。

2、如果讀者你覺得有幫助,可以點亮下方的小拇指,因為博主會很開心你喜歡。

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

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

需要視代碼 鏈接視頻 加群:928874516

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

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