PHP-kneeのパーサーまたは音楽コレクションの補充方法

そして、それはすべて何から始まったのですか? そして、それはすべて、1つの家、冬、土曜日の夕方から始まりました...そしてもちろん、解決策が求められていた問題で)



先日、私自身の愚かさで、音楽のコレクション全体を永遠に失いました(私はDJであり、ミュージシャンです)。 コレクションが理想的に並べ替えられ、ビットレート、調性などが分析されたため、非常に残念でした。



辞任、大丈夫だと思う、すべてのトラックを再ダウンロードします。 promodj.comからダウンロードします

なぜサウンドクラウドではなく「promnodishte」なのですか? 最初の理由は、他の音楽ポータルよりもずっと頻繁にこのサイトに座っていることです。 2番目の理由は、「320kbps品質で長さが10分以内でマッシュアップではない2017年1月のトップ」のフィルターを使用した非常に便利な検索があることです。



ご存知のように、私はすぐに注入されます...「ダウンロード」ボタンを手で押すのにうんざりしています。 そして、ここから楽しみが始まりました)。



最初のタスク:リンクの規則性を決定する!



ページ要素のソースコードの見方についてはお話ししません。 ここにそんなに馬鹿な人はいないと思う。



実際、各構成のDIVは次のようになります。



画像






そして、与えられたDIVのコードは次のとおりです。



