가끔 좋은 음악을 다운받고 싶은데 웹페이지에서 다운받을 때마다 로그인이 필요하거나 뭔가 귀찮네요. . 여기 qqmusic 크롤러가 있습니다. 적어도 for 루프 크롤러에서 가장 중요한 것은 크롤링할 요소의 URL을 찾는 것이라고 생각합니다. 아래부터 살펴보겠습니다(틀렸다면 웃지 마세요)
<br>
MOOC.com에서 본 동영상에서 아주 잘 설명했습니다. . 또한 일반적으로 크롤러를 작성하는 단계를 따릅니다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 1. 목표를 정하라
우선 목표를 명확히 해야 한다. 이번에는 QQ뮤직 가수 앤디 라우(Andy Lau)의 싱글을 크롤링했다. (바이두 백과사전) -> 분석 대상(전략: URL 형식(범위), 데이터 형식, 웹 페이지 인코딩) -> 코드 작성 -> 크롤러 실행
2. 분석 대상 link :
왼쪽 스크린샷을 보면 단일곡 정보가 페이징 방식으로 정리되어 있고, 각 페이지에 30개의 항목이 표시되어 총 30페이지에 걸쳐 표시되는 것을 볼 수 있습니다. 페이지 번호 또는 맨 오른쪽의 ">"를 클릭하면 브라우저가 서버에 비동기 Ajax 요청을 보냅니다. 각각 시작 노래 첨자(스크린샷은 두 번째 페이지, 시작 첨자는 30)와 한 페이지는 30개의 항목을 반환하며, 서버는 노래 정보를 json 형식(MusicJsonCallbacksinger_track({"code":0,"data": {"list":[{"Flisten_count1":.. .....]})), 노래 정보만 얻으려는 경우 링크 요청을 직접 연결하고 반환된 json 형식 데이터를 구문 분석할 수 있습니다. 여기서는 데이터 형식을 직접 구문 분석하는 방법을 사용하지 않습니다. 저는 Python Selenium 방법을 사용합니다. 단일 정보의 각 페이지를 가져와 구문 분석한 후 ">"를 클릭하여 모든 정보가 나올 때까지 구문 분석을 계속합니다. 단일 정보를 파싱하여 기록합니다. 마지막으로, 각 싱글의 링크를 요청하여 자세한 싱글 정보를 얻으세요.
오른쪽 스크린샷은 웹 페이지의 소스 코드입니다. 모든 노래 정보는 클래스 이름이 mod_songlist인 div 플로팅 레이어에 있습니다. 클래스 이름이 songlist_list인 순서가 지정되지 않은 목록 ul 아래에 있습니다. li 요소는 싱글을 표시합니다. songlist__album 클래스 이름 아래의 a 태그에는 싱글의 링크, 이름 및 기간이 포함됩니다.
3. 코드 작성
1) 여기서는 Python의 Urllib 표준 라이브러리를 사용하고 다운로드 방법을 캡슐화합니다.
def download(url, user_agent='wswp', num_retries=2): if url is None: return None print('Downloading:', url) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'} request = urllib.request.Request(url, headers=headers) # 设置用户代理wswp(Web Scraping with Python) try: html = urllib.request.urlopen(request).read().decode('utf-8') except urllib.error.URLError as e: print('Downloading Error:', e.reason) html = None if num_retries > 0: if hasattr(e, 'code') and 500 <= e.code < 600: # retry when return code is 5xx HTTP erros return download(url, num_retries-1) # 请求失败,默认重试2次, return html
2) Par 그래요 여기에서는 웹 페이지 콘텐츠, 타사 플러그인 BeautifulSoup이 사용됩니다. 자세한 내용은 BeautifulSoup API를 참조하세요. def music_scrapter(html, page_num=0):
try:
soup = BeautifulSoup(html, 'html.parser')
mod_songlist_div = soup.find_all('div', class_='mod_songlist')
songlist_ul = mod_songlist_div[1].find('ul', class_='songlist__list')
'''开始解析li歌曲信息'''
lis = songlist_ul.find_all('li')
for li in lis:
a = li.find('div', class_='songlist__album').find('a')
music_url = a['href'] # 单曲链接
urls.add_new_url(music_url) # 保存单曲链接
# print('music_url:{0} '.format(music_url))
print('total music link num:%s' % len(urls.new_urls))
next_page(page_num+1)
except TimeoutException as err:
print('解析网页出错:', err.args)
return next_page(page_num + 1)
return None
def get_music():
try:
while urls.has_new_url():
# print('urls count:%s' % len(urls.new_urls))
'''跳转到歌曲链接,获取歌曲详情'''
new_music_url = urls.get_new_url()
print('url leave count:%s' % str( len(urls.new_urls) - 1))
html_data_info = download(new_music_url)
# 下载网页失败,直接进入下一循环,避免程序中断
if html_data_info is None:
continue
soup_data_info = BeautifulSoup(html_data_info, 'html.parser')
if soup_data_info.find('div', class_='none_txt') is not None:
print(new_music_url, ' 对不起,由于版权原因,暂无法查看该专辑!')
continue
mod_songlist_div = soup_data_info.find('div', class_='mod_songlist')
songlist_ul = mod_songlist_div.find('ul', class_='songlist__list')
lis = songlist_ul.find_all('li')
del lis[0] # 删除第一个li
# print('len(lis):$s' % len(lis))
for li in lis:
a_songname_txt = li.find('div', class_='songlist__songname').find('span', class_='songlist__songname_txt').find('a')
if 'https' not in a_songname_txt['href']: #如果单曲链接不包含协议头,加上
song_url = 'https:' + a_songname_txt['href']
song_name = a_songname_txt['title']
singer_name = li.find('div', class_='songlist__artist').find('a').get_text()
song_time =li.find('div', class_='songlist__time').get_text()
music_info = {}
music_info['song_name'] = song_name
music_info['song_url'] = song_url
music_info['singer_name'] = singer_name
music_info['song_time'] = song_time
collect_data(music_info)
except Exception as err: # 如果解析异常,跳过
print('Downloading or parse music information error continue:', err.args)
<span style="font-size: 16px;">爬虫跑起来了,一页一页地去爬取专辑的链接,并保存到集合中,最后通过get_music()方法获取单曲的名称,链接,歌手名称和时长并保存到Excel文件中。</span><br><span style="font-size: 14px;"><img src="https://img.php.cn/upload/article/000/000/001/a1138f33f00f8d95b52fbfe06e562d24-4.png" alt="" style="max-width:90%" style="max-width:90%"><strong><img src="https://img.php.cn/upload/article/000/000/001/9282b5f7a1dc4a90cee186c16d036272-5.png" alt=""></strong></span>
<br>
3. Python 크롤링 QQ 음악 싱글 요약<br>
1. 싱글은 페이징을 사용하고, 다음 페이지로 전환하는 것은 비동기식 Ajax 요청을 통해 이루어집니다. 서버에서 json 형식의 데이터를 가져와 페이지에 렌더링합니다. 브라우저 주소 표시줄 링크는 변경되지 않으며 연결된 링크를 통해 요청할 수 없습니다. 처음에는 Python Urllib 라이브러리를 통해 ajax 요청을 시뮬레이션하려고 생각했지만 나중에 Selenium을 사용하려고 생각했습니다. Selenium은 브라우저의 실제 작동을 매우 잘 시뮬레이션할 수 있으며 페이지 요소의 위치 지정도 매우 편리합니다. 다음 페이지를 클릭하고 단일 페이지 매김을 지속적으로 전환한 다음 BeautifulSoup을 통해 웹 페이지 소스 코드를 구문 분석하여 단일 페이지를 얻는 것을 시뮬레이션합니다. 정보.
class UrlManager(object):<br> def __init__(self):<br> self.new_urls = set() # 使用集合数据结构,过滤重复元素<br> self.old_urls = set() # 使用集合数据结构,过滤重复元素
def add_new_url(self, url):<br> if url is None:<br> return<br> if url not in self.new_urls and url not in self.old_urls:<br> self.new_urls.add(url)<br><br> def add_new_urls(self, urls):<br> if urls is None or len(urls) == 0:<br> return<br> for url in urls:<br> self.add_new_url(url)<br><br> def has_new_url(self):<br> return len(self.new_urls) != 0<br><br> def get_new_url(self):<br> new_url = self.new_urls.pop()<br> self.old_urls.add(new_url)<br> return new_url<br><br>
openpyxl을 통해 Excel을 읽고 쓰는 것이 매우 편리하며 단일 정보는 Excel 파일을 통해 잘 저장할 수 있습니다.
def write_to_excel(self, content):<br> try:<br> for row in content:<br> self.workSheet.append([row['song_name'], row['song_url'], row['singer_name'], row['song_time']])<br> self.workBook.save(self.excelName) # 保存单曲信息到Excel文件<br> except Exception as arr:<br> print('write to excel error', arr.args)<br><br>4. Postscript
드디어 축하해야 할 일이 있는데요, 결국 QQ뮤직 싱글 정보 크롤링에 성공했네요. 이번에는 싱글 크롤링에 성공했는데, Selenium은 꼭 필요했습니다. 이번에는 Selenium의 몇 가지 간단한 기능만 사용했습니다. 앞으로는 크롤러 측면뿐만 아니라 UI 자동화 측면에서도 Selenium에 대해 자세히 알아볼 예정입니다. 향후 최적화가 필요한 점: 1. 다운로드 링크가 많아 하나씩 다운로드가 느릴 예정입니다. 2. 서버가 IP를 비활성화하고 동일한 도메인 이름에 너무 자주 액세스하는 문제를 피하기 위해 다운로드 속도가 너무 빠릅니다. 각 요청 사이에 대기 간격이 있습니다. 3. 정규식을 구문 분석하는 것은 BeautifulSoup 및 lxml을 사용할 수 있지만 효율성 측면에서는 BeautifulSoup을 사용하려고 합니다. lxml 나중에.
위 내용은 Python으로 qq 음악을 크롤링하는 프로세스의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!