python使你再也不為文章配圖與素材發(fā)愁,讓高清圖片占滿你的硬盤!
怪毛病
最近寫公眾號(hào)寫的染上了個(gè)怪毛病,不到12點(diǎn)根本不知道寫啥。一過(guò)凌晨那簡(jiǎn)直是吃了大回復(fù)一般的文思泉涌。結(jié)果就是最近越熬夜越晚了.公眾號(hào)是每天定時(shí)發(fā)的,簡(jiǎn)書(shū)上的發(fā)帖時(shí)間才是真正的睡前倒計(jì)時(shí)…然后,來(lái)看看都是幾點(diǎn)睡的:
為什么這么有精神?因?yàn)槲椅洚?dāng)王也改投了全真教,習(xí)得重陽(yáng)真人一身武學(xué)典籍,本著不藏私的心態(tài),在這里共享給大家,請(qǐng)叫我雷鋒:
電腦硬盤里的圖片
夾的照片(硬盤里的女神)看了又刪,去年夏天后就沒(méi)聊過(guò)天…很久前有這首歌很火,不知道大家聽(tīng)過(guò)沒(méi),只是括號(hào)里的歌詞被改成了現(xiàn)在的樣子。那么,你們以為我今晚要開(kāi)車?NONONO…
每天做公眾號(hào),最愁的兩件事,一是選題,二是公眾號(hào)配圖。不知道寫什么,比寫代碼遇到坑更讓人發(fā)愁。那么配圖呢?配圖的坑主要在于,選擇的圖首先要有美感或者和文章主題有所關(guān)聯(lián),最重要的是你選擇的圖必須是沒(méi)有版權(quán)的。不然容易遭到投訴…網(wǎng)上推薦了很多免費(fèi)的床圖網(wǎng)站,我一直用的是pixabay。
很多床圖網(wǎng)站為什么選擇它?一個(gè)是這個(gè)網(wǎng)站有百度云加速,雖然速度還是很卡(同樣這里也是個(gè)坑,一會(huì)兒解釋),而且預(yù)覽圖片時(shí),不會(huì)添加網(wǎng)站的水印,你可以通過(guò)f12獲取url的方式去下載圖片,而無(wú)需注冊(cè)后點(diǎn)進(jìn)行下載,但是每次通過(guò)f12獲取url的方式下載圖片,有點(diǎn)太耗費(fèi)時(shí)間了,所以今天就教大家通過(guò)Python自動(dòng)下載網(wǎng)站的所有圖片,并巧妙實(shí)現(xiàn)網(wǎng)站的搜索引擎功能。
先來(lái)填個(gè)坑
大坑解析
上面說(shuō)到了,網(wǎng)站支持百度云加速,但同樣的百度為了判斷你是否為爬蟲(chóng)訪問(wèn),會(huì)對(duì)瀏覽器進(jìn)行監(jiān)測(cè)。首次訪問(wèn)網(wǎng)站(有的運(yùn)氣好會(huì)訪問(wèn)幾次后出現(xiàn)驗(yàn)證…),需要填寫驗(yàn)證碼確認(rèn)非程序爬蟲(chóng)。之后才能正常使用。
但如果是拿requests進(jìn)行url訪問(wèn)下載,怎么去破解?網(wǎng)上很多說(shuō)什么js獲取驗(yàn)證的,對(duì)于requests來(lái)說(shuō)都不靠譜,當(dāng)然你可以換成selenium前臺(tái)模擬瀏覽器操作解析驗(yàn)證碼然后去下載,先不說(shuō)這驗(yàn)證碼解析成果率多低,selenium的爬蟲(chóng)速度能和requests比?
我們?cè)撊绾谓鉀Q這個(gè)問(wèn)題?先老老實(shí)實(shí)的輸入驗(yàn)證碼,看下面這張圖:
pixabay.com網(wǎng)站存在7個(gè)cookie(顯示9個(gè)是另外一個(gè)網(wǎng)站的…),然后一個(gè)一個(gè)查每個(gè)cookie的詳細(xì)信息,連蒙帶猜+驗(yàn)證,最后確定了,控制百度云的cookie有效期是通過(guò)cf_clearance時(shí)間來(lái)控制的,有效時(shí)長(zhǎng)為一個(gè)半小時(shí)!
requests跳過(guò)百度云監(jiān)測(cè)
知道了是由于cookie驗(yàn)證導(dǎo)致的訪問(wèn)異常,那我們?cè)撛趺醋觯客ㄟ^(guò)headers添加cookie!
網(wǎng)站爬蟲(chóng)分析
再來(lái)個(gè)坑
剛才說(shuō)了網(wǎng)站的圖片是動(dòng)態(tài)加載的,這個(gè)有什么坑呢?代碼說(shuō)話:
我們會(huì)發(fā)現(xiàn)前十幾張的url鏈接保存在srcset中,而之后的80+張圖片他的url包裹在data-lazy-srcset中,后者的src也是默認(rèn)的blank.gif的空白幕布,還么來(lái)得及把圖片刷出來(lái)…
所以爬蟲(chóng)的時(shí)候我們需要小心了…如何快捷的判斷到底使用哪個(gè)attr?這里用到一個(gè)Python的 or方法,舉個(gè)例子:
這樣大家明白了吧,我們只需要 img.attrs.get(‘srcset’)即可。
只有你摳細(xì)節(jié),才能成長(zhǎng)!所以我問(wèn)你,srcset放在or前還是data-lazy-srcset放在or前?再看一個(gè)例子:
當(dāng)python遇到or運(yùn)算時(shí),如果第一個(gè)條件成立,那么直接返回?cái)?shù)值,而不關(guān)注or后的表達(dá)式了!所以data-lazy-srcset有80+個(gè),我們應(yīng)該把它放在or的左邊。夠不夠摳細(xì)節(jié)?細(xì)節(jié)決定成敗!
小技巧1:指定內(nèi)容檢索
如何將我們的圖片進(jìn)行分類呢,網(wǎng)站的url也比較簡(jiǎn)單:
https://pixabay.com/zh/images/search/%E4%B9%A6/?pagi=2
search后的編碼,通過(guò)from urllib.parse import quote即可獲取,然后就是page的數(shù)字通過(guò)for循環(huán)匹配即可。
小技巧2:保存圖片你索引
這里可是一個(gè)彩蛋了!大家都知道img一般都有一個(gè)alt的選項(xiàng),即當(dāng)圖片顯示不出來(lái)時(shí),通過(guò)alt告訴大家這個(gè)圖片是干嘛的!比如這些:
如果我們?cè)诒4鎴D片的時(shí)候?qū)D片名字中添加alt索引,之后我們通過(guò)windows自帶的查找不就可以進(jìn)行模擬網(wǎng)站的檢索功能了么?是不是很雞賊?哈哈…
小技巧3:獲取高像素的圖片
剛才我們看到了,默認(rèn)的url是__340.jpg,像素比較低,但如果我們點(diǎn)擊每個(gè)a標(biāo)簽的鏈接進(jìn)入每個(gè)單張圖的地址,會(huì)看到720p的中品質(zhì)圖片,那么要改鏈接一個(gè)一個(gè)解析?不用那么麻煩,這個(gè)網(wǎng)站的中品質(zhì)圖片link對(duì)比如下:
https://cdn.pixabay.com/photo/2019/07/22/09/02/landscape-4354610__340.jpg
https://cdn.pixabay.com/photo/2019/07/22/09/02/landscape-4354610_960_720.jpg
所以我們只需要將__340替換為_(kāi)960_720代碼實(shí)現(xiàn)
提前強(qiáng)調(diào)一句,對(duì)于這種福利性的網(wǎng)站,大家還是下手輕一點(diǎn),善待它吧!
#?-*-?coding:?utf-8?-*- #?@Author???:?王翔 #?@JianShu??:?清風(fēng)Python #?@Date?????:?2019/7/26?02:55 #?@Software?:?PyCharm #?@version??:Python?3.7.3 #?@File?????:?picture_download.py import?os import?time import?requests from?bs4?import?BeautifulSoup from?urllib.parse?import?quote,?urljoin,?urlsplit import?threading class?PictureDownload: ????BaseUrl?=?"https://pixabay.com/zh/images/search/" ????DefaultPages?=?5 ????Path?=?os.path.dirname(os.path.abspath(__file__)) ????def?__init__(self): ????????#?cookie大家在使用的時(shí)候,記得替換... ????????self.headers?=?{ ????????????"cache-control":"Cache-control:?private,?max-age=0,?no-cache", ????????????"cf-ray":"4fc0bf640b4e20be-LAX", ????????????"set-cookie":"lang=zh;?expires=Sun,?22-Jul-2029?20:05:15?GMT;?Max-Age=315360000;?Path=/", ????????????"User-Agent":?"Mozilla/5.0?(Windows?NT?6.1;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/75.0.3770.100?Safari/537.36", ????????????"cookie":?"__cfduid=db4c7fedc0b42d0ba4df71f0a6bb61b001564084956;;?_ga=GA1.2.314030298.1564084752;?_gid=GA1.2.2023032267.1564084752;?is_human=1;?client_width=1903;?cf_clearance=65c758669b4c70b8d7300c06185fc16df3861533-1564085107-1800-250;?_gat_UA-20223345-1=1" ????????} ????????self.url,?self.download_path?=?self.set_basic() ????def?set_basic(self): ????????_url?=?urljoin(self.BaseUrl,?quote(keyword)) ????????_download_Path?=?os.path.join(self.Path,?keyword) ????????if?not?os.path.exists(_download_Path): ????????????os.mkdir(_download_Path) ????????return?_url,?_download_Path ????def?get_url(self): ????????for?page?in?range(self.DefaultPages?+?1): ????????????parameter?=?{'pagi':?page} ????????????r?=?requests.get(self.url,?params=parameter,?headers=self.headers,?timeout=10) ????????????soup?=?BeautifulSoup(r.text,?'lxml') ????????????items?=?soup.find("div",?{"class":?"search_results"}).find_all("div",?{"class":?"item"}) ????????????for?item?in?items: ????????????????_img?=?item.a.img.attrs ????????????????link?=?_img.get("data-lazy-srcset")?or?_img.get("srcset") ????????????????alt?=?_img.get('alt') ????????????????t?=?threading.Thread(target=self.save_picture,?args=(link,?alt)) ????????????????t.start() ????????????????time.sleep(0.2) ????def?save_picture(self,?link,?alt): ????????_url?=?link.split('?1x')[0].replace('__340',?'_960_720') ????????_file_name?=?os.path.join(self.download_path,?alt?+?_url.split('/')[-1]) ????????r?=?requests.get(_url,?headers=self.headers,?timeout=5) ????????try: ????????????with?open(_file_name,?'wb')?as?f: ????????????????f.write(r.content) ????????????print("圖片{}下載完成".format(_file_name)) ????????except: ????????????print("圖片{}下載失敗".format(_file_name)) if?__name__?==?'__main__': ????keyword?=?str(input("請(qǐng)輸入所需下載圖片的關(guān)鍵字:")) ????main?=?PictureDownload() ????main.get_url()
來(lái)看看下載的效果,分別下載了圖書(shū)、編程分類的圖片,默認(rèn)每個(gè)類型下載5頁(yè)共1000張圖片,:
由于部分圖片鏈接失效,最終下載成功989張,總計(jì)內(nèi)存165MB….
另外,剛才讓保存alt的用處,現(xiàn)在就可以展示出來(lái)了,因?yàn)榫W(wǎng)站的圖片檢索也是通過(guò)關(guān)鍵字的,所以利用windows檢索功能就實(shí)現(xiàn)了類似網(wǎng)站的檢索操作:
是不是很炫酷?
The End
OK,今天的內(nèi)容就到這里,如果覺(jué)得內(nèi)容對(duì)你有所幫助,歡迎點(diǎn)擊文章右下角的“在看”。
期待你關(guān)注我的公眾號(hào)清風(fēng)Python,如果覺(jué)得不錯(cuò),希望能動(dòng)動(dòng)手指轉(zhuǎn)發(fā)給你身邊的朋友們。
在之后的周一至五清晨7點(diǎn)10分,希望都能讓清風(fēng)Python的知識(shí)文章叫醒大家!謝謝……
--------------
python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。