舊版500px.com獲取圖片,新版還能用

相信看這篇文章的都知道500px.com這個網(wǎng)站把饭聚,提供了好多優(yōu)質(zhì)的圖片可以使用,但是網(wǎng)站的JS很強搁拙,只用右鍵是不能下載的秒梳,但是也可以Dev Tools看一下html代碼就可以找出來,不過也很麻煩箕速,如果要一張一張的下載的酪碘。
考慮:

  1. 網(wǎng)站這么多圖片,不可能一次性加載完盐茎,必定有接口
    查看了“Network”tab發(fā)現(xiàn)確實有一個加載完頁面之后兴垦,動態(tài)加載圖片調(diào)用的API
  2. 圖片點擊才會放大,之前是小的圖片字柠,說明圖片提供了多種尺寸的
    看API對用的GET參數(shù)發(fā)現(xiàn)探越,用一個數(shù)組形式的來定義的
  3. 使用PHP太簡單,還是用Python弄一個吧

代碼

現(xiàn)在網(wǎng)站更新了窑业,就得API/v1(第一個版本)更新為了API/v2扶关,網(wǎng)站所有的圖片格式都是用Google的webp,不在是之前的jpeg格式了数冬。
但是幸運的是現(xiàn)在還可以用是v1的接口节槐,不知道以后等v2穩(wěn)定了,v1是不是就down了拐纱。先不管那些铜异,現(xiàn)在v1還可以用。

#!/usr/bin/python3
# file-name : byId2.py

# get picture by id from 500px.com
# by Ray Lee
# raylee.bio#qq.com

###############################
# 20170825
# 還可以用秸架,但是網(wǎng)站吧所有圖片格式都換成了webp
# 怪不得打不開
###############################
import sys, requests, json, shutil, os
import re
from urllib import parse # added 2017.03.04

# determine the destination folder
if sys.platform == 'linux':
    destFolder = "/mnt/c/Users/xxx/Pictures/500px/"
    logFolder = destFolder+".cache/"
else:
    destFolder = "C:\\Users\\xxx\\Pictures\\500px\\"
    logFolder = destFolder+".cache\\"

def log(cur, ib):
    '''log to file and stderr'''
    log_file = logFolder + "{}.log".format(ib)
    if not os.path.exists(log_file):
        print("", file=open(log_file, 'w+'), end='')
    print(cur+"\n", file=open(log_file,"a"))

def id_existed_or_not(id):
    '''check if the image id has existed in the dest folder
    if yes, skip
    '''
    existedFiles = os.listdir(destFolder)
    for f in existedFiles:
        if f.startswith(ib+"_"):
            return True
    return False

def id_valid_or_not(id):
    ''' is the image id is valid'''
    if len(id) < 8:
        return False
    else:
        return True
def get_photo_urls(ib, headers):
    ''' get urls of given image ids [array]'''
    try:
        r = requests.get("https://api.500px.com/v1/photos", params={"expanded_user_info": True, "ids": ib, "image_size[]": 2048, "include_licensing": True, "include_releases": True, "include_tags": True},headers=headers2)
        cont = json.loads(r.text)
    except ConnectionError as e:
        raise e
    else:
        if 'error' in cont: # added 2017.4.30
            print("\n"+ str(cont['status']) +" "+ cont['error'])
            sys.exit(1)
        return cont["photos"]

def save_photo(dat):
    '''save image data to file'''
    img_file_name = re.sub(r'[:<>"/|?*\\]',"-",dat[0])
    img_file_name = parse.unquote(img_file_name)
    url = dat[1]
    if url.startswith("/photo"):
        url = 'https://drscdn.500px.org'+url
    res = requests.get(url, headers=headers3, stream=True)
    if res.status_code == 200:
        res.raw.decode_content = True
        with open(destFolder+img_file_name, mode="wb") as img_file:
            shutil.copyfileobj(res.raw, img_file)
        print("# \033[01;32m>>{}\033[00m".format(img_file_name), file=sys.stderr, flush=True)
    else:
        print("x \033[01;31m<<Error to download\033[00m", file=sys.stderr)

