>  기사  >  백엔드 개발  >  Python으로 qq 음악을 크롤링하는 프로세스의 예

Python으로 qq 음악을 크롤링하는 프로세스의 예

零下一度
零下一度원래의
2017-07-18 15:28:284064검색

1. 소개


가끔 좋은 음악을 다운받고 싶은데 웹페이지에서 다운받을 때마다 로그인이 필요하거나 뭔가 귀찮네요. . 여기 qqmusic 크롤러가 있습니다. 적어도 for 루프 크롤러에서 가장 중요한 것은 크롤링할 요소의 URL을 찾는 것이라고 생각합니다. 아래부터 살펴보겠습니다(틀렸다면 웃지 마세요)

<br>

2. Python은 QQ 음악 싱글을 크롤링합니다.


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)

4. 크롤러 실행

<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을 통해 웹 페이지 소스 코드를 구문 분석하여 단일 페이지를 얻는 것을 시뮬레이션합니다. 정보.

2.url 링크 관리자는 컬렉션 데이터 구조를 사용하여 단일 링크를 저장합니다. 동일한 앨범에서 여러 개의 싱글이 나올 수 있으므로(앨범 URL이 동일함) 이렇게 하면 요청 수가 줄어들 수 있습니다.
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>


3 Python 타사 플러그인

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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