python讓你再也不為文章配圖與素材發(fā)愁异希,讓高清圖片占滿你的硬盤健盒!

怪毛病

最近寫公眾號(hào)寫的染上了個(gè)怪毛病,不到12點(diǎn)根本不知道寫啥。一過凌晨那簡(jiǎn)直是吃了大回復(fù)一般的文思泉涌扣癣。結(jié)果就是越熬夜越晚了.公眾號(hào)是每天定時(shí)發(fā)的惰帽,簡(jiǎn)書上的發(fā)帖時(shí)間才是真正的睡前倒計(jì)時(shí)...然后,來看看都是幾點(diǎn)睡的:


簡(jiǎn)書發(fā)文時(shí)間

為什么這么有精神父虑?因?yàn)槲椅洚?dāng)王也改投了全真教该酗,習(xí)得重陽真人一身武學(xué)典籍,本著不藏私的心態(tài)士嚎,在這里共享給大家呜魄,請(qǐng)叫我雷鋒:

大道初修通九竅 九竅原在尾閭穴
先從涌泉腳底沖 涌泉沖過漸至膝
膝過徐徐至尾閭 泥丸頂上回旋急
秘語師傳悟本初 來時(shí)無余去無蹤
歷年塵垢揩磨凈 遍體靈明耀太虛
修真活記有何憑 心死群情今不生
精氣充盈功行具 靈光照耀滿神京
金鎖關(guān)穿下鵲橋 重樓十二降宮室

電腦硬盤里的圖片

收藏夾的照片(硬盤里的女神)看了又刪,去年夏天后就沒聊過天...很久前有這么一首歌很火莱衩,不知道大家聽過沒爵嗅,只是括號(hào)里的歌詞被改成了現(xiàn)在的樣子。那么笨蚁,你們以為我今晚要開車睹晒?NONONO...
每天做公眾號(hào),最愁的兩件事括细,一是選題伪很,二是公眾號(hào)配圖。不知道寫什么勒极,比寫代碼遇到坑更讓人發(fā)愁是掰。那么配圖呢?配圖的坑主要在于辱匿,選擇的圖首先要有美感或者和文章主題有所關(guān)聯(lián)键痛,最重要的是你選擇的圖必須是沒有版權(quán)的。不然容易遭到投訴...網(wǎng)上推薦了很多免費(fèi)的床圖網(wǎng)站匾七,我一直用的是pixabay

收藏夾

很多床圖網(wǎng)站為什么選擇它絮短?一個(gè)是這個(gè)網(wǎng)站有百度云加速,雖然速度還是很卡(同樣這里也是個(gè)坑昨忆,一會(huì)兒解釋)丁频,而且預(yù)覽圖片時(shí),不會(huì)添加網(wǎng)站的水印邑贴,你可以通過f12獲取url的方式去下載圖片席里,而無需注冊(cè)后點(diǎn)進(jìn)行下載,但是每次通過f12獲取url的方式下載圖片拢驾,有點(diǎn)太耗費(fèi)時(shí)間了奖磁,所以今天就教大家通過python自動(dòng)下載網(wǎng)站的所有圖片,并巧妙實(shí)現(xiàn)網(wǎng)站的搜索引擎功能繁疤。

先來填個(gè)坑
大坑解析

上面說到了咖为,網(wǎng)站支持百度云加速秕狰,但同樣的百度為了判斷你是否為爬蟲訪問,會(huì)對(duì)瀏覽器進(jìn)行監(jiān)測(cè)躁染。首次訪問網(wǎng)站(有的運(yùn)氣好會(huì)訪問幾次后出現(xiàn)驗(yàn)證...)鸣哀,需要填寫驗(yàn)證碼確認(rèn)非程序爬蟲。之后才能正常使用吞彤。

百度云監(jiān)測(cè)

但如果是拿requests進(jìn)行url訪問下載我衬,怎么去破解?網(wǎng)上很多說什么js獲取驗(yàn)證的备畦,對(duì)于requests來說都不靠譜低飒,當(dāng)然你可以換成selenium前臺(tái)模擬瀏覽器操作解析驗(yàn)證碼然后去下載,先不說這驗(yàn)證碼解析成果率多低懂盐,selenium的爬蟲速度能和requests比?
我們?cè)撊绾谓鉀Q這個(gè)問題糕档?我們先老老實(shí)實(shí)的輸入驗(yàn)證碼莉恼,然后看下面這張圖:
cookie有效時(shí)間

