python爬蟲一鍵下載無水印高清圖

文章目錄

  • 前言
  • 分析
  • 理想狀態
  • 實際分析
  • 爬蟲實現
  • 其他注意
  • 效果與總結

前言

python爬蟲一鍵下載無水印高清圖

在我們寫文章(頭條、博客、公眾號、自媒體)的時候,常常覺得自己的文章有些老土,這很大程度是因為配圖沒有選好。

筆者也是遇到相同的情況,順便解決其中一個案例,給大家一些技術上的參考和借鑑

並且,我們搜圖片如果去百度,會遇到兩種情況:非高清或者帶水印。這都是我們所忌諱的東西。筆者此次通過圖蟲創意抓起高清小圖,雖然不是大圖,但是在火熱的移動端閱讀上是足夠的

分析

python爬蟲一鍵下載無水印高清圖

廢話說完了,我們開始分析怎麼樣才能獲取這樣的圖片呢。

理想狀態

  • 我們的理想狀態就是一個網頁,我們的目標網頁,把圖片直接放到html中。我們的爬蟲可以直接解析。這種情況,就像你寫的博客,個人網站的圖片一樣,簡單嵌入
python爬蟲一鍵下載無水印高清圖

  • 或者就是通過後臺ajax傳輸圖片地址引用。我們不清楚是否這樣!

實際分析

但事實這種肯定會被理想破滅,因為不可能!他以圖片為核心業務,要你註冊,購買等等,怎麼可能就這麼容易的嵌入進入被你找到。

  • 那它到底如何實現呢?我們分析一下!

首先打開網頁,檢查圖片,發現它的網頁圖片來源不唯一。有兩個主要域名ice和wel,並且後面的編號還不唯一,但是可以嘗試發現相同域名不同後綴的圖片地址結果相同!(例如icweiliimg9和icweiliimg/效果相同)。

python爬蟲一鍵下載無水印高清圖

我們發現原來這個搜索url會變化,但是這個查看網頁源代碼發現並沒有我們想要的圖片地址。那麼我們肯定知道它要麼從ajax渲染,或者就藏在js中進行混淆或者加密。我們發現這個xhr中並沒有想要的數據,並且他其實藏在js中。

其實這個可以猜想到的,因為它的url既然跟著變化那麼返回的數據肯定是有區別的。

那麼分析就到這裡,剩下就是python爬蟲的模擬和解析了。

爬蟲實現

前面說到已經知道它的數據源,我們用python編寫爬蟲需要進行模擬。經過測試發現它需要進行一些驗證,其中包過cookie的wluuid字段(只驗證存在,不驗證正確性)。

那麼我們編寫一段代碼就能拿到網頁html。但是問題來了。數據藏在js裡面啊!!!

我們只能用正則進行套了!

對於這個js,我們通過js=soup.select('script') js=js[4]即可獲取。

python爬蟲一鍵下載無水印高清圖

對於有用數據,只能正則截取。

pattern = re.compile(r'window.hits = (\[)(.*)(\])')

va = pattern.search(str(js)).group(2)#解析js內容

但是這個類似json的串用,拼接我們無法直接使用spilt分組分開,但是我們可以從}全部替換成},,那麼就三個,,,我們就可以分割而不影響其他json串內,;split之後每組都滿足json串格式,直接轉成json取值即可!

python爬蟲一鍵下載無水印高清圖

那麼剩下拿到url直接構造url然後下載圖片即可!

其他注意

圖片下載:

  • 下載圖片有很多圖片無名稱或者名字相同,避免這個不下載要進行編號
  • 兩個url域名需要嘗試下載其中一個成功即完成下載!

爬蟲方面

  • 全程不需要登錄,下載為高清小圖。後續可以考慮研究登錄後的大圖分享給大家!

其他

  • 創建圖片路徑要考慮路徑是否存在!

效果與總結

通過上述分析:編寫爬蟲:

import requests
	from urllib import parse
	from bs4 import BeautifulSoup
	import re
	import json
	header = {
	 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
	 'Cookie': 'wluuid=66; ',
	 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
	 'Accept-encoding': 'gzip, deflate, br',
	 'Accept-language': 'zh-CN,zh;q=0.9',
	 'Cache-Control': 'max-age=0',
	 'connection': 'keep-alive'
	 , 'Host': 'stock.tuchong.com',
	 'Upgrade-Insecure-Requests': '1'
	 }
	def mkdir(path):
	 import os# 引入模塊
	 path = path.strip()# 去除首位空格
	 path = path.rstrip("") # 去除尾部 \ 符號
	 isExists = os.path.exists(path) # 判斷路徑是否存在 # 存在 True # 不存在 False
	 if not isExists: # 判斷結果
	 os.makedirs(path)# 如果不存在則創建目錄 # 創建目錄操作函數
	 return True#print (path + ' 創建成功')
	 else:
	 # 如果目錄存在則不創建,並提示目錄已存在
	 #print(path + ' 目錄已存在')
	 return False
	def downloadimage(imageid,imgname):
	 url = 'https://weiliicimg9.pstatp.com/weili/ms/'+str(imageid)+'.webp'
	 url2 = 'https://icweiliimg9.pstatp.com/weili/ms/'+str(imageid)+'.webp'
	 b=False
	 r = requests.get(url)
	 print(r.status_code)
	 if(r.status_code!=200):
	 r=requests.get(url2)
	 with open(imgname+'.jpg', 'wb') as f:
	 f.write(r.content)
	 print(imgname+" 下載成功")
	def getText(text):
	 texturl = parse.quote(text)
	 url="https://stock.tuchong.com/search?term="+texturl+"&use=0"
	 req=requests.get(url,headers=header)
	 soup=BeautifulSoup(req.text,'lxml')
	 js=soup.select('script')
	 js=js[4]
	 print(js)
	 pattern = re.compile(r'window.hits = (\[)(.*)(\])')
	 va = pattern.search(str(js)).group(2)#解析js內容
	 print(va)
	 va = va.replace('{', '{').replace('}', '},,')
	 print(va)
	 va = va.split(',,,')
	 print(va)
	 index = 1
	 for data in va:
	 try:
	 dict = json.loads(data)
	 print(dict)
	 imgname='img/'+text+'/'+dict['title']+str(index)
	 index+=1
	 mkdir('img/'+text)
	 imgid=dict['imageId']
	 downloadimage(imgid,imgname)
	 except Exception as e:
	 print(e)
	if __name__ == '__main__':
	 getText(text=input('輸入關鍵詞:'))

測試結果:

python爬蟲一鍵下載無水印高清圖

打開文件夾:

python爬蟲一鍵下載無水印高清圖

發現nice!你只需要輸入關鍵詞即可實現自動下載,雖然是小圖,但是效果不錯!

移動端頭條、公眾號和博客效果!

python爬蟲一鍵下載無水印高清圖

python爬蟲一鍵下載無水印高清圖

不難發現,整個過程就是分析和處理字符串的邏輯難點。數據結構與算法紮實了處理問題都不難

歡迎轉發!分享!


分享到:


相關文章: