Python クローラーの実践例 - 音楽クローラー、有料楽曲も引き続き利用可能

現在、多くの音楽プラットフォームが曲のダウンロードに料金を請求しているため、車で聴く音楽がありません。そこで私は独学でクロールの方法を学び、このシンプルな音楽クローラーを作成しました。それはそれらの大きなプラットフォームからの音楽クローラーではなく、未知の小さな音楽ウェブサイトからのクローラーです。本題に入りましょう:

まず、大手インターネット会社ではない音楽サイトを探していたのですが、たゆまぬ努力の末、比較的充実した楽曲を揃えているキジ音楽サイトを見つけました(これだけは言わせてください)。キジですが、新曲から人気歌手の名曲まで網羅しており、スズメは小さいながらも内臓が揃っています。

次に、Web サイトのパケットをキャプチャして、Web リンクのパターンを探す必要があります。もちろん、この小さな Web サイトの Web リンクのパターンも非常に単純です。以下に示すように:

ba08bbb7d7bb4757b8c4a66c63db6fa4.png

348ac4b698a44c229f25d1b38c634ef0.png

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 サイトはこれまでのところクロール対策されていません。

次に、いくつかの曲をクリックしてみましょう。

2835c96841824584b1443cf60e36901c.png

 

d3fad3955f774d7f8d1e2a633e88deed.png

 7bc5fa96810246ee94e8917607302844.png

 

周杰倫が好きな友達がたくさんいるので、周杰倫を検索して彼の曲をいくつかクリックしてみたところ、ウェブページの欄のウェブアドレスが不規則になっており、英語の単語の羅列になっていることがわかります。理解できません。文字プラス.html。そして、曲をダウンロードしたい場合は、このページに入らなければなりません。そのため、その Web アドレスのパターンを見つけるか、不規則な英文字の文字列がどのデータ パケットから取得できるかを見つけなければなりません。次に、データを取得して分析しました。 

24b277c81c0a4e558ddebfa7535e4e3d.png

各 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)

次に、曲のダウンロード リンクに戻り、バイナリ形式で保存します。曲をクリックするだけで、曲の詳細ページがキャプチャされます。

4a875de1a077428185965ed20289b405.png

多くのデータ パケットが存在します。データ パケットの種類に応じてそれらを選択して表示できます。オーディオとビデオは明らかにメディア タイプのデータ パケットです。明らかに、これが私たちが望む音楽リンクです。別の Web ページ バーで検索して、制限なしで直接ダウンロードできる完全な音楽を取得します。しかし、私たちが望んでいるのは一括ダウンロードであり、各曲のダウンロード効率が遅すぎます。したがって、応答にこの曲へのリンクが含まれるデータ パケットを探し続けます。私がやったのは、パケット検索バーで最後の .mp3 名に対応するキーワードを検索することでした。幸いなことに、それが見つかりました。

 

 4528c6e317474c928552ca85bb444c2c.png

862c5fdc8c7b4b4eba76acad7825d417.png

 次のステップは非常に簡単で、検索対象の各歌手の詳細ページ(固定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ではなく、不規則な英語文字になっている場合があります。暫定的に見つけたものを上に置きました。歌手の曲をダウンロードしたい場合は、対応する英語のアルファベット。

 

学習目的のみに使用し、違法な目的で使用しないでください。

 

 

 

 

 

おすすめ

転載: blog.csdn.net/qq_64241302/article/details/132167076