タイトルスポイラー
<div class="track2 track2_no_avatar"> <div class="title"> <a amba="file:6224428" onclick="return cb(event);" href="http://promodj.com/sashasemenov/remixes/6224428/Syke_N_Sugarstarr_Feat_Alexandra_Prince_Are_You_Sasha_Semenov_Remix_Radio" class="invert">Syke 'N' Sugarstarr Feat. Alexandra Prince - Are You (Sasha Semenov Remix) (Radio)</a> </div> <div class="aftertitle"> <div id="fpp6224428" class="player"> <div class="playerr_standalone playerr __rototype_destructable" style="min-height: 70px;"> <div class="playerr_bigplaybutton"><img class="playerr_bigplaybutton" style="width: 30px; height: 30px; visibility: visible; margin-top: 20px;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAABzklEQVRIS8XWS0sCURQH8P8ZKzdlEBiMfY2oHCVo37pdO1dCILhtUyD4AYS2UhAELWslFNGDNkHbQGgz6sTQY0bDDPWELxot05m52mxn5v7O3Dn3nEP4p4us7m1gJlwHnYBRZuDQ++HZXXx9NUYRWxd8LfsuCQhbIJ2BeKhgHojGu+Ab2fcMYO4HQnxWB6LhfPFBVADdcMD3BsZsn8U/QUhCMpOKirLbAOzALYuRlSSKruSNjBvcPtzWmHE0WavFlvR3zUkAjuEmRmhk/LaSN1N2cXfwt3bHkhQJ5d7uhw1AFNzwagBSlap3e03XS4MCEAl3LI2IYsG8cfQXPgq4nfzIkAdRRTWzvwUwMriFUZmARLBgJHrxEcOdo4+9UMGMWvGxwA2wyvX5Va2kd/BxwbpaMOWNVua3S4Dl+2/+rtWDTki/+yVwfV3RShfj22rCqadGW8tPxuOYkotyzIiFNOO43zaI/sdDVy+RsK167R522KFcwW56sjNYwBRiFxY2dw0NM3DFxBFRk2bPeDurArzQc/ZeiDke1Ippp6VrcFuUffsANjsPMiFNEuKKar6IRJsN07rgud8/PTVR2QFQhiQd25mh7AbWBdt92c3zX1dq6x88MV4BAAAAAElFTkSuQmCC"></div> <div class="playerr_bigdownloadbutton"><a class="playerr_bigdownloadbutton" href="http://promodj.com/download/6224428/Syke%20%27N%27%20Sugarstarr%20Feat.%20Alexandra%20Prince%20-%20Are%20You%20%28Sasha%20Semenov%20Remix%29%20%28Radio%29%20%28promodj.com%29.mp3" target="_self" style="width: 30px; height: 30px; margin-top: 19px;"><img style="visibility: visible; width: 30px; height: 30px;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAB2klEQVRIS+2WQUsbURSFz80MAYmZLIo4o910LXZTsOaBi4qb4EIQcdFFKQh1KbQ/QOgPKP0BgS4KLbSLQldiN6I4EtGVqBvBLqITkAbmRZDSJldGoQ0xmXcnCm4y23vu+d673HcYwj19dE9ciMC+5xyKDsg4URU9JdFKwSwxA1BVgX4g0d41+KcK9KMeuN0EeqNuuxe+50i3urdcHV9Wb7ngD2ZGYdnT4EZTAtErSRoBqAH8+b+WLhjYPQn0p3mg3uxxY9S+5+wAeCIESWUFFeiVePBQdgFMRamjUcc4gq0fqzIuYsFR0fdyRYAXjKYmASFMNRpqvHJ+0Cptu9X7I0iHv5w1EPIm77g6Ec/kT2vfE2X19kDG/WvbOwAPdwVnLKuKftupN/Yd+64zBsIGgHQyOH1TQTgbOw2T4ZabfclEH0y6f3Wivd9/0urZ2dn5rcDXy+a8B7AkgFdh4akq6yOTVhSZXwDr4VB2FUyTMYb1FFFh/DT8YYJGdRE4Eq67/QM2pUoA2v5TEfhNPqi9k0ATga9GHsVpyi4B3NcC+KgC/UIKTQyOGjbd3BwRf22C7MLSE63JZDqEeNTNRr7nPAfwGuBjWLSoyrpqAomSK6lJN/qubtwNqLXnEj6wph9Ln/rvAAAAAElFTkSuQmCC"></a></div> <div style="padding-left: 30px; padding-right: 30px;"> <div class="playerr_waveformview" style="position: relative; width: 100%; height: 70px;"> <div style="position: absolute; width: 100%; height: 70px; clip: auto;"> <canvas style="width: 100%; height: 70px; opacity: 0.8;"></canvas> </div> <div style="position: absolute; width: 100%; height: 70px; clip: auto;"> <canvas style="width: 100%; height: 70px; opacity: 0.8;"></canvas> </div> <div style="position: absolute; width: 100%; height: 70px; clip: auto;"> <canvas style="width: 100%; height: 70px; opacity: 0.8; visibility: visible;" width="500" height="100"></canvas> </div> <div style="position: absolute; display: none; left: 0px; top: 0px; width: 1px; height: 70px; background-color: rgb(39, 39, 39);"></div> <div style="position: absolute; left: 0px; top: 0px; width: 100%; height: 70px; cursor: pointer; display: block; background-image: url("//cdn.promodj.com/core/i/playerr/playerr_0.gif"); background-position: 50% 50%; background-repeat: no-repeat;"></div> </div> </div> <div></div> </div> <div class="rbtify"></div> </div> <script> CORE.Player('fpp6224428', 'standalone.big', 6224428, { omitTitle: true, replace: true }); </script> <div class="notizer"></div> <div class="icons"> <span class="play_button" style="margin-left: 3px;"><a href="http://promodj.com/sashasemenov/remixes/6224428/Syke_N_Sugarstarr_Feat_Alexandra_Prince_Are_You_Sasha_Semenov_Remix_Radio?play=1" ambatitle="">10 204</a></span> <span class="comments_count"><a onclick="return cb(event);" href="http://promodj.com/sashasemenov/remixes/6224428/Syke_N_Sugarstarr_Feat_Alexandra_Prince_Are_You_Sasha_Semenov_Remix_Radio#comments" ambatitle=""><span class="cc17607699"><span class="newc">+18</span></span></a></span> <span class="downloads_count"><a onclick="return cb(event);" href="http://promodj.com/download/6224428/Syke%20%27N%27%20Sugarstarr%20Feat.%20Alexandra%20Prince%20-%20Are%20You%20%28Sasha%20Semenov%20Remix%29%20%28Radio%29%20%28promodj.com%29.mp3" ambatitle="">4 892</a></span> <span class="balls_count">PR <a href="#" id="fv7_6224428" ambatitle="  " onclick="Vote('file',6224428,this,'550cb446865f60595506b16fc51a35fd'); cb(event); return false;">228 ▲</a></span> <a class="bitrate" onclick="return cb(event);" href="http://promodj.com/source/6224428/Syke%20%27N%27%20Sugarstarr%20Feat.%20Alexandra%20Prince%20-%20Are%20You%20%28Sasha%20Semenov%20Remix%29%20%28Radio%29%20%28promodj.com%29.mp3">320</a> <span class="styles_list styles"><span class="styles"><b><a href="/music/deep_house?sortby=rating&bitrate=high&no_junk=1&period=date&duration=10m&year=2017&month=2">Deep House</a></b>, <b><a href="/music/club_house?sortby=rating&bitrate=high&no_junk=1&period=date&duration=10m&year=2017&month=2">Club House</a></b></span></span> <span class="small" style="margin-left: 6px;"></span> </div> </div> </div>
      
      







