Oli*_*ver 8 python youtube urllib2 scrape
我想从http://www.youtube-mp3.org/下载几首歌曲.我正在使用urllib2和BeautifulSoup.
问题是,当我urllib2打开我的视频ID插入的网站,http://www.youtube-mp3.org/? c#v = lV7r8PiuecQ,我得到了网站,但他们很狡猾,加载信息在初始页面加载后用一些js ajax的东西.因此,当我尝试刮下载链接的URL时,字面上不在页面上,因为它尚未加载.
任何人都知道我怎么可能在我的python脚本中触发这个js加载器,或者什么?
这是相关的空html,然后将我想要的内容加载到其中.
<div id="link_box" style="display:none">
<div id="link_box_title" style="font-weight:bold; text-decoration:underline">
</div>
<div class="row">
<div id="link_box_bb_code_title" style="font-weight:bold">
</div>
<input type="text" id="BBCodeLink" onclick="sAll(this)" />
</div>
<div class="row">
<div id="link_box_html_code_title" style="font-weight:bold">
</div>
<input type="text" id="HTMLLink" onclick="sAll(this)" />
</div>
<div class="row">
<div id="link_box_direct_code_title" style="font-weight:bold">
</div>
<input type="text" id="DirectLink" onclick="sAll(this)" />
</div>
</div>
<div id="v-ads">
</div>
<div id="dl_link">
</div>
<div id="progress">
</div>
<div id="loader">
<img src="ajax-loader-b.gif" alt="loading.." width="16" height="11" />
</div>
</div>
<div class="clear">
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
Bjö*_*ist 10
API是基于JSON的,因此html文件的内容不会给你任何关于在哪里找到文件的线索.在浏览此类Web服务时,最好的方法是在Chrome的开发人员工具中打开"网络"选项卡,查看与页面交互时加载的页面.那个练习告诉我两个网址特别有趣:
第一个url似乎是排队文件进行处理,第二个url用于获取处理作业的状态.
第二个网址采用video_id GET参数,该参数是youtube上视频的ID(http://www.youtube.com/watch?v=KMU0tzLwhbE),并返回解码作业的状态.第二个和第三个似乎与此目的无关,您可以通过测试加载带有和不带额外参数的URL来验证.
页面内容如下:
info = { "title" : "Developers",
"image" : "http://i4.ytimg.com/vi/KMU0tzLwhbE/default.jpg",
"length" : "3", "status" : "serving", "progress_speed" : "",
"progress" : "", "ads" : "",
"h" : "a0aa17294103c638fa7f5e0606f839d3" };
Run Code Online (Sandbox Code Playgroud)
这恰好是JSON数据.其中有趣的是"a0aa17294103c638fa7f5e0606f839d3",它看起来像是Web服务用于引用已解码的mp3文件的哈希值.另请参阅首页上的下载链接:
http://www.youtube-mp3.org/get?video_id=KMU0tzLwhbE&h=a0aa17294103c638fa7f5e0606f839d3
现在我们将所有缺失的部分拼凑在一起.首先,我们将YouTube视频(http://www.youtube.com/watch?v=iKP7DZmqdbU)网址的网址引用并使用此网址将其提供给api:
然后,稍等片刻,直到完成解码工作:
http://www.youtube-mp3.org/api/itemInfo/?video_id=iKP7DZmqdbU
获取信息网址中找到的哈希来构建下载网址:
http://www.youtube-mp3.org/get?video_id=iKP7DZmqdbU&h=2e4b61b6ddc8bf83f5a0e4e4ee0635bb
请注意,网站的网站管理员可能不希望被抓取,并且如果人们开始(在网站管理员眼中)滥用网站,则会采取对策.例如,它似乎使用引用保护,因此单击此帖子中的链接将不起作用,您必须复制它们并在新的浏览器窗口中加载它们.
测试代码:
from re import findall
from time import sleep
from urllib import urlopen, quote
yt_code = 'gijypDkEqUA'
yt_url = 'http://www.youtube.com/watch?v=%s' % yt_code
push_url_fmt = 'http://www.youtube-mp3.org/api/pushItem/?item=%s&xy=trve'
info_url_fmt = 'http://www.youtube-mp3.org/api/itemInfo/?video_id=%s'
download_url_fmt = 'http://www.youtube-mp3.org/get?video_id=%s&h=%s'
push_url = push_url_fmt % quote(yt_url)
data = urlopen(push_url).read()
sleep(10)
info_url = info_url_fmt % yt_code
data = urlopen(info_url).read()
res = findall('"h" : "([^"]*)"', data)
download_url = download_url_fmt % (yt_code, res[0])
print 'Download here:', download_url
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3883 次 |
| 最近记录: |