旧版500px.com获取图片,新版还能用

相信看这篇文章的都知道500px.com这个网站把,提供了好多优质的图片可以使用,但是网站的JS很强,只用右键是不能下载的,但是也可以Dev Tools看一下html代码就可以找出来,不过也很麻烦,如果要一张一张的下载的。
考虑:

  1. 网站这么多图片,不可能一次性加载完,必定有接口
    查看了“Network”tab发现确实有一个加载完页面之后,动态加载图片调用的API
  2. 图片点击才会放大,之前是小的图片,说明图片提供了多种尺寸的
    看API对用的GET参数发现,用一个数组形式的来定义的
  3. 使用PHP太简单,还是用Python弄一个吧

代码

现在网站更新了,就得API/v1(第一个版本)更新为了API/v2,网站所有的图片格式都是用Google的webp,不在是之前的jpeg格式了。
但是幸运的是现在还可以用是v1的接口,不知道以后等v2稳定了,v1是不是就down了。先不管那些,现在v1还可以用。

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

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

###############################
# 20170825
# 还可以用,但是网站吧所有图片格式都换成了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:]
    # 必须提供参数,至少一个
    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位数,但是之前的一些图片可能id会很小,只是我下载的是否防止自己复制错加的,你可以不用弄
  3. 现在是用的webp格式,默认浏览器可以打开,浏览器之不包括IE和Edge在内的其他网页浏览软件。
  4. headers headers2 headers3 包含个人信息,没有包括在内,需要的话可以发邮件给我,但不公开。
python3 byId2.py 225733431 225576949
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,258评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,559评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,975评论 4 60
  • 桥边松苓红药尽 北方苦寒,就算盛夏也带着凛冽的影子。不是高堂明镜悲白了头发,是岁月白雪染了青丝,成...
    任宣阅读 695评论 0 1
  • 丫的,看下来特别酣畅淋漓。 男男女女,北京人儿,好侠义。一方水土一方人,皇城脚下,曾经帝都,不保留些什么,怎对得起...
    深海绿妖阅读 258评论 1 2