Я пытаюсь сканировать Youtube, чтобы получить информацию о группе пользователей (около 200 человек).Я заинтересован в поиске отношений между пользователями:
- контакты
- подписчики
- подписки
- какие видео они прокомментировали
- и т. Д.
Мне удалось получить контактную информацию из следующего источника:
import gdata.youtube
import gdata.youtube.service
from gdata.service import RequestError
from pub_author import KEY, NAME_REGEX
def get_details(name):
yt_service = gdata.youtube.service.YouTubeService()
yt_service.developer_key = KEY
contact_feed = yt_service.GetYouTubeContactFeed(username=name)
contacts = [ e.title.text for e in contact_feed.entry ]
return contacts
Не могу получить другие нужные мне сведения.Справочное руководство говорит, что я могу получить ленту XML с http://gdata.youtube.com/feeds/api/users/username/subscriptions?v=2 (для произвольного пользователя).Однако, если я пытаюсь получить подписки других пользователей, я получаю сообщение об ошибке 403 со следующим сообщением:
Пользователь должен войти в систему для доступа к этим подпискам.
Если я использую API gdata:
sub_feed = yt_service.GetYouTubeSubscriptionFeed(username=name)
sub = [ e.title.text for e in contact_feed.entry ]
, то получаю ту же ошибку.
Как получить эти подписки без входа в систему?Это должно быть возможно, поскольку вы можете получить доступ к этой информации, не заходя на сайт Youtube.
Кроме того, похоже, что нет подписки для подписчиков конкретного пользователя.Доступна ли эта информация через API?
РЕДАКТИРОВАТЬ
Итак, похоже, что это невозможно сделать через API.Мне пришлось сделать это быстрым и грязным способом:
for f in `cat users.txt`; do wget "www.youtube.com/profile?user=$f&view=subscriptions" --output-document subscriptions/$f.html; done
Затем использовать этот скрипт, чтобы получить имена пользователей из загруженных файлов HTML:
"""Extract usernames from a Youtube profile using regex"""
import re
def main():
import sys
lines = open(sys.argv[1]).read().split('\n')
#
# The html files has two <a href="..."> tags for each user: once for an
# image thumbnail, and once for a text link.
#
users = set()
for l in lines:
match = re.search('<a href="/user/(?P<name>[^"]+)" onmousedown', l)
if match:
users.add(match.group('name'))
users = list(users)
users.sort()
print users
if __name__ == '__main__':
main()