一見、この行に興味があります。



 <a class="playerr_bigdownloadbutton" href="http://promodj.com/download/6224428/Syke%20%27N%27%20Sugarstarr%20Feat.%20Alexandra%20Prince%20-%20Are%20You%20%28Sasha%20Semenov%20Remix%29%20%28Radio%29%20%28promodj.com%29.mp3" target="_self" style="width: 30px; height: 30px; margin-top: 19px;">
      
      





このラインの下で、オーディオファイルへのリンクを切り取る正規表現を開発し始めました。 しかし、それは間違った決定であることが判明しました!



トラック付きのリクエストシートに加えて、promodj.comには音楽トラックの広告もあります。 そして、そのような各広告では、[ダウンロード]ボタンがまったく同じリンクで表示されます。 これは、必要なトラックに加えて、広告からの楽曲もダウンロードされることを意味します。



最初は、それを地獄に吐き出したいとさえ思っていました。広告トラックのもう1つのやり過ぎを贈り物として持っているでしょう。 しかし、私がどれだけ余分な広告ゴミを持っているかを考えると、私はこの考えを急に放棄しました。



さらに、リンククラスの名前に悩まされました。 「Bigdownloadbutton」、おそらくサイト開発者は彼の人生のすべてをとてもきれいに呼び出します、そしておそらく小さなボタンがあります...



そうです! トラックの下にある小さく目立たないダウンロードボタンを思い出して、解析コードを探し始めました。 ここにあります:



 <span class="downloads_count"><a onclick="return cb(event);" href="http://promodj.com/download/6224428/Syke%20%27N%27%20Sugarstarr%20Feat.%20Alexandra%20Prince%20-%20Are%20You%20%28Sasha%20Semenov%20Remix%29%20%28Radio%29%20%28promodj.com%29.mp3" ambatitle="">4 892</a></span>
      
      





クラスの名前から判断すると、この要素がもともとダウンロードカウンターとして意図されていたことがすぐにわかります。 しかし、私たちは何か他のものに興味があります-その中にリンクがあります!!! 念のため、ページ上にそのようなクラスを持つ要素が他にないかどうか、視覚的にもコード内で検索して確認しました。 いや! パーフェクト!!!



数分で簡単なレギュラーシーズンが作成されました。



 /<span class="downloads_count"><a onClick="return cb(event);" href="(.*)" ambatitle="Download">/im
      
      





この規則性の助けを借りて、SPAN'a "downloads_count"内にあるページ上のすべてのリンクを取得します。 いいね! 第二段階。



2番目のタスク:解析用のページへのリンクを生成する



さまざまなジャンルのトラックをコレクションに追加したいと考えていたので、最高のものだけでさえも、自分のために正確な目標を設計しました。



興味のあるスタイルごとに、フィルターを使用したクエリ用に発行された最初の2ページを解析します。「 2017年、毎月、最低320kbpsの品質で10分以内の長いトラックでの並べ替えはマッシュアップではありません 」(マッシュアップは愚かで、フー、著者の音楽が欲しい!)。



ここで、指定された基準に従ってページへの複数のリンクを生成する必要がありました。



ブラウザーからの通常のリクエストには、次のURLとパラメーターがあります。



 Protocol: http: Hostname: promodj.com Path name: /music/club_house Arguments: sortby = rating bitrate = high no_junk = 1 period = date duration = 10m year = 2017 month = 2 page = 2
      
      





何が何であるかを推測することは難しくありません。 さらに、すべてのパラメーターはGETメソッドを使用して渡されます。 残っている唯一のことは、私のリクエストに応じていくつかのURLを生成することです! 私はこれらすべてのURLを手動で変更したり印刷したりしないことにしました。



私たちはプログラマーです! これらのURLを生成するスクリプトを作成しましょう。 はい、bなし:



 $styles = array( 'big_room_house', 'club_house', 'dance_pop', 'deep_house', 'electrohouse', 'future_house', 'g_house', 'pop', 'progressive_housee House', 'russian_pop', 'techhouse', ); $urls = array(); foreach ($styles as $style) { for ($m=1; $m < 12; $m++) { $urls[] = "http://promodj.com/music/$style/?sortby=rating&bitrate=high&no_junk=1&period=date&duration=10m&year=2017&month=$m&page=1"; $urls[] = "http://promodj.com/music/$style/?sortby=rating&bitrate=high&no_junk=1&period=date&duration=10m&year=2017&month=$m&page=2"; } } foreach ($urls as $url) { echo $url."\r\n"; }
      
      





そして、出力では、解析のためのすてきな小さなリンクを取得します!



画像



タスク3:リンクの解析



さて、解析ページへのリンクがあります。 すでに通常のルーチンを実行しています。 紳士を解析しましょう!



解析方法 何を解析しますか? もちろん純粋なPHP! 結局のところ、多くのKULHATSKERSとTYZH PROGRAMMERSがいます!



