【问题标题】:YouTube video_id from Firefox bookmark.html source code [almost there]YouTube video_id 来自 Firefox bookmark.html 源代码 [差不多有]
【发布时间】:2011-12-26 08:44:35
【问题描述】:

bookmarks.html 看起来像这样:

<DT><A HREF="http://www.youtube.com/watch?v=Gg81zi0pheg" ADD_DATE="1320876124" LAST_MODIFIED="1320878745" ICON_URI="http://s.ytimg.com/yt/favicon-vflZlzSbU.ico" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABEElEQVQ4jaWSPU7DQBCF3wGo7DZp4qtEQqJJlSu4jLgBNS0dRDR0QARSumyPRJogkIJiWiToYhrSEPJR7Hptx/kDRhrNm93nb3ZXFsD4psPRwR4AzbjHxd0ru4a8kEgvbf1NePfzbQdJfro52UcS8fHQDyjWCuDz7QpJTOYLZk5nH0zmi/8Dzg/DEqgCmL1fW/PXNwADf4V7AMbuis24txrw1xBJAlHgMizoLdkI4CVBREEZWTKGK9bKqa3G3QDO2G7Z2ljqAYyxPmPgI4XHpw2A7ES+d/unZzlwM2BNnwEKb1QFGJNPabdg9GB1v2993W71BNOamNZEWpfXy5nW8/3U9UQBkqTyy677F6rrkvQDptjzJ/PSbekAAAAASUVORK5CYII=">http://www.youtube.com/watch?v=Gg81zi0pheg</A>
<DT><A HREF="http://www.youtube.com/watch?v=pP9VjGmmhfo" ADD_DATE="1320876156" LAST_MODIFIED="1320878756" ICON_URI="http://s.ytimg.com/yt/favicon-vflZlzSbU.ico" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABEElEQVQ4jaWSPU7DQBCF3wGo7DZp4qtEQqJJlSu4jLgBNS0dRDR0QARSumyPRJogkIJiWiToYhrSEPJR7Hptx/kDRhrNm93nb3ZXFsD4psPRwR4AzbjHxd0ru4a8kEgvbf1NePfzbQdJfro52UcS8fHQDyjWCuDz7QpJTOYLZk5nH0zmi/8Dzg/DEqgCmL1fW/PXNwADf4V7AMbuis24txrw1xBJAlHgMizoLdkI4CVBREEZWTKGK9bKqa3G3QDO2G7Z2ljqAYyxPmPgI4XHpw2A7ES+d/unZzlwM2BNnwEKb1QFGJNPabdg9GB1v2993W71BNOamNZEWpfXy5nW8/3U9UQBkqTyy677F6rrkvQDptjzJ/PSbekAAAAASUVORK5CYII=">http://www.youtube.com/watch?v=pP9VjGmmhfo</A>
<DT><A HREF="http://www.youtube.com/watch?v=yTA1u6D1fyE" ADD_DATE="1320876163" LAST_MODIFIED="1320878762" ICON_URI="http://s.ytimg.com/yt/favicon-vflZlzSbU.ico" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABEElEQVQ4jaWSPU7DQBCF3wGo7DZp4qtEQqJJlSu4jLgBNS0dRDR0QARSumyPRJogkIJiWiToYhrSEPJR7Hptx/kDRhrNm93nb3ZXFsD4psPRwR4AzbjHxd0ru4a8kEgvbf1NePfzbQdJfro52UcS8fHQDyjWCuDz7QpJTOYLZk5nH0zmi/8Dzg/DEqgCmL1fW/PXNwADf4V7AMbuis24txrw1xBJAlHgMizoLdkI4CVBREEZWTKGK9bKqa3G3QDO2G7Z2ljqAYyxPmPgI4XHpw2A7ES+d/unZzlwM2BNnwEKb1QFGJNPabdg9GB1v2993W71BNOamNZEWpfXy5nW8/3U9UQBkqTyy677F6rrkvQDptjzJ/PSbekAAAAASUVORK5CYII=">http://www.youtube.com/watch?v=yTA1u6D1fyE</A>
<DT><A HREF="http://www.youtube.com/watch?v=4v8HvQf4fgE" ADD_DATE="1320876186" LAST_MODIFIED="1320878767" ICON_URI="http://s.ytimg.com/yt/favicon-vflZlzSbU.ico" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABEElEQVQ4jaWSPU7DQBCF3wGo7DZp4qtEQqJJlSu4jLgBNS0dRDR0QARSumyPRJogkIJiWiToYhrSEPJR7Hptx/kDRhrNm93nb3ZXFsD4psPRwR4AzbjHxd0ru4a8kEgvbf1NePfzbQdJfro52UcS8fHQDyjWCuDz7QpJTOYLZk5nH0zmi/8Dzg/DEqgCmL1fW/PXNwADf4V7AMbuis24txrw1xBJAlHgMizoLdkI4CVBREEZWTKGK9bKqa3G3QDO2G7Z2ljqAYyxPmPgI4XHpw2A7ES+d/unZzlwM2BNnwEKb1QFGJNPabdg9GB1v2993W71BNOamNZEWpfXy5nW8/3U9UQBkqTyy677F6rrkvQDptjzJ/PSbekAAAAASUVORK5CYII=">http://www.youtube.com/watch?v=4v8HvQf4fgE</A>
<DT><A HREF="http://www.youtube.com/watch?v=e9zG20wQQ1U" ADD_DATE="1320876195" LAST_MODIFIED="1320878773" ICON_URI="http://s.ytimg.com/yt/favicon-vflZlzSbU.ico" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABEElEQVQ4jaWSPU7DQBCF3wGo7DZp4qtEQqJJlSu4jLgBNS0dRDR0QARSumyPRJogkIJiWiToYhrSEPJR7Hptx/kDRhrNm93nb3ZXFsD4psPRwR4AzbjHxd0ru4a8kEgvbf1NePfzbQdJfro52UcS8fHQDyjWCuDz7QpJTOYLZk5nH0zmi/8Dzg/DEqgCmL1fW/PXNwADf4V7AMbuis24txrw1xBJAlHgMizoLdkI4CVBREEZWTKGK9bKqa3G3QDO2G7Z2ljqAYyxPmPgI4XHpw2A7ES+d/unZzlwM2BNnwEKb1QFGJNPabdg9GB1v2993W71BNOamNZEWpfXy5nW8/3U9UQBkqTyy677F6rrkvQDptjzJ/PSbekAAAAASUVORK5CYII=">http://www.youtube.com/watch?v=e9zG20wQQ1U</A>
<DT><A HREF="http://www.youtube.com/watch?v=khL4s2bvn-8" ADD_DATE="1320876203" LAST_MODIFIED="1320878782" ICON_URI="http://s.ytimg.com/yt/favicon-vflZlzSbU.ico" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABEElEQVQ4jaWSPU7DQBCF3wGo7DZp4qtEQqJJlSu4jLgBNS0dRDR0QARSumyPRJogkIJiWiToYhrSEPJR7Hptx/kDRhrNm93nb3ZXFsD4psPRwR4AzbjHxd0ru4a8kEgvbf1NePfzbQdJfro52UcS8fHQDyjWCuDz7QpJTOYLZk5nH0zmi/8Dzg/DEqgCmL1fW/PXNwADf4V7AMbuis24txrw1xBJAlHgMizoLdkI4CVBREEZWTKGK9bKqa3G3QDO2G7Z2ljqAYyxPmPgI4XHpw2A7ES+d/unZzlwM2BNnwEKb1QFGJNPabdg9GB1v2993W71BNOamNZEWpfXy5nW8/3U9UQBkqTyy677F6rrkvQDptjzJ/PSbekAAAAASUVORK5CYII=">http://www.youtube.com/watch?v=khL4s2bvn-8</A>
<DT><A HREF="http://www.youtube.com/watch?v=XTndQ7bYV0A" ADD_DATE="1320876271" LAST_MODIFIED="1320876271">Paramore - Walmart Soundcheck 6-For a pessimist(HQ)</A>
<DT><A HREF="http://www.youtube.com/watch?v=xTT2MqgWRRc" ADD_DATE="1320876284" LAST_MODIFIED="1320876284">Paramore - Walmart Soundcheck 5-Pressure(HQ)</A>
<DT><A HREF="http://www.youtube.com/watch?v=J2ZYQngwSUw" ADD_DATE="1320876291" LAST_MODIFIED="1320876291">Paramore - Wal-Mart Soundcheck Interview</A>
<DT><A HREF="http://www.youtube.com/watch?v=9RZwvg7unrU" ADD_DATE="1320878207" LAST_MODIFIED="1320878207">Paramore - 08 - Interview [ Wal-Mart Soundcheck ]</A>
<DT><A HREF="http://www.youtube.com/watch?v=vz3qOYWwm10" ADD_DATE="1320878295" LAST_MODIFIED="1320878295">Paramore - 04 - That&#39;s What You Get [ Wal-Mart Soundcheck ]</A>
<DT><A HREF="http://www.youtube.com/watch?v=yarv52QX_Yw" ADD_DATE="1320878301" LAST_MODIFIED="1320878301">Paramore - 05 - Pressure [ Wal-Mart Soundcheck ]</A>
<DT><A HREF="http://www.youtube.com/watch?v=LRREY1H3GCI" ADD_DATE="1320878317" LAST_MODIFIED="1320878317">Paramore - Walmart Promo</A>

