Ein Memo, als ich ein Python-Skript erstellt habe, mit dem Flickr-Fotos in [Fotos | PyCon JP 2014 in TOKYO] erstellt werden (https://pycon.jp/2014/reports/photos/). Nach der folgenden Tabelle
Was willst du tun | Flickr API URI | Flickr-API-Argumente |
---|---|---|
Holen Sie sich eine Liste der Alben | flickr.photosets.getList | user_id |
Holen Sie sich die Fotos in das Album | flickr.photosets.getPhotos | photoset_id |
Holen Sie sich die URL des Fotos | flickr.photos.getSizes | photo_id |
Ich mache nur zwei Dinge. Es war ein wenig überraschend, dass flickr.photos.getSizes die URL des Fotos für jede Größe enthielt.
Es gab bereits einige Artikel, die etwas Ähnliches taten. Im Gegensatz zu diesem Artikel ist es hilfreich, das Ergebnis in JSON abzurufen und die URL anstelle von flickr.photos.getSizes direkt zu konfigurieren. Wenn die URL-Konfigurationsregel geöffnet ist, ist es ratsam, sie selbst zu konfigurieren, anstatt auf die API zuzugreifen.
Die Voraussetzungen sind wie folgt:
Darüber hinaus ist der folgende Artikel hilfreich für die Einführung und Verwendung von Anforderungen.
Der folgende Artikel ist hilfreich beim Erwerb von Flickr-API-Schlüsseln.
Als ich es zum ersten Mal mit Python2 ausprobiert habe, hat es nicht funktioniert, daher ergreife ich einige Notfallmaßnahmen. Es funktioniert vorerst mit Python2, aber ich kann es später beheben.
flickr.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import requests
import xml.dom.minidom as md
class Flickr(object):
u"""
Grundlegende Verwendung
#Bitte entsprechend korrigieren
api_key = 'ENTER_YOUR_API_KEY'
f = Flickr(api_key)
#pyconjp Benutzer_id
print(f.get_photoset_ids_from_user_id('102063383@N02'))
#PyCon JP 2014 day4 Sprint Photoset Fotoset_id
print(f.get_photos_from_photoset_id('72157647739640505'))
#Eines der Fotos im obigen Fotoset
print(f.get_url_from_photo_id('15274792845'))
"""
def __init__(self, api_key):
self.api_url = 'https://api.flickr.com/services/rest/'
self.api_key = api_key
def get_photoset_ids_from_user_id(self, user_id):
u"""
Nutzer(user_id)Liste der Album-IDs von(photset_Liste der IDs)Gib es zurück
Nicht notwendig für diesen Zweck
"""
#Anfrage senden
r = requests.post(self.api_url, {'api_key': self.api_key,
'method': 'flickr.photosets.getList',
'user_id': user_id
})
#Analysieren Sie XML in ein Dom-Objekt
dom = md.parseString(r.text.encode('utf-8'))
#Fotoset vom Dom-Objekt_ID finden
result = []
for elem in dom.getElementsByTagName('photoset'):
result.append(elem.getAttribute('id'))
return result
def get_photos_from_photoset_id(self, photoset_id):
u"""
Album-ID(photset_id)Liste der Fotos in(photo_Liste der IDs)Gib es zurück
"""
#Anfrage senden
r = requests.post(self.api_url, {'api_key': self.api_key,
'method': 'flickr.photosets.getPhotos',
'photoset_id': photoset_id
})
#Analysieren Sie XML in ein Dom-Objekt
dom = md.parseString(r.text.encode('utf-8'))
#Foto vom dom Objekt_ID finden
result = []
for elem in dom.getElementsByTagName('photo'):
result.append(elem.getAttribute('id'))
return result
def get_url_from_photo_id(self, photo_id):
u"""
Foto(photo_id)Gibt die tatsächlich gespeicherte URL zurück
"""
#Anfrage senden
r = requests.post(self.api_url, {'api_key': self.api_key,
'method': 'flickr.photos.getSizes',
'photo_id': photo_id
})
#Analysieren Sie XML in ein Dom-Objekt
dom = md.parseString(r.text.encode('utf-8'))
#Suchen Sie die URL aus dem dom-Objekt
result = None
for elem in dom.getElementsByTagName('size'):
#Nur Originalgröße
if elem.getAttribute('label') == 'Original':
result = elem.getAttribute('source')
#Stellen Sie sich das Original als eines vor und überspringen Sie die anderen
break
else:
#Keine wenn nichts
pass
return result
if __name__ == '__main__':
#Funktionsprüfung
#Bitte entsprechend korrigieren
api_key = 'ENTER_YOUR_API_KEY'
f = Flickr(api_key)
#pyconjp Benutzer_id
print(f.get_photoset_ids_from_user_id('102063383@N02'))
#PyCon JP 2014 day4 Sprint Photoset Fotoset_id
print(f.get_photos_from_photoset_id('72157647739640505'))
#Eines der Fotos im obigen Fotoset
print(f.get_url_from_photo_id('15274792845'))
Schreiben Sie'ENTER_YOUR_API_KEY'in main in Ihren eigenen API-Schlüssel
python flickr.py
Sie können die URL des Bildes unten durch Ausführen erhalten.
Um die URLs in großen Mengen zu erhalten, können Sie flickr.py entweder importieren oder kopieren und Folgendes tun: Ändern Sie auch hier den Teil ENTER_YOUR_API_KEY in Ihren eigenen API-Schlüssel. Außerdem wird eine Pause angehängt, damit beim Ausführen des Tests keine Zeit benötigt wird. Machen Sie daher bei der tatsächlichen Ausführung eine Pause.
Wenn Sie keine Ziele angeben möchten, können Sie get_photoset_ids_from_user_id verwenden, um alle Alben eines bestimmten Benutzers abzurufen, und Sie können dies verwenden. Dadurch sieht es aus wie Krabbeln.
>>> from collections import defaultdict
>>> api_key = 'ENTER_YOUR_API_KEY' #Bitte entsprechend korrigieren
>>> f = Flickr(api_key)
>>> targets = ['72157641092641983', #PyCon JP 2014 Vorschau- an album on Flickr
... '72157647111767068', # PyCon JP 2014 day1 Tutorial - an album on Flickr
... '72157647184237569', # PyCon JP 2014 day2 Conference - an album on Flickr
... '72157647216509890', # PyCon JP 2014 day3 Conference - an album on Flickr
... '72157647739640505' # PyCon JP 2014 day4 Sprint - an album on Flickr
... ]
>>> d = {}
>>> for elem in targets: #Erstellen Sie eine Liste mit Fotos im Fotoset
... d[elem] = f.get_photos_from_photoset_id(elem)
... break #nehmen
>>> d2 = defaultdict(list)
>>> for k,v in d.items(): #Erstellen Sie eine URL-Liste mit Daten
... for elem in v:
... d2[k].append(f.get_url_from_photo_id(elem))
... break #nehmen
... break #nehmen
>>> for k,v in d2.items(): #Holen Sie sich Dateien mithilfe der URL-Liste
... if not os.path.exists(k):
... os.mkdir(k)
... for elem in v:
... r = requests.get(elem) #Daten von URL abrufen
... # photoset_id/Dateiname.Als jpg speichern
... with open("{0}/{1}".format(k, elem.split("/")[-1]), 'wb') as g:
... g.write(r.content)
Recommended Posts