私たちはすべて真剣に渡します。 PHPの正規表現で部分文字列を見つけるのは簡単です。 これにはpreg_match_all()関数があります。 ただし、最初に解析するページのHTMLコードを取得する必要があります。



いいえ、DOMは使用しません。これにはCurlも使用しません!!! 標準のPHP関数-file_get_contents()を使用します! 突然、この関数を使用して知らなかった人は、URL引数を渡すと、ローカルテキストファイルだけでなく、サーバーによってコンパイルされたHTMLコードも読み取ることができます!



8行全体が、フォーマットを考慮して解析サイクルを占有します。 全8行、カール!!!



ところで、コードは次のとおりです。



 foreach ($urls as $url) { $html = file_get_contents($url); $re = '/<span class="downloads_count"><a onclick="return cb\(event\);" href="(.*)" ambatitle="Download">/im'; preg_match_all($re, $html, $matches, PREG_SET_ORDER, 0); foreach ($matches as $key => $value) { echo $value[1]."\r\n"; } }
      
      





何が何なのか説明してください。 念のため、説明します。 前に生成されたURLの配列をループにスローし、各URLについてfile_get_contents()を使用してHTMLコードを取得します。 次に、最初のステップで取得した正規表現の文字列があります。



その後、preg_match_all関数を、HTMLコードの引数、通常の行、および見つかったすべての行が書き込まれる変数配列を使用して実行します。 PREG_SET_ORDER

結果をソートして、$ matches [0]要素に最初の出現セットが含まれ、$ matches [1]要素に2番目の出現セットが含まれるようになります。 そして最後に、すべての解析済みリンクを表示するサイクルがすでにあります!



「アリルア!」私は偶然大声で叫んだ。 そして、彼は喫煙に行き、次に何をすべきか考えました...



タスク4:複数のファイルをダウンロードする



最も単純な計算によると、11(検索スタイルの数)* 20(検索ページの結果の数)* 12(月)* 2(検索ページ)= 5,280のオーディオファイルが得られました。 さらに、解析用の各ページの読み込みにも時間がかかり、通常の作業自体にも時間がかかることを考慮する必要があります。



最初の解決策は、Curlを使用してファイルをダウンロードすることでした。 しかし、一分後、私は再び喜びで笑っていました)。



素晴らしいプログラムがあります-ダウンロードマスター(広告なし)! 私が2010年に彼女を最後に見たとき、私はuTorrentしか知らなかった時代です。



プログラムの特徴は、ダウンロード用のURLファイルのリストを受け入れることができることです!!!



2番目の問題。 今すぐすべてのリンクを取得し、それらをダウンロードマスターに押し込み、お茶/煙/睡眠を飲みに行くと、最終的にすべての音楽が1つのフォルダーに入れられます!!! まあ、つまり、スタイルでソートされていません。



ソリューションはシンプルで論理的です-各スタイルを順番に解析し、ダウンロードマスターをスローします。 結果のURLのコピーを開始するとすぐに、ポライトブートローダーからダウンロードを開始するよう提案されました。



画像



さらに、これらのファイルを保存する場所と、リスト内の他のすべてのファイルに同じ設定を適用するかどうかをすぐに尋ねました!



画像



画像



さて、私はついに笑顔になり、お茶/煙/睡眠を飲みに行きました!)



誰かがそれを必要とするなら、パーサーのための完全なPHPコードはここにあります:



promodj_parser.php
 <?php $styles = array( 'big_room_house', 'club_house', 'dance_pop', 'deep_house', 'electrohouse', 'future_house', 'g_house', 'pop', 'progressive_housee', 'russian_pop', 'techhouse', ); $styles = array( 'techhouse', ); $urls = array(); foreach ($styles as $style) { for ($m=1; $m < 12; $m++) { $urls[] = "http://promodj.com/music/$style/?sortby=rating&bitrate=high&no_junk=1&period=date&duration=10m&year=2017&month=$m&page=1"; $urls[] = "http://promodj.com/music/$style/?sortby=rating&bitrate=high&no_junk=1&period=date&duration=10m&year=2017&month=$m&page=2"; } } foreach ($urls as $url) { $html = file_get_contents($url); $re = '/<span class="downloads_count"><a onclick="return cb\(event\);" href="(.*)" ambatitle="Download">/im'; preg_match_all($re, $html, $matches, PREG_SET_ORDER, 0); foreach ($matches as $key => $value) { echo $value[1]."\r\n"; } } ?>
      
      









UPD:誰かが興味を持っているなら-出力で、36.5 GBの総重量で3350以上の曲を受け取りました。 単純に処理したとは思わない))



All Articles