这是一个标准的 Firefox 书签导出文件。

我将它输入到如下所示的 bookmarks.py 中:

#!/usr/bin/env python

import sys
import BeautifulSoup as bs
from BeautifulSoup import BeautifulSoup 

url_list = sys.argv[1]
urls = [tag['href'] for tag in 
BeautifulSoup(open(url_list)).findAll('a')] 

print urls

这会返回一个更干净的 url 列表:

[u'http://www.youtube.com/watch?v=Gg81zi0pheg', u'http://www.youtube.com/watch?v=pP9VjGmmhfo', u'http://www.youtube.com/watch?v=yTA1u6D1fyE', u'http://www.youtube.com/watch?v=4v8HvQf4fgE', u'http://www.youtube.com/watch?v=e9zG20wQQ1U', u'http://www.youtube.com/watch?v=khL4s2bvn-8', u'http://www.youtube.com/watch?v=XTndQ7bYV0A', u'http://www.youtube.com/watch?v=xTT2MqgWRRc', u'http://www.youtube.com/watch?v=J2ZYQngwSUw', u'http://www.youtube.com/watch?v=9RZwvg7unrU', u'http://www.youtube.com/watch?v=vz3qOYWwm10', u'http://www.youtube.com/watch?v=yarv52QX_Yw', u'http://www.youtube.com/watch?v=LRREY1H3GCI']

