>  기사  >  백엔드 개발  >  Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

黄舟
黄舟원래의
2017-10-09 10:25:352110검색

이 글에서는 NetEase Cloud 음악의 뜨거운 리뷰를 포착하기 위해 Python3 실용적인 크롤러에 대한 관련 정보를 주로 소개합니다. 이 글은 샘플 코드를 통해 매우 자세하게 소개합니다. 공부나 업무에 필요한 모든 사람에게 확실한 참고 학습 가치가 있습니다. 아래 에디터와 함께 배워보세요.

머리말

저는 이제 막 Python 크롤러를 시작했고, 반달 정도 Python을 작성하지 않아서 잊어버릴 뻔했습니다. 그래서 간단한 크롤러를 작성하여 연습해 보기로 했습니다. NetEase Cloud Music의 가장 큰 특징은 정확한 노래 추천과 독특한 사용자 리뷰라고 느꼈기 때문에 NetEase Cloud Music 인기곡 목록에서 뜨거운 리뷰를 포착하기 위해 이 방법을 작성했습니다. . 파충류. 저도 이제 막 크롤링을 시작하게 되었는데, 궁금한 점이나 의견이 있으시면 언제든지 올려주세요.

더 이상 헛소리는 그만~ 자세한 소개를 살펴보겠습니다.

우리의 목표는 NetEase Cloud의 인기곡 순위에 있는 모든 노래의 인기 댓글을 크롤링하는 것입니다.

이를 통해 크롤링에 필요한 작업량을 줄일 수 있을 뿐만 아니라 고품질 댓글도 저장할 수 있습니다.

구현 분석

먼저 그림과 같이 NetEase Cloud 웹 버전을 엽니다.

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

순위 목록을 클릭한 다음, 화면에서 클라우드 음악 인기곡 목록을 클릭합니다. 왼쪽, 사진과 같이:

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

먼저 노래를 무작위로 열어서 사진과 같이 특정 노래에 대한 인기 노래 리뷰를 얻는 방법을 알아 보겠습니다. 최근에 좋아하는 노래를 선택했습니다. 예:

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

입력 후 노래 리뷰를 볼 수 있습니다. 이 페이지 바로 아래에서 다음으로 이러한 댓글을 얻을 수 있는 방법을 찾아야 합니다.

다음으로 웹 콘솔을 엽니다(chrom용 개발자 도구를 엽니다. 다른 브라우저에서도 비슷해야 합니다). 그림과 같이 chrom 아래에서 F12를 누릅니다.

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

네트워크를 선택한 다음 F5를 눌러 새로고침합니다. 새로 고침 후 얻은 데이터는 다음과 같습니다.

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

