Python 爬蟲 目標:千圖網VIP高清無水印下載即用

smart_num_1發表於2020-03-29

Python pyquery 獲取千圖網部分VIP 無水印原圖

在工作時可能會需要很多的素材,千圖網為我們提供了一個很好的平臺,但多數圖片需要開通VIP,今天分享一個可以繞過多數 VIP 才能夠下載的方法
由於第一次寫部落格,會有語言不通或用詞不專業等情況,還望多加斧正。

所需庫: urllib.request pyquery urllib.parse

分析網頁原始碼

分析網頁原始碼
開啟千圖網中的一個素材圖片
右鍵開啟抓包工具,審查元素,在這裡插入圖片描述
可以看到圖示中的素材url在 id = show-area-height 標籤下的img scr中
因此得到素材的 url: //preview.qiantucdn.com/58pic/35/76/35/auto_04f58PICt4IeBt75fhbbf_PIC2018.jpg!w1024_new_0
將得到的url複製到位址列中,看到高清的素材圖片展現在眼前。
在這裡插入圖片描述
但是發現並不是我們想要的高清、無水印、下載後免扣圖便可直接使用的圖片,因此產生一個問題,如何拿到素材真正的地址,而並非是網站用來向使用者展示的圖片?難道再去學一個PS?難道退而求其次只用這些殘次品嗎?
不,人向來追求美好,絕不能作罷。
接下來檢視網頁原始碼。
在這裡插入圖片描述
首先進入眼簾的是網頁的編碼格式為 " gbk ",在後續會用到。
其次,可以看到素材的 url 在 meta 中 content 也有出現。

這些有什麼用處我們暫且不談,先來根據 meta 中的content 中的url,再開啟另外的一些素材圖片:
//preview.qiantucdn.com/58pic/35/76/35/auto_04f58PICt4IeBt75fhbbf_PIC2018.jpg!w1024//preview.qiantucdn.com/58pic/35/76/35/auto_04f58PICt4IeBt75fhbbf_PIC2018.jpg!w1024_water

//preview.qiantucdn.com/58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water

//preview.qiantucdn.com/58pic/35/74/86/png_auto_81X58PIC888fefc2s9GJK_PIC2018.jpg!w1024_water

//preview.qiantucdn.com/original_origin_pic/19/03/17/auto_709be0eaf77adfa23d73936042ac6290_PIC2018.jpg!w1024_water

在這些素材url中,我們可以觀察到前兩個 url 格式較為統一,而後兩者則各有不同。因為第一次寫部落格,所以這次之講述其中一種格式的下載方式。

有興趣的可以自己找一找後兩者的下載方式,當然也可以掃描文章末尾的二維碼獲取所有格式完整的程式碼。

接下來,繼續討論如何找到無水印的素材地址,以第一種格式為例:

//preview.qiantucdn.com/58pic/35/76/35/auto_04f58PICt4IeBt75fhbbf_PIC2018.jpg!w1024_water

//preview.qiantucdn.com/58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water

觀察到這種格式的 url 均以//preview.qiantucdn.com/ 開頭,不一樣是後方的地址。

這時候我們是否想到可以將其後的內容理解為伺服器儲存該素材的一個編號。像是每位員工都有唯一工號。
但是隻有工號,沒有部門,豈不是很難管理?

千圖網的網址是什麼?
https://www.58pic.com/ 像不像一個部門?

俗話說,撐死膽大的,我們不如大膽的來猜想一下,部門,加工號,確定一個員工的工作地點。
所以,https://www.58pic.com/ + 58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water

得到一個?沒錯,嶄新的url。

新生兒url:https://www.58pic.com/58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water
滿懷激動的心情複製到位址列開啟。竟是 …… 404失聯
在這裡插入圖片描述
這是什麼原因呢?難道是大膽,窮有大膽?出生牛犢不怕虎嗎?

有沒有聽說過這樣一則笑話?
一位小學生寫到:我的媽媽是一位不到40歲的中年婦女?
“都中年婦女了,還40,40多餘的”
“哦,我的媽媽是一位不到40歲多餘的中年婦女”

