我試圖抓取Youtube以檢索關於一組用戶(大約200人)的信息。抓取YouTube用戶信息
- 接觸
- 用戶
- 訂閱
- 他們在
- 評論什麼視頻等
我已經成功地:我在尋找的用戶之間的關係很感興趣獲取以下來源的聯繫信息:
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
我似乎無法獲得我需要的其他信息。 reference guide表示我可以從http://gdata.youtube.com/feeds/api/users/username/subscriptions?v=2(對於某些任意用戶)獲取XML源。但是,如果我試圖讓其他用戶的訂閱,我得到了一個403錯誤,消息如下:
用戶必須先登錄才能訪問這些訂閱。
如果我使用GDATA API:
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()