Un mémo quand j'ai fait un script Python qui fait des photos Flickr dans Photos | PyCon JP 2014 à TOKYO. Selon le tableau ci-dessous
Que veux-tu faire | URI de l'API Flickr | Arguments de l'API Flickr |
---|---|---|
Obtenez une liste d'albums | flickr.photosets.getList | user_id |
Récupérez les photos dans l'album | flickr.photosets.getPhotos | photoset_id |
Obtenez l'URL de la photo | flickr.photos.getSizes | photo_id |
Je fais juste deux choses. C'était un peu surprenant que flickr.photos.getSizes contienne l'URL de la photo pour chaque taille.
Il y avait déjà des articles faisant quelque chose de similaire. Contrairement à cet article, il est utile d'obtenir le résultat en JSON et de configurer directement l'URL au lieu de flickr.photos.getSizes. Si la règle de configuration d'URL est ouverte, il est sage de la configurer vous-même plutôt que de frapper l'API.
Les prérequis sont les suivants:
De plus, l'article suivant sera utile pour l'introduction et l'utilisation des requêtes.
L'article suivant sera utile pour obtenir la clé API pour Flickr.
Quand je l'ai essayé pour la première fois avec Python2, cela n'a pas fonctionné, donc je prends des mesures d'urgence. Cela fonctionne avec Python2 pour le moment, mais je peux le réparer plus tard.
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"""
Utilisation de base
#Veuillez corriger en conséquence
api_key = 'ENTER_YOUR_API_KEY'
f = Flickr(api_key)
#utilisateur pyconjp_id
print(f.get_photoset_ids_from_user_id('102063383@N02'))
#Ensemble de photos PyCon JP 2014 Day4 Sprint_id
print(f.get_photos_from_photoset_id('72157647739640505'))
#Une des photos de l'ensemble de photos ci-dessus
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"""
utilisateur(user_id)Liste des identifiants d'album appartenant à(photset_Liste des identifiants)rends le
Pas nécessaire à cet effet
"""
#Envoyer une demande
r = requests.post(self.api_url, {'api_key': self.api_key,
'method': 'flickr.photosets.getList',
'user_id': user_id
})
#Analyser XML dans un objet dom
dom = md.parseString(r.text.encode('utf-8'))
#photoset de l'objet dom_Trouver un identifiant
result = []
for elem in dom.getElementsByTagName('photoset'):
result.append(elem.getAttribute('id'))
return result
def get_photos_from_photoset_id(self, photoset_id):
u"""
ID d'album(photset_id)Liste des photos dans(photo_Liste des identifiants)rends le
"""
#Envoyer une demande
r = requests.post(self.api_url, {'api_key': self.api_key,
'method': 'flickr.photosets.getPhotos',
'photoset_id': photoset_id
})
#Analyser XML dans un objet dom
dom = md.parseString(r.text.encode('utf-8'))
#photo de l'objet dom_Trouver un identifiant
result = []
for elem in dom.getElementsByTagName('photo'):
result.append(elem.getAttribute('id'))
return result
def get_url_from_photo_id(self, photo_id):
u"""
Photo(photo_id)Renvoie l'URL réellement stockée
"""
#Envoyer une demande
r = requests.post(self.api_url, {'api_key': self.api_key,
'method': 'flickr.photos.getSizes',
'photo_id': photo_id
})
#Analyser XML dans un objet dom
dom = md.parseString(r.text.encode('utf-8'))
#Trouvez l'URL de l'objet dom
result = None
for elem in dom.getElementsByTagName('size'):
#Seulement taille originale
if elem.getAttribute('label') == 'Original':
result = elem.getAttribute('source')
#Pensez à l'original comme un et sautez les autres
break
else:
#Aucun si rien
pass
return result
if __name__ == '__main__':
#Contrôle de fonctionnement
#Veuillez corriger en conséquence
api_key = 'ENTER_YOUR_API_KEY'
f = Flickr(api_key)
#utilisateur pyconjp_id
print(f.get_photoset_ids_from_user_id('102063383@N02'))
#Ensemble de photos PyCon JP 2014 Day4 Sprint_id
print(f.get_photos_from_photoset_id('72157647739640505'))
#Une des photos de l'ensemble de photos ci-dessus
print(f.get_url_from_photo_id('15274792845'))
Réécrivez'ENTER_YOUR_API_KEY'in main dans votre propre clé API
python flickr.py
Vous pouvez obtenir l'URL de l'image ci-dessous en exécutant.
Pour obtenir les URL en masse, vous pouvez importer ou copier flickr.py et procédez comme suit: Ici aussi, remplacez la partie ENTER_YOUR_API_KEY par votre propre clé API. De plus, une pause est attachée afin que cela ne prenne pas de temps lors de l'exécution du test, veuillez donc faire une pause lors de l'exécution réelle.
Si vous ne souhaitez pas spécifier de cibles, vous pouvez utiliser get_photoset_ids_from_user_id pour obtenir tous les albums d'un utilisateur spécifique, et vous pouvez l'utiliser. Cela donne l'impression de ramper.
>>> from collections import defaultdict
>>> api_key = 'ENTER_YOUR_API_KEY' #Veuillez corriger en conséquence
>>> f = Flickr(api_key)
>>> targets = ['72157641092641983', #Aperçu de PyCon JP 2014- 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: #Créer une liste de photos dans l'ensemble de photos
... d[elem] = f.get_photos_from_photoset_id(elem)
... break #prendre
>>> d2 = defaultdict(list)
>>> for k,v in d.items(): #Créer une liste d'URL de données
... for elem in v:
... d2[k].append(f.get_url_from_photo_id(elem))
... break #prendre
... break #prendre
>>> for k,v in d2.items(): #Obtenir des fichiers à l'aide de la liste d'URL
... if not os.path.exists(k):
... os.mkdir(k)
... for elem in v:
... r = requests.get(elem) #Récupérer les données de l'URL
... # photoset_id/nom de fichier.Enregistrer au format jpg
... with open("{0}/{1}".format(k, elem.split("/")[-1]), 'wb') as g:
... g.write(r.content)
Recommended Posts