Dies ist eine inoffizielle API, mit der Sie über Python auf einige der Daten von AO3 (archiveOfourown.org) zugreifen können.
Verwenden Sie die Paket -Manager -PIP, um die AO3 -API zu installieren.
pip install ao3_api
https://github.com/armindoflores/ao3_api
Dieses Paket ist in 9 Kernmodulen unterteilt: Werke, Kapitel, Benutzer, Serien, Suche, Sitzung, Kommentare, Extra und Utils.
Eines der grundlegendsten Dinge, die Sie vielleicht mit diesem Paket machen möchten, ist das Laden einer Arbeit und das Überprüfen ihrer Statistiken und Informationen. Dazu benötigen Sie die AO3.Work
-Klasse.
Wir beginnen damit, die Arbeit der Arbeit zu finden, die wir laden möchten. Wir tun dies entweder mit AO3.utils.workid_from_url(url)
oder indem wir nur die URL selbst betrachten. Schauen wir uns an:
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 } " )
Nach dem Ausführen dieses Snippets erhalten wir die Ausgabe:
Work ID: 14392692
Chapters: 46
Es AO3.utils.AuthError: This work is only available to registered users of the Archive
wichtig zu beachten Versuchen Sie, es zu laden. Trotzdem können wir mit diesem Arbeitsobjekt noch viel mehr tun: Versuchen wir, die ersten 20 Wörter des zweiten Kapitels zu erhalten.
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,
Die Objekte in der Arbeit. Kapitel sind vom Typ AO3.Chapter
. Sie haben viele der gleichen Eigenschaften wie ein Work
.
Eine andere Sache, die Sie mit dem Arbeitsobjekt machen können, ist das Download der gesamten Arbeit als PDF oder E-Book. Im Moment können Sie herunterladen als AZW3-, EPUB-, HTML-, MOBI- und PDF -Dateien.
import AO3
work = AO3 . Work ( 14392692 )
with open ( f" { work . title } .pdf" , "wb" ) as file :
file . write ( work . download ( "PDF" ))
Erweiterte Funktionalität
Wenn Sie den Konstruktor für die Work
anrufen, werden in der Funktion __init__()
normalerweise alle Informationen darüber geladen. Dieser Prozess dauert jedoch einige Zeit (~ 1-1,5 Sekunden). Wenn Sie beispielsweise eine Liste von Werken aus einer Serie laden möchten, warten Sie möglicherweise auf mehr als 30 Sekunden. Um dieses Problem zu vermeiden, ist die Funktion Work.reload()
, die in der Initialisierung aufgerufen wird, eine "threadable" Funktion, was bedeutet, dass es ein Thread
-Objekt zurückgibt und parallel funktioniert, wenn Sie sie mit dem Argument threaded=True
aufrufen. Sie können mehrere Arbeiten gleichzeitig laden. Schauen wir uns eine Implementierung an:
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.
Die load=False
innerhalb des Work
stellt sicher, dass wir die Arbeit nicht laden, sobald wir eine Instanz der Klasse erstellen. Am Ende iterieren wir über jeden Thread und warten, bis der letzte mit .join()
fertig ist. Vergleichen wir diese Methode mit der Standard- laden -AO3 -Funktionen:
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.
Wie wir sehen können, gibt es eine erhebliche Leistungssteigerung. Es gibt andere Funktionen in diesem Paket, die diese Funktionalität haben. Um festzustellen, ob eine Funktion "Threadable" ist, verwenden Sie entweder hasattr(function, "_threadable")
oder überprüfen Sie die __doc__
-Zeichenfolge.
Um noch mehr Zeit zu sparen, können Sie, wenn Sie nur an Metadaten interessiert sind, eine Arbeit mit der Option load_chapters
auf false laden. Beachten Sie auch, dass einige Funktionen (wie Series.work_list
oder Search.results
) halbbelastete Work
zurückgeben könnten. Dies bedeutet, dass keine Anfragen gestellt wurden, um diese Arbeit zu laden (damit Sie keinen Zugriff auf Kapiteltext, Notizen usw. haben), aber fast alle Metadaten werden bereits zwischengespeichert, und Sie müssen möglicherweise nicht anrufen Work.reload()
überhaupt.
Die letzte wichtige Informationen über die Work
sind, dass die meisten Eigenschaften (wie die Anzahl der Lesezeichen, ein Lob, die Namen der Autoren usw.) zwischengespeicherte Eigenschaften sind. Das bedeutet, dass der Wert gespeichert wird, sobald Sie sie einmal überprüfen, und er wird sich nie ändern, selbst wenn sich diese Werte ändern. Um diese Werte zu aktualisieren, müssen Sie Work.reload()
anrufen. Siehe das Beispiel unten:
import AO3
sess = AO3 . GuestSession ()
work = AO3 . Work ( 16721367 , sess )
print ( work . kudos )
work . leave_kudos ()
work . reload ()
print ( work . kudos )
392
393
Eine weitere nützliche Sache, die Sie vielleicht tun möchten, ist, Informationen darüber zu erhalten, wer geschrieben hat, was funktioniert / kommentiert. Dafür verwenden wir die AO3.User
-Klasse.
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
Um nach Arbeiten zu suchen, können Sie entweder die Funktion AO3.search()
verwenden und das wunderschöne Anteilsobjekt analysieren oder die AO3.Search
-Klasse verwenden, um dies automatisch für Sie zu tun.
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]>
Sie können dann die WorkID verwenden, um eines der Arbeiten zu laden, nach denen Sie gesucht haben. Ändern Sie die Seitenzahl mithilfe der ersten 20 Werke mit mehr als die ersten 20 Werke
search . page = 2
Viele Aktionen, die Sie möglicherweise ergreifen möchten, benötigen möglicherweise ein AO3 -Konto. Wenn Sie bereits einen haben, können Sie diese Aktionen mit einem AO3.Session -Objekt zugreifen. Sie beginnen mit der Verwendung Ihres Benutzernamens und Ihres Kennworts und können dann dieses Objekt verwenden, um auf auf auf eingespannenten Inhalte zuzugreifen.
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
Wir haben ein großes Lob in einer Arbeit gelassen und unsere Lesezeichen überprüft. Die session.refresh_auth_token()
. Wenn es abgelaufen ist oder Sie vergessen, diese Funktion aufzurufen, ist der Fehler AO3.utils.AuthError: Invalid authentication token. Try calling session.refresh_auth_token()
anzurufen.
Sie können ein Lob in einer Arbeit auch kommentieren / verlassen, indem Sie Work.leave_kudos()
Work.set_session()
Work.comment()
anrufen und bereitgestellt haben, dass Sie dieses Objekt mit einer AO3.Work(xxxxxx, session=sess)
bereits instanziiert haben Work.set_session()
). Dies ist wahrscheinlich der beste Weg, dies zu tun, da Sie auf weniger Authentifizierungsprobleme stoßen (da stattdessen das Authentizitäts -Token der Arbeit verwendet wird).
Wenn Sie es vorziehen möchten, einen Kommentar oder ein großes Lob anonym zu hinterlassen, können Sie eine AO3.GuestSession
auf die gleiche Weise verwenden, wie Sie eine normale Sitzung verwenden würden, außer dass Sie Ihre Lesezeichen, Abonnements usw. nicht überprüfen können, weil Sie ' Ich habe mich nicht wirklich angemeldet.
Um Kommentarfilmer abzurufen und zu verarbeiten, möchten Sie sich möglicherweise die Methode der Work.get_comments()
ansehen. Es gibt alle Kommentare in einem bestimmten Kapitel und ihren jeweiligen Themen zurück. Sie können sie dann verarbeiten, wie Sie möchten. Schauen wir uns an:
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
Das Laden von Kommentaren dauert sehr lange, sodass Sie versuchen sollten, es so wenig wie möglich zu verwenden. Es führt auch dazu utils.HTTPError: We are being rate-limited. Try again in a while or reduce the number of requests
dass viele Anfragen an die AO3-Server gesendet werden. utils.HTTPError: We are being rate-limited. Try again in a while or reduce the number of requests
. In diesem Fall sollten Sie versuchen, Ihre Anfragen zu platzieren oder ihre Anzahl zu reduzieren. Es gibt auch die Option, die Anfrage einschränken zu können, indem Sie AO3.utils.limit_requests()
einschränken, was sie in einem bestimmten Zeitfenster nicht mehr als X -Anfragen stellen können. Sie können auch auf Kommentare mit der Funktion Comment.reply()
antworten oder eine (falls es Ihnen gehört) unter Comment.delete()
löschen.
AO3.extra enthält den Code, um einige zusätzliche Ressourcen herunterzuladen, die nicht der Funktionalität dieses Pakets sind und sich nicht sehr oft ändern. Ein Beispiel wäre die Liste der von AO3 erkannten Fandoms. Um eine Ressource herunterzuladen, verwenden Sie einfach AO3.extra.download(resource_name)
. Um jede Ressource herunterzuladen, können Sie AO3.extra.download_all()
verwenden. Um die Liste der verfügbaren Ressourcen anzuzeigen, verwenden Sie AO3.extra.get_resources()
.
Für Informationen oder Fehlerberichte wenden Sie sich bitte an [email protected].
MIT