8

http://www.youtube-mp3.org/から数曲ダウンロードしたいと思います。私は urllib2 とBeautifulSoupを使用しています。

問題は、ビデオ ID がプラグインされたhttp://www.youtube-mp3.org/?c#v=lV7r8PiuecQでサイトを urllib2 で開くと、サイトを取得できますが、彼らはそれについてトリッキーで、情報をロードすることです。いくつかの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>
4

3 に答える 3

10

API は JSON ベースであるため、html ファイルの内容からは、ファイルの場所についての手がかりが得られません。このような Web サービスを探索する際の良いアイデアは、Chrome の開発者ツールで [ネットワーク] タブを開き、ページと対話するときにどのページが読み込まれるかを確認することです。この演習では、特に 2 つの URL が興味深いと思われることがわかりました。

  1. http://www.youtube-mp3.org/api/pushItem/?item=http%3A//www.youtube.com/watch%3Fv%3DKMU0tzLwhbE&xy=trve&r=1314700829128
  2. http://www.youtube-mp3.org/api/itemInfo/?video_id=KMU0tzLwhbE&adloc=&r=1314700829314

最初の URL は処理のためにファイルをキューに入れているように見え、2 番目の URL は処理ジョブのステータスを取得します。

2 番目の URL は、youtube (http://www.youtube.com/watch?v=KMU0tzLwhbE) のビデオの ID である video_id GET パラメータを取得し、デコード ジョブのステータスを返します。2 番目と 3 番目は、この目的には関係がないように見えますが、追加のパラメーターを使用して、または使用せずに URL をロードしてテストすることで確認できます。

ページの内容は次のとおりです。

info = { "title" : "Developers", 
         "image" : "http://i4.ytimg.com/vi/KMU0tzLwhbE/default.jpg", 
         "length" : "3", "status" : "serving", "progress_speed" : "", 
         "progress" : "", "ads" : "", 
         "h" : "a0aa17294103c638fa7f5e0606f839d3" };

これはたまたま JSON データです。この中で興味深いのは、「a0aa17294103c638fa7f5e0606f839d3」です。これは、デコードされた mp3 ファイルを参照するために Web サービスが使用するハッシュのように見えます。また、フロント ページのダウンロード リンクがどのように見えるかを確認してください。

http://www.youtube-mp3.org/get?video_id=KMU0tzLwhbE&h=a0aa17294103c638fa7f5e0606f839d3

これで、欠けているパズルのピースがすべて揃いました。まず、YouTube ビデオ (http://www.youtube.com/watch?v=iKP7DZmqdbU) の URL を取得し、それを引用して、この URL を使用して API にフィードします。

http://www.youtube-mp3.org/api/pushItem/?item=http%3A//www.youtube.com/watch%3Fv%3DiKP7DZmqdbU&xy=trve

次に、デコード ジョブが完了するまでしばらく待ちます。

http://www.youtube-mp3.org/api/itemInfo/?video_id=iKP7DZmqdbU

情報 URL で見つかったハッシュを取得して、ダウンロード URL を作成します。

http://www.youtube-mp3.org/get?video_id=iKP7DZmqdbU&h=2e4b61b6ddc8bf83f5a0e4e4ee0635bb

サイトの Web マスターはスクレイピングを望まず、人々が (Web マスターの目に) サイトを悪用し始めた場合に対抗措置を講じる可能性があることに注意してください。たとえば、リファラー保護を使用しているように見えるため、この投稿のリンクをクリックしても機能しません。それらをコピーして、新しいブラウザー ウィンドウにロードする必要があります。

テストコード:

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
于 2011-08-30T11:14:31.163 に答える
4

Selenium を使用して js と対話し、それを BeautifulSoup と組み合わせるか、お好みですべてを Selenium で行うことができます。

http://seleniumhq.org/

Selenium はブラウザー自動化のためのツールであり、Python を含むいくつかの言語のバインディングがあります。Firefox/IE/Chrome の実行中のインスタンスを取得し、それをスクリプト化します (この単純な問題には、セレン サーバー全体ではなく、セレン Web ドライバーを使用することをお勧めします)。

于 2011-08-30T08:43:37.220 に答える
2

http://www.youtube-mp3.org/client.jsを調べて、渡されている正確な情報を把握する必要があります。これにより、リクエストを投稿し、レスポンスを解析してダウンロードすることができます正しいスクレイピング URL から。

于 2011-08-30T08:37:38.347 に答える