브라우저가 많은 정보를 보내는 것을 볼 수 있는데 어떤 정보를 원할까요? 여기서 상태 코드는 서버 요청의 상태를 나타내는 것으로, 여기서 상태 코드는 요청이 정상임을 의미하는 200과 비정상을 의미하는 304입니다(종류가 많습니다. 상태 코드에 대해 더 알고 싶으면 직접 검색해 보세요. 여기서는 304의 구체적인 의미에 대해 언급하지 않겠습니다. 따라서 일반적으로 상태 코드가 200인 요청만 보면 됩니다. 또한 오른쪽 열의 미리보기를 통해 서버가 어떤 정보를 반환하는지(또는 응답을 보는지) 대략적으로 관찰할 수 있습니다. 이 두 가지 방법을 결합하면 분석하려는 요청을 빠르게 찾을 수 있습니다. 반복적인 검색 끝에 마침내 그림과 같이 노래 리뷰가 포함된 요청을 찾았습니다.

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

CSDN에서 스크린샷이 명확하지 않을 수도 있지만 R_SO_4_489998494?csrf_token=라는 POST 요청에서 이 노래가 포함된 노래 리뷰를 찾았습니다. . 더 명확하게 볼 수 있도록 이 블록의 스크린샷을 찍어 보겠습니다.

기본 정보 요청:

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

요청 헤더:

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

요청의 양식 데이터:

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

이 노래에 대한 노래 리뷰가 포함된 요청 URL이 http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token=임을 알 수 있습니다. 의 첫 번째 부분은 동일하지만 R_SO_4_ 바로 다음에 나오는 숫자 문자열이 다릅니다. 각 노래에는 지정된 ID가 있고 R_SO_4_ 뒤에 오는 것이 노래의 ID임을 추론할 수 있습니다.

제출된 양식 데이터를 다시 살펴보면 params와 encSecKey라는 두 가지 데이터가 양식에 채워져야 한다는 것을 알 수 있습니다. 다음은 큰 문자열입니다. 몇 곡을 변경하면 각 노래의 params와 encSecKey가 서로 다르다는 것을 알 수 있습니다. 따라서 이 두 데이터는 특정 알고리즘에 의해 암호화되었을 수 있습니다.

서버에서 반환되는 댓글 관련 데이터는 json 형식으로 매우 풍부한 정보(해설자 정보, 댓글 날짜, 좋아요 수, 댓글 내용 등)가 포함되어 있으며 그 중 hotComments가 가장 핫합니다. 우리가 찾고 있는 댓글은 그림과 같이 총 15개입니다.

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

이 시점에서 방향을 결정했습니다. 즉, params와 2개의 매개변수 값만 결정하면 됩니다. encSecKey. 그런데 이 두 매개변수는 특정 알고리즘을 통해 암호화됩니다. 어떻게 해야 할까요? 패턴을 찾았습니다. http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token= R_SO_4_ 뒤의 숫자가 이 노래의 id 값이고, 다른 노래의 경우 param 및 encSecKey 값입니다. A와 같은 노래의 이 두 매개변수 값을 노래 B로 전달하면 동일한 페이지 수에 대해 이 매개변수는 보편적입니다. A는 노래 B로 전달됩니다. 다른 노래의 두 매개변수에 대해서는 해당 노래의 첫 번째 페이지에서 설명을 얻을 수 있습니다. 두 번째 페이지, 세 번째 페이지 등에 대해서도 마찬가지입니다.

사실 첫 페이지에서 인기 댓글 15개만 구하면 되므로 노래를 찾아 첫 페이지 요청에 있는 params와 encSecKey의 두 매개변수 값만 복사하면 됩니다. 내려와서 사용할 준비가 되었습니다.

이 두 매개 변수를 해독하는 방법은 실제로 강력한 Zhihu에 대한 답변이 있습니다. 관심 있는 친구들은 들어가서 살펴볼 수 있습니다(https://www.zhihu.com/question/36081767). 요구 사항을 완료하려면 게으른 방법을 사용해야 합니다. xixi.

지금까지 NetEase Cloud Music의 인기 댓글을 캡처하는 방법을 분석했습니다. 클라우드 뮤직 핫곡 목록의 모든 노래에 대한 정보를 얻는 방법을 분석해 보겠습니다.

클라우드 뮤직 핫곡 목록에 있는 모든 노래의 노래 이름과 해당 ID 값을 가져와야 합니다.

위의 분석 단계와 유사하게 먼저 그림과 같이 인기곡 목록의 URL을 입력합니다.

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

그림과 같이 F12를 눌러 WEB 워크벤치에 들어갑니다.

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

toplist라는 파일에 있는데 id=3778678인 GET 요청에서 이 목록의 노래 정보가 모두 발견되었습니다.

요청에 해당하는 정보는 그림과 같습니다.

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

그림과 같이 요청에 의해 반환된 결과를 미리 보겠습니다.

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

노래 정보가 포함된 코드를 라인에서 찾았습니다. 524 코드(그림 참조):

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

따라서 요청 코드에서 정보가 포함된 코드만 필터링하면 됩니다.

여기에서는 데이터 필터링에 정규식을 사용합니다.

특성을 관찰하면 두 가지 정규식 필터를 통해 필요한 노래 정보를 추출할 수 있습니다.

첫 번째 정규식의 경우 요청에서 반환된 모든 코드에서 525번째 코드 줄을 추출했습니다.

첫 번째 정규식은 다음과 같습니다.

<ul class="f-hide">
<li>
<a href="/song\?id=\d*?" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >.*</a>
</li>
</ul>

두 번째 정규식은 524행에서 필요한 노래 정보를 추출합니다. 노래 제목과 노래 ID가 필요합니다.

노래 제목 가져오기:

<li><a href="/song\?id=\d*?" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >(.*?)</a></li>

노래 ID 가져오기:

<li><a href="/song\?id=(\d*?)" rel="external nofollow" rel="external nofollow" >.*?</a></li>

이제 전체 과정을 분석했으니 구체적인 내용을 보려면 코드로 가보겠습니다~~

코드는 다음과 같습니다. :


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re
import urllib.request
import urllib.error
import urllib.parse
import json
def get_all_hotSong():  #获取热歌榜所有歌曲名称和id
 url=&#39;http://music.163.com/discover/toplist?id=3778678&#39; #网易云云音乐热歌榜url
 html=urllib.request.urlopen(url).read().decode(&#39;utf8&#39;) #打开url
 html=str(html)  #转换成str
 pat1=r&#39;<ul class="f-hide"><li><a href="/song\?id=\d*?">.*</a></li></ul>&#39; #进行第一次筛选的正则表达式
 result=re.compile(pat1).findall(html)  #用正则表达式进行筛选
 result=result[0]  #获取tuple的第一个元素

 pat2=r&#39;<li><a href="/song\?id=\d*?">(.*?)</a></li>&#39; #进行歌名筛选的正则表达式
 pat3=r&#39;<li><a href="/song\?id=(\d*?)">.*?</a></li>&#39; #进行歌ID筛选的正则表达式
 hot_song_name=re.compile(pat2).findall(result) #获取所有热门歌曲名称
 hot_song_id=re.compile(pat3).findall(result) #获取所有热门歌曲对应的Id

 return hot_song_name,hot_song_id

def get_hotComments(hot_song_name,hot_song_id):
 url=&#39;http://music.163.com/weapi/v1/resource/comments/R_SO_4_&#39; + hot_song_id + &#39;?csrf_token=&#39; #歌评url
 header={ #请求头部
 &#39;User-Agent&#39;:&#39;Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36&#39;
}
 #post请求表单数据
 data={&#39;params&#39;:&#39;zC7fzWBKxxsm6TZ3PiRjd056g9iGHtbtc8vjTpBXshKIboaPnUyAXKze+KNi9QiEz/IieyRnZfNztp7yvTFyBXOlVQP/JdYNZw2+GRQDg7grOR2ZjroqoOU2z0TNhy+qDHKSV8ZXOnxUF93w3DA51ADDQHB0IngL+v6N8KthdVZeZBe0d3EsUFS8ZJltNRUJ&#39;,&#39;encSecKey&#39;:&#39;4801507e42c326dfc6b50539395a4fe417594f7cf122cf3d061d1447372ba3aa804541a8ae3b3811c081eb0f2b71827850af59af411a10a1795f7a16a5189d163bc9f67b3d1907f5e6fac652f7ef66e5a1f12d6949be851fcf4f39a0c2379580a040dc53b306d5c807bf313cc0e8f39bf7d35de691c497cda1d436b808549acc&#39;}
 postdata=urllib.parse.urlencode(data).encode(&#39;utf8&#39;) #进行编码
 request=urllib.request.Request(url,headers=header,data=postdata)
 reponse=urllib.request.urlopen(request).read().decode(&#39;utf8&#39;)
 json_dict=json.loads(reponse) #获取json
 hot_commit=json_dict[&#39;hotComments&#39;] #获取json中的热门评论


 num=0
 fhandle=open(&#39;./song_comments&#39;,&#39;a&#39;) #写入文件
 fhandle.write(hot_song_name+&#39;:&#39;+&#39;\n&#39;)

 for item in hot_commit:
  num+=1
  fhandle.write(str(num)+&#39;.&#39;+item[&#39;content&#39;]+&#39;\n&#39;)
 fhandle.write(&#39;\n==============================================\n\n&#39;)
 fhandle.close()




hot_song_name,hot_song_id=get_all_hotSong() #获取热歌榜所有歌曲名称和id

num=0
while num < len(hot_song_name): #保存所有热歌榜中的热评
 print(&#39;正在抓取第%d首歌曲热评...&#39;%(num+1))
 get_hotComments(hot_song_name[num],hot_song_id[num])
 print(&#39;第%d首歌曲热评抓取成功&#39;%(num+1))
 num+=1

code 연산 결과는 다음과 같습니다.

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

웹페이지에 있는 "If I Love You" 노래 리뷰와 우리가 저장한 노래 리뷰를 비교해보세요:

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).

정보가 정확합니다~

요약

위 내용은 Python3은 NetEase Cloud Music의 인기 댓글 분석을 캡처하기 위해 크롤러를 구현합니다(그림).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.