# ids 支持使用,分割的多個id同時請求
# 1. check id's validity
valid_ids = []
if __name__ == '__main__':
    inputs = sys.argv[1:]
    # 必須提供參數(shù)揍庄,至少一個
    if len(inputs) < 1:
        print("at least one augument required", file=sys.stderr)
        sys.exit(0)
    for ib in inputs:
        if id_existed_or_not(ib) == True:
            print(ib+" existed, skipped", file=sys.stderr, flush=True)
            continue
        if id_valid_or_not(ib) == False:
            print(ib+" invalid, skipped", file=sys.stderr, flush=True)
            continue
        valid_ids.append(ib)
    
    if len(valid_ids) < 1:
        print("no valid id")
        sys.exit(1)

    # 1.1 check if the url has been cached under .cache folder
    cached_ids = []
    cachedFiles = os.listdir(logFolder)
    for f in cachedFiles:
        if f.startswith(ib+"."):
            cached_ids.append(ib);
            valid_ids.remove(ib);

    # 2, fetch url of each id
    urlhub = get_photo_urls(','.join(valid_ids), headers)

    # 3, save images
    # 3.1 add cached urls
    if cached_ids:
        for x in cached_ids:
            y = open(logFolder+x+".log")
            z = json.loads(y.read())
            urlhub[x] = z
    # 3.2 iterate the url hub and save image stream
    for i in urlhub:
        cur   = urlhub[i]
        name  = cur["name"]
        ext   = 'webp' if True else cur["image_format"]
        url   = cur["image_url"][-1]
        suri  = cur["url"].split('/')[-1]
        fname = "{}_{}.{}".format(i, suri, ext)
        log(json.dumps(cur), i)
        save_photo([fname, url])

運行

  1. 配置要放置圖片的位置
  2. id_valid_or_not表示id至少需要8位數(shù),但是之前的一些圖片可能id會很小东抹,只是我下載的是否防止自己復制錯加的蚂子,你可以不用弄
  3. 現(xiàn)在是用的webp格式,默認瀏覽器可以打開缭黔,瀏覽器之不包括IE和Edge在內(nèi)的其他網(wǎng)頁瀏覽軟件食茎。
  4. headers headers2 headers3 包含個人信息,沒有包括在內(nèi)馏谨,需要的話可以發(fā)郵件給我别渔,但不公開。
python3 byId2.py 225733431 225576949
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哎媚,隨后出現(xiàn)的幾起案子喇伯,更是在濱河造成了極大的恐慌,老刑警劉巖拨与,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稻据,死亡現(xiàn)場離奇詭異,居然都是意外死亡买喧,警方通過查閱死者的電腦和手機捻悯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岗喉,“玉大人,你說我怎么就攤上這事炸庞∏玻” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵埠居,是天一觀的道長查牌。 經(jīng)常有香客問我,道長滥壕,這世上最難降的妖魔是什么纸颜? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮绎橘,結(jié)果婚禮上胁孙,老公的妹妹穿的比我還像新娘。我一直安慰自己称鳞,他們只是感情好涮较,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冈止,像睡著了一般狂票。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熙暴,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天闺属,我揣著相機與錄音,去河邊找鬼周霉。 笑死掂器,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的俱箱。 我是一名探鬼主播唉匾,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了巍膘?” 一聲冷哼從身側(cè)響起厂财,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎峡懈,沒想到半個月后璃饱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肪康,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年荚恶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磷支。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡谒撼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雾狈,到底是詐尸還是另有隱情廓潜,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布善榛,位于F島的核電站辩蛋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏移盆。R本人自食惡果不足惜悼院,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咒循。 院中可真熱鬧据途,春花似錦、人聲如沸叙甸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚁署。三九已至便脊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間光戈,已是汗流浹背哪痰。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留久妆,地道東北人晌杰。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像筷弦,于是被迫代替她去往敵國和親肋演。 傳聞我的和親對象是個殘疾皇子抑诸,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)爹殊,斷路器蜕乡,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件梗夸、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 橋邊松苓紅藥盡 北方苦寒,就算盛夏也帶著凜冽的影子呜魄。不是高堂明鏡悲白了頭發(fā)悔叽,是歲月白雪染了青絲莱衩,成...
    任宣閱讀 702評論 0 1
  • 丫的爵嗅,看下來特別酣暢淋漓。 男男女女笨蚁,北京人兒睹晒,好俠義。一方水土一方人括细,皇城腳下伪很,曾經(jīng)帝都,不保留些什么奋单,怎對得起...
    深海綠妖閱讀 264評論 1 2