我的下一步是将每个 youtube 网址放入 video_info.py

#!/usr/bin/python

import urlparse
import sys
import gdata.youtube
import gdata.youtube.service
import re
import urlparse
import urllib2

youtube_url = sys.argv[1]
url_data = urlparse.urlparse(youtube_url)
query = urlparse.parse_qs(url_data.query)
youtube_id = query["v"][0]

print youtube_id

yt_service = gdata.youtube.service.YouTubeService()
yt_service.developer_key = 'AI39si4yOmI0GEhSTXH0nkiVDf6tQjCkqoys5BBYLKEr-PQxWJ0IlwnUJAcdxpocGLBBCapdYeMLIsB7KVC_OA8gYK0VKV726g'

entry = yt_service.GetYouTubeVideoEntry(video_id=youtube_id)

print 'Video title: %s' % entry.media.title.text
print 'Video view count: %s' % entry.statistics.view_count

当此网址“http://www.youtube.com/watch?v=aXrgwC1rsw4”时,输出如下所示:

aXrgwC1rsw4
Video title: OneRepublic   Good Life  Live Walmart Soundcheck
Video view count: 202

如何将来自 bookmarks.py 的 url 列表输入到 video_info.py 中?

*输出为 csv 格式的加分和 在将数据传递给 video_info.py* 之前检查 bookmarks.html 中的重复项的额外额外点*

感谢大家的帮助。由于 Stackoverflow,我已经走到了这一步。

大卫

#

如此结合,我现在有了:

#!/usr/bin/env python

import urlparse
import gdata.youtube
import gdata.youtube.service
import re
import urlparse
import urllib2
import sys
import BeautifulSoup as bs
from BeautifulSoup import BeautifulSoup 

yt_service = gdata.youtube.service.YouTubeService()
yt_service.developer_key = 'AI39si4yOmI0GEhSTXH0nkiVDf6tQjCkqoys5BBYLKEr-PQxWJ0IlwnUJAcdxpocGLBBCapdYeMLIsB7KVC_OA8gYK0VKV726g'