pixabay.com網(wǎng)站存在7個(gè)cookie(顯示9個(gè)是另外一個(gè)網(wǎng)站的...),然后一個(gè)一個(gè)查每個(gè)cookie的詳細(xì)信息速那,連蒙帶猜+驗(yàn)證俐银,最后確定了,控制百度云的cookie有效期是通過cf_clearance時(shí)間來控制的端仰,有效時(shí)長(zhǎng)為一個(gè)半小時(shí)捶惜!
喜歡鉆研的朋友可以考慮怎么修改這個(gè)時(shí)間,但對(duì)我來說荔烧,一個(gè)半小時(shí)夠做太多東西了...

requests跳過百度云監(jiān)測(cè)

知道了是由于cookie驗(yàn)證導(dǎo)致的訪問異常吱七,那我們?cè)撛趺醋觯?strong>通過headers添加cookie!

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清風(fēng)Python
# @Date     : 2019/7/25 23:55
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : picture_download.py


import requests
from bs4 import BeautifulSoup

headers = {
    "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=dd2de4b5c79a4979c835e6925d31ad9741563739527; lang=zh; _ga=GA1.2.1567947853.1563739352; is_human=1; _gid=GA1.2.366594473.1564068124; cf_clearance=bb9e4a5a869c0a90e552c4a1f4e1dccc67dc021f-1564074082-1800-250; client_width=1903"
}
#
r =requests.get('https://pixabay.com/zh/images/search/',headers=headers)
print(r.text)
爬蟲成功訪問
網(wǎng)站爬蟲分析
再來個(gè)坑

剛才說了網(wǎng)站的圖片是動(dòng)態(tài)加載的鹤竭,這個(gè)有什么坑呢踊餐?代碼說話:

import requests
from bs4 import BeautifulSoup

headers = {
    "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=dd2de4b5c79a4979c835e6925d31ad9741563739527; lang=zh; _ga=GA1.2.1567947853.1563739352; is_human=1; _gid=GA1.2.366594473.1564068124; cf_clearance=2dfa6eddfa8309a53f97f2682d2fccf03ec6d4e2-1564078000-1800-250; client_width=1028"
}
#
r = requests.get('https://pixabay.com/zh/images/search/%E4%B9%A6/?pagi=4', headers=headers)
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
    print(img.attrs)

url解析的坑

我們會(huì)發(fā)現(xiàn)前十幾張的url鏈接保存在srcset中,而之后的80+張圖片他的url包裹在data-lazy-srcset中,后者的src也是默認(rèn)的blank.gif的空白幕布臀稚,還么來得及把圖片刷出來...
所以爬蟲的時(shí)候我們需要小心了…如何快捷的判斷到底使用哪個(gè)attr吝岭?這里用到一個(gè)python的 or方法,舉個(gè)例子:

b = None or "abc"
b
>>> 'abc'
b = "abc" or None
b
>>> 'abc'

這樣大家明白了吧吧寺,我們只需要 img.attrs.get('srcset')即可窜管。
只有你摳細(xì)節(jié),才能成長(zhǎng)稚机!所以我問你幕帆,srcset放在or前還是data-lazy-srcset放在or前?再看一個(gè)例子:

b = "abc" or 0/0
b
>>> 'abc'
b =  0/0 or 'abc'
>>> Traceback (most recent call last):
  File "<input>", line 1, in <module>
ZeroDivisionError: division by zero

當(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后的編碼退个,通過from urllib.parse import quote即可獲取募壕,然后就是page的數(shù)字通過for循環(huán)匹配即可。

小技巧2:保存圖片你索引

這里可是一個(gè)彩蛋了语盈!大家都知道img一般都有一個(gè)alt的選項(xiàng)舱馅,即當(dāng)圖片顯示不出來時(shí),通過alt告訴大家這個(gè)圖片是干嘛的刀荒!比如這些:

圖片alt

如果我們?cè)诒4鎴D片的時(shí)候?qū)D片名字中添加alt索引代嗤,之后我們通過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替換為_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; lang=zh; _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()

