現在、多くの音楽プラットフォームが曲のダウンロードに料金を請求しているため、車で聴く音楽がありません。そこで私は独学でクロールの方法を学び、このシンプルな音楽クローラーを作成しました。それはそれらの大きなプラットフォームからの音楽クローラーではなく、未知の小さな音楽ウェブサイトからのクローラーです。本題に入りましょう:
まず、大手インターネット会社ではない音楽サイトを探していたのですが、たゆまぬ努力の末、比較的充実した楽曲を揃えているキジ音楽サイトを見つけました(これだけは言わせてください)。キジですが、新曲から人気歌手の名曲まで網羅しており、スズメは小さいながらも内臓が揃っています。
次に、Web サイトのパケットをキャプチャして、Web リンクのパターンを探す必要があります。もちろん、この小さな Web サイトの Web リンクのパターンも非常に単純です。以下に示すように:
Web ページの URL のパターンを見つけるのは難しくありません。不明な URL を先頭に置き、検索したい歌手の名前を追加し、その後に .html を追加するだけです。それ以来、コード内の URL の問題は解決されました。コードは以下のように表示されます。
import requests
name = input()
url = 'http://www.2t58.com/so/{}/1.html'.format(name)
response = requests.get(url = url)
上記のコードは現時点では完全に実行可能ですが、hears やその他の関連するクロール対策パラメータは追加していませんが、Web サイトはこれまでのところクロール対策されていません。
次に、いくつかの曲をクリックしてみましょう。
周杰倫が好きな友達がたくさんいるので、周杰倫を検索して彼の曲をいくつかクリックしてみたところ、ウェブページの欄のウェブアドレスが不規則になっており、英語の単語の羅列になっていることがわかります。理解できません。文字プラス.html。そして、曲をダウンロードしたい場合は、このページに入らなければなりません。そのため、その Web アドレスのパターンを見つけるか、不規則な英文字の文字列がどのデータ パケットから取得できるかを見つけなければなりません。次に、データを取得して分析しました。
各 a タグの href の最後のフィールドが、必要な英語文字の不規則な文字列であることは簡単にわかるため、その URL を確認し、requests モジュールを通じてリクエストを送信する必要があります。がリクエストされました。試してみたところ、ここで Web サイトが逆クロールされました。ヒアリングが追加されていない場合、データはリクエストされません。注意してください。次に、正規表現を使用して、必要な英語文字を照合して保持します。コードは次のとおりです。
ex = '<div class="name"><a href="/song/(.*?).html" target="_mp3">.*?</a></div>'
musicIndex = re.findall(ex, response.text, re.S)
次に、曲のダウンロード リンクに戻り、バイナリ形式で保存します。曲をクリックするだけで、曲の詳細ページがキャプチャされます。
多くのデータ パケットが存在します。データ パケットの種類に応じてそれらを選択して表示できます。オーディオとビデオは明らかにメディア タイプのデータ パケットです。明らかに、これが私たちが望む音楽リンクです。別の Web ページ バーで検索して、制限なしで直接ダウンロードできる完全な音楽を取得します。しかし、私たちが望んでいるのは一括ダウンロードであり、各曲のダウンロード効率が遅すぎます。したがって、応答にこの曲へのリンクが含まれるデータ パケットを探し続けます。私がやったのは、パケット検索バーで最後の .mp3 名に対応するキーワードを検索することでした。幸いなことに、それが見つかりました。
次のステップは非常に簡単で、検索対象の各歌手の詳細ページ(固定URL + 歌手名 + .html)のパターンを見つけ、各曲の詳細ページを取得しました(その段落にはパターンはありません)。クローラーを学習した学生は、上記のデータ パッケージが応答は json データであり、辞書形式でデータを返します。キーと値のペアに基づいて必要な曲のダウンロード リンクを取得できます。最初のステップは、対応する URL に従ってこのデータ パケットをリクエストすることです。リクエスト ヘッダー内の対応する URL のパラメータを確認することに注意してください。コードは次のとおりです。
data = {'id': i,'type': 'music'}
url2 = 'http://www.2t58.com/js/play.php'
response2 = requests.post(url = url2, headers = headers, data = data)
json_data = response2.json()
musicList = json_data['url']
曲のダウンロード リンクをリスト musicList に保存し、最後に曲を保存します。コードは次のとおりです。
musicResponse = requests.get(url = musicList)
filename = json_data['title'] + '.mp3'
with open('E:/music/' + filename, 'wb') as f:
f.write(musicResponse.content)
print(filename + '下载成功!')
パスを変更すれば正常に動作します。
完全なコード:
import requests
import re
# 张学友:aHNj
# 陈奕迅:eG4
# 林忆莲:d2t3eA
name = input()
url = 'http://www.2t58.com/so/{}/1.html'.format(name)
response = requests.get(url = url)
ex = '<div class="name"><a href="/song/(.*?).html" target="_mp3">.*?</a></div>'
musicIndex = re.findall(ex, response.text, re.S)
smallmusicList = []
for j in range(0, 5):
smallmusicList.append(musicIndex[j])
print(smallmusicList)
headers ={
'Accept':'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.9',
'Connection':'keep-alive',
'Content-Length':'26',
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie':'Hm_lvt_b8f2e33447143b75e7e4463e224d6b7f=1690974946; Hm_lpvt_b8f2e33447143b75e7e4463e224d6b7f=1690976158',
'Host':'www.2t58.com',
'Origin':'http://www.2t58.com',
'Referer':'http://www.2t58.com/song/bWhzc3hud25u.html',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
'X-Requested-With':'XMLHttpRequest'
}
for i in musicIndex:
data = {'id': i,'type': 'music'}
url2 = 'http://www.2t58.com/js/play.php'
response2 = requests.post(url = url2, headers = headers, data = data)
json_data = response2.json()
musicList = json_data['url']
musicResponse = requests.get(url = musicList)
filename = json_data['title'] + '.mp3'
with open('E:/music/' + filename, 'wb') as f:
f.write(musicResponse.content)
print(filename + '下载成功!')
ウェブサイトの完成度が低いためか、一部の歌手の詳細ページは歌手名+.htmlではなく、不規則な英語文字になっている場合があります。暫定的に見つけたものを上に置きました。歌手の曲をダウンロードしたい場合は、対応する英語のアルファベット。
学習目的のみに使用し、違法な目的で使用しないでください。