Il s'agit d'une API non officielle qui vous permet d'accéder à certaines des données d'AO3 (archiveofourown.org) via Python.
Utilisez le Package Manager PIP pour installer l'API AO3.
pip install ao3_api
https://github.com/armindoflores/ao3_api
Ce package est divisé en 9 modules de base: œuvres, chapitres, utilisateurs, séries, recherche, session, commentaires, supplémentaires et utils.
L'une des choses les plus élémentaires que vous voudrez peut-être faire avec ce package consiste à charger un travail et à vérifier ses statistiques et ses informations. Pour ce faire, vous aurez besoin de la classe AO3.Work
.
Nous commençons par trouver le travail du travail que nous voulons charger. Nous le faisons soit en utilisant AO3.utils.workid_from_url(url)
, soit en regardant simplement l'URL nous-mêmes. Jetons un coup d'œil:
import AO3
url = "https://archiveofourown.org/works/14392692/chapters/33236241"
workid = AO3 . utils . workid_from_url ( url )
print ( f"Work ID: { workid } " )
work = AO3 . Work ( workid )
print ( f"Chapters: { work . nchapters } " )
Après avoir exécuté cet extrait, nous obtenons la sortie:
Work ID: 14392692
Chapters: 46
Il est important de noter que certaines travaux peuvent ne pas être accessibles aux utilisateurs invités, et dans ce cas, vous obtiendrez 0 chapitres en sortie, et l'erreur AO3.utils.AuthError: This work is only available to registered users of the Archive
si vous essayez de le charger. Néanmoins, nous pouvons encore faire beaucoup plus avec cet objet de travail: essayons d'obtenir les 20 premiers mots du deuxième chapitre.
import AO3
work = AO3 . Work ( 14392692 )
print ( work . chapters [ 1 ]. title ) # Second chapter name
text = work . chapters [ 1 ]. text # Second chapter text
print ( ' ' . join ( text . split ( " " )[: 20 ]))
What Branches Grow Meaning
December 27, 2018
Christmas sucked this year, and Shouto’s got the black eye to prove it.
Things had started out well enough,
Les objets en travail AO3.Chapter
Ils ont beaucoup des mêmes propriétés qu'un objet Work
.
Une autre chose que vous pouvez faire avec l'objet Work est le téléchargement de l'ensemble du travail comme un PDF ou un livre électronique. Pour le moment, vous pouvez télécharger des œuvres en tant que fichiers AZW3, EPUB, HTML, MOBI et PDF.
import AO3
work = AO3 . Work ( 14392692 )
with open ( f" { work . title } .pdf" , "wb" ) as file :
file . write ( work . download ( "PDF" ))
Fonctionnalité avancée
Habituellement, lorsque vous appelez le constructeur de la classe Work
, toutes les informations à ce sujet sont chargées dans la fonction __init__()
. Cependant, ce processus prend un certain temps (~ 1-1,5 secondes) et si vous souhaitez charger une liste d'œuvres d'une série, par exemple, vous attendez peut-être plus de 30 secondes. Pour éviter ce problème, la fonction Work.reload()
, appelée à l'initialisation, est une fonction "threadable", ce qui signifie que si vous l'appelez avec l'argument threaded=True
, il renverra un objet Thread
et fonctionnera en parallèle, ce qui signifie que Vous pouvez charger plusieurs œuvres en même temps. Jetons un coup d'œil à une implémentation:
import AO3
import time
series = AO3 . Series ( 1295090 )
works = []
threads = []
start = time . time ()
for work in series . work_list :
works . append ( work )
threads . append ( work . reload ( threaded = True ))
for thread in threads :
thread . join ()
print ( f"Loaded { len ( works ) } works in { round ( time . time () - start , 1 ) } seconds." )
Loaded 29 works in 2.2 seconds.
Le load=False
à l'intérieur du constructeur Work
s'assure que nous ne chargeons pas le travail dès que nous créons une instance de la classe. En fin de compte, nous itons sur chaque fil et attendons le dernier pour terminer en utilisant .join()
. Comparons cette méthode avec le moyen standard de charger les œuvres AO3:
import AO3
import time
series = AO3 . Series ( 1295090 )
works = []
start = time . time ()
for work in series . work_list :
work . reload ()
works . append ( work )
print ( f"Loaded { len ( works ) } works in { round ( time . time () - start , 1 ) } seconds." )
Loaded 29 works in 21.6 seconds.
Comme nous pouvons le voir, il y a une augmentation significative des performances. Il existe d'autres fonctions dans ce package qui ont cette fonctionnalité. Pour voir si une fonction est "threadable", utilisez hasattr(function, "_threadable")
ou vérifiez sa chaîne __doc__
.
Pour économiser encore plus de temps, si vous êtes uniquement intéressé par les métadonnées, vous pouvez charger un travail avec l'option load_chapters
définie sur False. Sachez également que certaines fonctions (comme Series.work_list
ou Search.results
) peuvent retourner des objets Work
semi-chargés. Cela signifie qu'aucune demande n'a été faite pour charger ce travail (vous n'avez donc pas accès au texte du chapitre, aux notes, etc ...) mais presque toutes ses métadonnées auront déjà été mises en cache, et vous n'aurez peut-être pas besoin d'appeler Work.reload()
du tout.
La dernière information importante sur la classe Work
est que la plupart de ses propriétés (comme le nombre de signets, les félicitations, les noms des auteurs, etc ...) sont des propriétés mises en cache. Cela signifie qu'une fois que vous les vérifiez une fois, la valeur est stockée et elle ne changera jamais, même si ces valeurs changent. Pour mettre à jour ces valeurs, vous devrez appeler Work.reload()
. Voir l'exemple ci-dessous:
import AO3
sess = AO3 . GuestSession ()
work = AO3 . Work ( 16721367 , sess )
print ( work . kudos )
work . leave_kudos ()
work . reload ()
print ( work . kudos )
392
393
Une autre chose utile que vous voudrez peut-être faire est d'obtenir des informations sur qui a écrit qui fonctionne / commentaires. Pour cela, nous utilisons la classe AO3.User
.
import AO3
user = AO3 . User ( "bothersomepotato" )
print ( user . url )
print ( user . bio )
print ( user . works ) # Number of works published
https://archiveofourown.org/users/bothersomepotato
University student, opening documents to write essays but writing this stuff instead. No regrets though. My Tumblr, come chat with -or yell at- me if you feel like it! :)
2
Pour rechercher des œuvres, vous pouvez soit utiliser la fonction AO3.search()
et analyser l'objet BeautifulSoup renvoyé vous-même, soit utiliser la classe AO3.Search
pour le faire automatiquement pour vous.
import AO3
search = AO3 . Search ( any_field = "Clarke Lexa" , word_count = AO3 . utils . Constraint ( 5000 , 15000 ))
search . update ()
print ( search . total_results )
for result in search . results :
print ( result )
3074
<Work [five times lexa falls for clarke]>
<Work [an incomplete list of reasons (why Clarke loves Lexa)]>
<Work [five times clarke and lexa aren’t sure if they're a couple or not]>
<Work [Chemistry]>
<Work [The New Commander (Lexa Joining Camp Jaha)]>
<Work [Ode to Clarke]>
<Work [it's always been (right in front of me)]>
<Work [The Girlfriend Tag]>
<Work [The After-Heda Chronicles]>
<Work [The Counter]>
<Work [May We Meet Again]>
<Work [No Filter]>
<Work [The Games We Play]>
<Work [A l'épreuve des balles]>
<Work [Celebration]>
<Work [Another level of fucked up]>
<Work [(Don't Ever Want to Tame) This Wild Heart]>
<Work [Self Control]>
<Work [Winter]>
<Work [My only wish]>
Vous pouvez ensuite utiliser le WorkID pour charger l'une des œuvres que vous avez recherchées. Pour obtenir plus que les 20 premières œuvres, modifiez le numéro de page en utilisant
search . page = 2
De nombreuses actions que vous pourriez vouloir prendre pourraient nécessiter un compte AO3. Si vous en avez déjà un, vous pouvez accéder à ces actions à l'aide d'un objet AO3.Session. Vous commencez par vous connecter à l'aide de votre nom d'utilisateur et de votre mot de passe, puis vous pouvez utiliser cet objet pour accéder à un contenu restreint.
import AO3
session = AO3 . Session ( "username" , "password" )
print ( f"Bookmarks: { session . bookmarks } " )
session . refresh_auth_token ()
print ( session . kudos ( AO3 . Work ( 18001499 , load = False ))
Bookmarks: 67
True
Nous avons réussi à quitter les félicitations dans une œuvre et avons vérifié nos signets. Le session.refresh_auth_token()
est nécessaire pour certaines activités telles que la quitté les félicitations et les commentaires. S'il est expiré ou que vous oubliez d'appeler cette fonction, l'erreur AO3.utils.AuthError: Invalid authentication token. Try calling session.refresh_auth_token()
sera soulevé.
Vous pouvez également commenter / laisser des félicitations dans une œuvre en appelant Work.leave_kudos()
/ Work.comment()
et que vous avez déjà instancié cet objet avec une session ( AO3.Work(xxxxxx, session=sess)
ou en utilisant Work.set_session()
). C'est probablement la meilleure façon de le faire car vous rencontrerez des problèmes d'authentification moins (car le jeton d'authenticité de l'œuvre sera utilisé à la place).
Si vous préférez laisser un commentaire ou des félicitations de manière anonyme, vous pouvez utiliser un AO3.GuestSession
de la même manière que vous utiliseriez une session normale, sauf que vous ne pourrez pas vérifier vos signets, abonnements, etc. parce que vous n'est pas réellement connecté.
Pour récupérer et traiter les fils de commentaires, vous voudrez peut-être consulter la méthode Work.get_comments()
. Il renvoie tous les commentaires dans un chapitre spécifique et leurs fils respectifs. Vous pouvez ensuite les traiter comme vous le souhaitez. Jetons un coup d'œil:
from time import time
import AO3
work = AO3 . Work ( 24560008 )
work . load_chapters ()
start = time ()
comments = work . get_comments ( 5 )
print ( f"Loaded { len ( comments ) } comment threads in { round ( time () - start , 1 ) } seconds n " )
for comment in comments :
print ( f"Comment ID: { comment . id } n Replies: { len ( comment . get_thread ()) } " )
Loaded 5 comment threads in 1.8 seconds
Comment ID: 312237184
Replies: 1
Comment ID: 312245032
Replies: 1
Comment ID: 312257098
Replies: 1
Comment ID: 312257860
Replies: 1
Comment ID: 312285673
Replies: 2
Le chargement des commentaires prend très longtemps, vous devez donc essayer de l'utiliser le moins possible. Il entraîne également de nombreuses demandes à être envoyées aux serveurs AO3, ce qui pourrait entraîner l'obtention de l'erreur utils.HTTPError: We are being rate-limited. Try again in a while or reduce the number of requests
. Si cela se produit, vous devez essayer d'espacer vos demandes ou de réduire leur nombre. Il y a également la possibilité d'activer la limitation de la demande en utilisant AO3.utils.limit_requests()
, qui le rendent afin que vous ne puissiez pas faire plus que X demandes dans une certaine fenêtre de temps. Vous pouvez également répondre aux commentaires à l'aide de la fonction Comment.reply()
, ou supprimer un (si c'est le vôtre) en utilisant Comment.delete()
.
AO3.Extra contient le code pour télécharger des ressources supplémentaires qui ne sont pas core à la fonctionnalité de ce package et ne changent pas très souvent. Un exemple serait la liste des fandoms reconnus par AO3. Pour télécharger une ressource, utilisez simplement AO3.extra.download(resource_name)
. Pour télécharger toutes les ressources, vous pouvez utiliser AO3.extra.download_all()
. Pour voir la liste des ressources disponibles, utilisez AO3.extra.get_resources()
.
Pour plus d'informations ou des rapports de bogues, veuillez contacter [email protected].
Mit