來看看下載的效果,分別下載了圖書屠阻、編程分類的圖片红省,默認(rèn)每個(gè)類型下載5頁共1000張圖片,:


圖片下載.gif

由于部分圖片鏈接失效国觉,最終下載成功989張吧恃,總計(jì)內(nèi)存165MB....


下載效果

另外,剛才讓保存alt的用處麻诀,現(xiàn)在就可以展示出來了痕寓,因?yàn)榫W(wǎng)站的圖片檢索也是通過關(guān)鍵字的傲醉,所以利用windows檢索功能就實(shí)現(xiàn)了類似網(wǎng)站的檢索操作:
檢索功能

是不是很炫酷?

The End

OK,今天的內(nèi)容就到這里呻率,如果覺得內(nèi)容對(duì)你有所幫助硬毕,歡迎點(diǎn)擊文章右下角的“在看”。
期待你關(guān)注我的公眾號(hào)清風(fēng)Python礼仗,如果覺得不錯(cuò)吐咳,希望能動(dòng)動(dòng)手指轉(zhuǎn)發(fā)給你身邊的朋友們。
在之后的周一至五清晨7點(diǎn)10分元践,希望都能讓清風(fēng)Python的知識(shí)文章叫醒大家韭脊!謝謝……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市单旁,隨后出現(xiàn)的幾起案子沪羔,更是在濱河造成了極大的恐慌,老刑警劉巖慎恒,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件任内,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡融柬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門趋距,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粒氧,“玉大人,你說我怎么就攤上這事节腐⊥舛ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵翼雀,是天一觀的道長(zhǎng)饱苟。 經(jīng)常有香客問我,道長(zhǎng)狼渊,這世上最難降的妖魔是什么箱熬? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮狈邑,結(jié)果婚禮上城须,老公的妹妹穿的比我還像新娘。我一直安慰自己米苹,他們只是感情好糕伐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蘸嘶,像睡著了一般良瞧。 火紅的嫁衣襯著肌膚如雪陪汽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天褥蚯,我揣著相機(jī)與錄音挚冤,去河邊找鬼。 笑死遵岩,一個(gè)胖子當(dāng)著我的面吹牛你辣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尘执,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼舍哄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了誊锭?” 一聲冷哼從身側(cè)響起表悬,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丧靡,沒想到半個(gè)月后蟆沫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡温治,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年饭庞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熬荆。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舟山,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卤恳,到底是詐尸還是另有隱情累盗,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布突琳,位于F島的核電站若债,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拆融。R本人自食惡果不足惜蠢琳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冠息。 院中可真熱鬧挪凑,春花似錦、人聲如沸逛艰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至菇绵,卻和暖如春肄渗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咬最。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工翎嫡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人永乌。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓惑申,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親翅雏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子圈驼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 前言 最近學(xué)習(xí)數(shù)據(jù)分析的時(shí)候,突然對(duì)網(wǎng)絡(luò)爬蟲有了興趣望几,經(jīng)過一些練習(xí)和資料的參考绩脆,編寫了一些簡(jiǎn)單的爬蟲代碼,今天橄抹,我...
    Epiphron閱讀 1,770評(píng)論 0 50
  • 今天有點(diǎn)久違的心口痛靴迫。 周末有一節(jié)課,講到心理模塊的內(nèi)容楼誓,講完之后同學(xué)們?cè)谟懻撟约旱膯栴}玉锌。我沒怎么參與,一是刷屏太...
    星星的Neverland閱讀 103評(píng)論 0 0
  • 前幾天微信有人突然加我疟羹,后來才發(fā)現(xiàn)是老家的一位高我一屆的女生芬沉,聽說我在同一個(gè)城市,立馬加我阁猜,然后激動(dòng)地說來了十幾年...
    嘗酥品甜閱讀 80評(píng)論 0 0
  • 三年三班張翊桓讀書30分鐘《同步作文》第二十四天
    小爽_b501閱讀 183評(píng)論 0 0
  • 腐朽的味道 You make me suke 滿室破爛 蜘蛛網(wǎng)繁雜 木頭人街邊嘻戲 你在窗前 滿滿臟話 猙獰吵架 ...
    Alice的書包閱讀 142評(píng)論 0 0