url_list = sys.argv[1]
urls = [tag['href'] for tag in 
BeautifulSoup(open(url_list)).findAll('a')] 

print urls

youtube_url = urls
url_data = urlparse.urlparse(youtube_url)
query = urlparse.parse_qs(url_data.query)
youtube_id = query["v"][0]

#list(set(my_list))

entry = yt_service.GetYouTubeVideoEntry(video_id=youtube_id)

myyoutubes = []
myyoutubes.append(", ".join([youtube_id, entry.media.title.text,entry.statistics.view_count]))
print "\n".join(myyoutubes)

如何将 url 列表传递给 youtube_url 变量? 我认为它们需要进一步清理并一次通过一个

我现在明白了:

#!/usr/bin/env python

import urlparse
import gdata.youtube
import gdata.youtube.service
import re
import urlparse
import urllib2
import sys
import BeautifulSoup as bs
from BeautifulSoup import BeautifulSoup 

yt_service = gdata.youtube.service.YouTubeService()
yt_service.developer_key = 'AI39si4yOmI0GEhSTXH0nkiVDf6tQjCkqoys5BBYLKEr-PQxWJ0IlwnUJAcdxpocGLBBCapdYeMLIsB7KVC_OA8gYK0VKV726g'

url_list = sys.argv[1]
urls = [tag['href'] for tag in 
    BeautifulSoup(open(url_list)).findAll('a')] 

for url in urls:
    youtube_url = url

url_data = urlparse.urlparse(youtube_url)
query = urlparse.parse_qs(url_data.query)
youtube_id = query["v"][0]

#list(set(my_list))

entry = yt_service.GetYouTubeVideoEntry(video_id=youtube_id)

myyoutubes = []
myyoutubes.append(", ".join([youtube_id, entry.media.title.text,entry.statistics.view_count]))
print "\n".join(myyoutubes)

我可以将bookmarks.html 传递给combined.py,但它只返回第一行。

如何循环遍历 youtube_url 的每一行?

