Это неофициальный API, который позволяет вам получить доступ к некоторым данным AO3 (archiveofourown.org) через Python.
Используйте диспетчер пакетов PIP для установки API AO3.
pip install ao3_api
https://github.com/armindoflores/ao3_api
Этот пакет делится на 9 основных модулей: работы, главы, пользователи, серии, поиск, сеанс, комментарии, дополнительные и утильски.
Одна из самых основных вещей, которые вы, возможно, захотите сделать с этим пакетом, - это загрузка работы и проверка его статистики и информации. Для этого вам понадобится класс AO3.Work
.
Мы начинаем с поиска работой работы, которую хотим загрузить. Мы делаем это либо с помощью AO3.utils.workid_from_url(url)
либо просто посмотрев на URL. Посмотрим:
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 } " )
После запуска этого фрагмента мы получаем выход:
Work ID: 14392692
Chapters: 46
Важно отметить, что некоторые работы могут быть не доступны для приглашенных пользователей, и в этом случае вы получите 0 глав в качестве вывода, и ошибка AO3.utils.AuthError: This work is only available to registered users of the Archive
Попробуйте загрузить его. Тем не менее, мы все еще можем сделать гораздо больше с этим рабочим объектом: давайте постараемся получить первые 20 слов второй главы.
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,
Объекты в работе. Гласти имеют тип AO3.Chapter
. У них есть много таких же свойств, что и Work
объекты.
Еще одна вещь, которую вы можете сделать с рабочим объектом,-это загрузить всю работу в виде PDF или электронной книги. На данный момент вы можете загрузить файлы AZW3, EPUB, HTML, MOBI и PDF.
import AO3
work = AO3 . Work ( 14392692 )
with open ( f" { work . title } .pdf" , "wb" ) as file :
file . write ( work . download ( "PDF" ))
Расширенная функциональность
Обычно, когда вы называете конструктор для Work
класса, вся информация о нем загружается в функции __init__()
. Тем не менее, этот процесс занимает довольно много времени (~ 1-1,5 секунды), и если вы хотите загрузить список работ из серии, например, вы можете ждать более 30 секунд. Чтобы избежать этой проблемы, функция Work.reload()
, вызываемая по инициализации, является функцией «потоковой», что означает, что если вы называете ее с помощью Argrege threaded=True
, она вернет объект Thread
и будет работать параллельно, что означает Вы можете загрузить несколько работ одновременно. Давайте посмотрим на реализацию:
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.
load=False
внутри Work
конструктора гарантирует, что мы не загружаем работу, как только мы создаем экземпляр класса. В конце концов, мы перечитываем каждую ветку и ждем, пока последний закончит использование .join()
. Давайте сравним этот метод со стандартным способом загрузки AO3 Works:
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.
Как мы видим, существует значительное повышение производительности. В этом пакете есть и другие функции, которые имеют эту функциональность. Чтобы увидеть, является ли функция «поток», либо используйте hasattr(function, "_threadable")
либо проверьте его __doc__
строку.
Чтобы сэкономить еще больше времени, если вы заинтересованы только в метаданных, вы можете загрузить работу с опцией load_chapters
установленной на False. Кроме того, имейте в виду, что некоторые функции (такие как Series.work_list
или Search.results
) могут вернуть полугрузкие Work
объекты. Это означает, что никаких запросов не было сделано для загрузки этой работы (поэтому у вас нет доступа к главе текст, заметкам и т. Д.), Но почти все его метаданные уже будут кэшированы, и вам, возможно, не придется звонить Work.reload()
вообще.
Последняя важная информация о Work
классе заключается в том, что большинство его свойств (например, количество закладок, слабых, имен авторов и т. Д.) - это кэшированные свойства. Это означает, что после того, как вы проверяете их один раз, значение сохраняется, и оно никогда не изменится, даже если эти значения изменятся. Чтобы обновить эти значения, вам нужно будет позвонить в Work.reload()
. См. Пример ниже:
import AO3
sess = AO3 . GuestSession ()
work = AO3 . Work ( 16721367 , sess )
print ( work . kudos )
work . leave_kudos ()
work . reload ()
print ( work . kudos )
392
393
Еще одна полезная вещь, которую вы, возможно, захотите сделать, это получить информацию о том, кто написал, что работает / комментарии. Для этого мы используем класс 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
Для поиска работ вы можете использовать функцию AO3.search()
и анализировать объект BeautifulSoup, возвращаемый себя или использовать класс AO3.Search
для автоматического дела для вас.
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]>
Затем вы можете использовать WorkID для загрузки одной из работ, на которые вы искали. Чтобы получить больше первых 20 работ, измените номер страницы, используя
search . page = 2
Многие действия, которые вы можете предпринять, может потребовать учетной записи AO3. Если у вас уже есть, вы можете получить доступ к этим действиям, используя объект AO3.Session. Вы начинаете с входа в систему, используя свое имя пользователя и пароль, а затем вы можете использовать этот объект для доступа к ограниченному контенту.
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
Мы успешно оставили благодарность в работе и проверили наши закладки. session.refresh_auth_token()
необходим для некоторых действий, таких как оставление слабых и комментариев. Если он истек или вы забыли вызвать эту функцию, ошибка AO3.utils.AuthError: Invalid authentication token. Try calling session.refresh_auth_token()
.
Вы также можете комментировать / Work.set_session()
благодарность в работе AO3.Work(xxxxxx, session=sess)
позвонив Work.leave_kudos()
Work.comment()
Work.set_session()
). Это, вероятно, лучший способ сделать это, потому что вы столкнетесь с меньшими проблемами аутентификации (как будет использоваться токен подлинности работы работы).
Если вы предпочитаете оставить комментарий или благодарность анонимно, вы можете использовать AO3.GuestSession
так же, как вы будете использовать обычную сессию, за исключением случаев проверить свои закладки, подписки и т. Д., Потому что вы ' Re на самом деле не вошел в систему.
Чтобы получить и обработать потоки комментариев, вы можете посмотреть на метод Work.get_comments()
. Он возвращает все комментарии в определенной главе и их соответствующих потоках. Затем вы можете обработать их так, как хотите. Посмотрим:
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
Загрузка комментариев занимает очень много времени, поэтому вы должны попытаться использовать их как можно меньше. Это также приводит к тому, что многие запросы будут отправлены на серверы AO3, что может привести к получению ошибки utils.HTTPError: We are being rate-limited. Try again in a while or reduce the number of requests
. Если это произойдет, вы должны попытаться разместить ваши запросы или уменьшить их номер. Существует также возможность включить ограничение запросов с использованием AO3.utils.limit_requests()
, что делает его так, чтобы вы не могли делать больше x запросов в определенном временном окне. Вы также можете ответить на комментарии, используя функцию Comment.reply()
или удалить одну (если она вас), используя Comment.delete()
.
AO3.Extra содержит код для загрузки некоторых дополнительных ресурсов, которые не являются основными для функциональности этого пакета и не меняются очень часто. Одним из примеров может быть список фэндомов, распознанных AO3. Чтобы загрузить ресурс, просто используйте AO3.extra.download(resource_name)
. Чтобы загрузить каждый ресурс, вы можете использовать AO3.extra.download_all()
. Чтобы увидеть список доступных ресурсов, используйте AO3.extra.get_resources()
.
Для получения информации или отчетов об ошибках, пожалуйста, свяжитесь с [email protected].
Грань