聽完笑話了,繼續我們的探討。在這裡,就不賣關子了。第一次寫部落格還挺緊張的。直接奉上真正的下載地址,我們來觀察一下。

正宗url: http://apifont.58pic.com/index.php?c=Download&a=downPng&im=//58pic/35/76/35/04f58PICt4IeBt75fhbbf_PIC2018.png

開啟後,驚訝??? 直接下載?但是怎麼沒有自動命名呢?

在這裡插入圖片描述
不管了,我們先來下載看看是否是無水印的素材。在這裡插入圖片描述
高清,無水印?可以直接使用?實現了?
沒錯的,這樣我們就拿到了真正的下載地址。

來分析一下這個 url:
http://apifont.58pic.com/index.php?c=Download&a=downPng&im=//58pic/35/76/35/04f58PICt4IeBt75fhbbf_PIC2018.png

再來對比我們拼湊的 url:
https://www.58pic.com/58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water

我們發現,原來是我們部門錯了,部門應該是:http://apifont.58pic.com/index.php?c=Download&a=downPng&im=//

但是,這一部分是如何得到呢?還是那句話,第一次寫部落格,很緊張,掃描文章末二維碼,獲得詳細解釋資料。

再有不同就是 url 中的 auto_ 消失,以及 jpg!w1024_water 被 png 所取代。
所以我們得到真正的下載地址組合方式 http://apifont.58pic.com/index.php?c=Download&a=downPng&im=// + 編號 + .png

對於這個編號,還是上文中提到的工號。按照這個思路,我們來試一試下面的素材url:
//preview.qiantucdn.com/58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water

取編號:58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018

去除auto_:58pic/35/74/79/17658PIC9b2iMREdv697d_PIC2018

組合:又是一個新的url:(http://apifont.58pic.com/index.php?c=Download&a=downPng&im=//58pic/35/74/79/17658PIC9b2iMREdv697d_PIC2018.png)

先來試一試,複製貼上後
在這裡插入圖片描述
又是一個不自動命名的檔案,討厭。
先下載看一看
在這裡插入圖片描述
我們手動將其字尾改為圖片的格式 .png 或者 .jpg
兩個素材均無水印,可以直接使用。

按照此思路,我們用程式碼實現抓取,以及未自動命明的情況在程式碼中會實現。

利用 pyquery 篩選所需資訊

import urllib.request as ut
from urllib.parse import unquote,quote
from pyquery import PyQuery as pq
def get_imageurl(url = None):
	headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
	url = url
	base_url =  'https://apifont.58pic.com/index.php?c=Download&a=downPng&im=/'
	 # 在分析中提到的部門,如有疑問,請到分析中回顧
	 
	req = ut.Request(url = url,headers = headers)
    response = ut.urlopen(req).read().decode('gbk')
    #分析中有提到網頁格式為 gbk 格式所以要解碼
    
    data = pq(response)
    #基本操作,不用多解釋吧?
    image_url = data('meta').items()
    # 獲取分析中的 content 中的 url
    name = data('title').text()
    # 同分析中的content中的意思,獲取 title 中的圖片名稱
    url_1 = base_url_2 + j[23:39] + j[44:73] + ".png&title=" + quote(name)
    '''
    首先來解釋一下 &title + quote(name) 
    	新增title的目的是實現自動命名,而命名的內容便是 name 
    	而 name 為中文格式,可能會出錯,所以要轉為 url 編碼格式
    '''
    print(url_1)
    #至此,實現找出真正的下載地址

if __name__ == '__main__': # 程式入口
	url = 'https://www.58pic.com/newpic/35747917.html' #要下載的素材網址
	get_imageurl(url) # 在函式中實現功能

在上文中提到,這只是其中的一種解析格式,還有另外的4、5 種解析格式。
在此篇部落格中只敘述了格式為:
//preview.qiantucdn.com/xxxxxx/auto_xxxxxxxx.jpg!w1024_water

的解析方法,其它格式的解析方法,請掃描下方二維碼獲取,或 等待後續部落格。
在這裡插入圖片描述
本講至此結束。感謝您的瀏覽。

相關文章