【问题讨论】:

    标签: python youtube gdata


    【解决方案1】:

    为什么不直接合并这两个文件呢?此外,您可能希望将其分解为方法,以便以后更容易理解。

    此外,对于 csv,您需要累积数据。所以,也许有一个列表,并且每次通过附加一个 youtube 信息的 csv 行:

    myyoutubes = []
    ...
    myyoutubes.append(", ".join([youtubeid, entry.media.title.text,entry.statistics.view_count]))
    ...
    "\n".join(myyoutubes)
    

    对于重复项,我通常这样做: 列表(设置(my_list)) 集合只有唯一的元素。

    【讨论】:

    • oneporter,到目前为止,我花了大约 12 个小时。超出您已经完成的任何帮助将是惊人的。 (显然,感谢您为我指明了正确的方向):)
    • 大卫,我的意思是你可以结合 bookmarks.py 和 video_info.py。使用来自 bookmarks.py 的代码来获取所有的 url。然后循环使用循环体为 video_info.py 的 url。因此,对于网址中的 youtubeurl:
    • 在我可以将清理后的 url 从 bookmarks.py 传递到 video_info.py 之前,它们需要稍微清理一下。我在这里问过这个问题:stackoverflow.com/questions/8084935/…
    • 我不知道如何循环 :(
    • 不用担心.. 将向您展示如何在您提供的链接中循环播放。看看这个docs.python.org/tutorial/controlflow.html#for-statements
    【解决方案2】:

    你应该提供一个字符串给BeautifulSoup:

    # parse bookmarks.html
    with open(sys.argv[1]) as bookmark_file:
        soup = BeautifulSoup(bookmark_file.read())
    
    # extract youtube video urls
    video_url_regex = re.compile('http://www.youtube.com/watch')
    urls = [link['href'] for link in soup('a', href=video_url_regex)]
    

    将非常快速的 url 解析与更长的统计数据下载分开:

    # extract video ids from the urls
    ids = [] # you could use `set()` and `ids.add()` to avoid duplicates
    for video_url in urls:
        url = urlparse.urlparse(video_url)
        video_id = urlparse.parse_qs(url.query).get('v')
        if not video_id: continue # no video_id in the url
        ids.append(video_id[0])
    

    您不需要对只读请求进行身份验证:

    # get some statistics for the videos
    yt_service = YouTubeService()
    yt_service.ssl = True #NOTE: it works for readonly requests
    yt_service.debug = True # show requests
    

    将一些统计信息保存到命令行提供的 csv 文件中。如果某些视频导致错误,请不要停止:

    writer = csv.writer(open(sys.argv[2], 'wb')) # save to cvs file
    for video_id in ids:
        try:
            entry = yt_service.GetYouTubeVideoEntry(video_id=video_id)
        except Exception, e:
            print >>sys.stderr, "Failed to retrieve entry video_id=%s: %s" %(
                video_id, e)
        else:
            title = entry.media.title.text
            print "Title:", title
            view_count = entry.statistics.view_count
            print "View count:", view_count
            writer.writerow((video_id, title, view_count)) # write it
    

    这里是a full script,按下播放键看看它是怎么写的。

    输出

    $ python download-video-stats.py neudorfer.html out.csv
    send: u'GET https://gdata.youtube.com/feeds/api/videos/Gg81zi0pheg HTTP/1.1\r\nAcc
    ept-Encoding: identity\r\nHost: gdata.youtube.com\r\nContent-Type: application/ato
    m+xml\r\nUser-Agent: None GData-Python/2.0.15\r\n\r\n'                           
    reply: 'HTTP/1.1 200 OK\r\n'
    header: X-GData-User-Country: RU
    header: Content-Type: application/atom+xml; charset=UTF-8
    header: Expires: Thu, 10 Nov 2011 19:31:23 GMT
    header: Date: Thu, 10 Nov 2011 19:31:23 GMT
    header: Cache-Control: private, max-age=300, no-transform
    header: Vary: *
    header: GData-Version: 1.0
    header: Last-Modified: Wed, 02 Nov 2011 08:58:11 GMT
    header: Transfer-Encoding: chunked
    header: X-Content-Type-Options: nosniff
    header: X-Frame-Options: SAMEORIGIN
    header: X-XSS-Protection: 1; mode=block
    header: Server: GSE
    Title: Paramore - Let The Flames Begin [Wal-Mart Soundcheck]
    View count: 27807
    

    out.csv

    Gg81zi0pheg,Paramore - Let The Flames Begin [Wal-Mart Soundcheck],27807
    pP9VjGmmhfo,Paramore: Wal-Mart Soundcheck,1363078
    yTA1u6D1fyE,Paramore-Walmart Soundcheck 7-CrushCrushCrush(HQ),843
    4v8HvQf4fgE,Paramore-Walmart Soundcheck 4-这就是你得到的(HQ),1429
    e9zG20wQQ1U,Paramore-Walmart Soundcheck 8-Interview(HQ),1306
    khL4s2bvn-8,Paramore-Walmart Soundcheck 3-Emergency(HQ),796
    XTndQ7bYV0A,Paramore-Walmart Soundcheck 6-悲观主义者(HQ),599
    xTT2MqgWRRc,Paramore-Walmart Soundcheck 5-Pressure (HQ),963
    J2ZYQngwSUw,Paramore - 沃尔玛试音采访,10261
    9RZwvg7unrU,Paramore - 08 - 采访 [沃尔玛试音],1674
    vz3qOYWwm10,Paramore - 04 - 这就是你得到的 [Wal-Mart Soundcheck],1268
    yarv52QX_Yw,Paramore - 05 - 压力 [Wal-Mart Soundcheck],1296
    LRREY1H3GCI,Paramore - 沃尔玛促销,523

    【讨论】:

    • @David Neudorfer:不要盲目地复制粘贴。在一次性脚本问题的上下文中有意义的注释不适合作为项目源的一部分。尝试阅读代码并了解每一行的作用,例如,dir() 通常用于交互式提示或快速调试;它不应该在代码中。
    • 感谢塞巴斯蒂安的提醒。我会看看我能做些什么来纠正这个问题。
    • 塞巴斯蒂安,你做雇佣工作吗?我在您的个人资料中找不到网站或电子邮件。
    • @David Neudorfer:代码在CC BY-SA 许可下,就像网站上的其他所有内容一样。我已经更新了个人资料。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2013-06-18
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    相关资源
    最近更新 更多