>  기사  >  백엔드 개발  >  Python 크롤러 오디오 데이터 예

Python 크롤러 오디오 데이터 예

PHP中文网
PHP中文网원래의
2017-06-21 17:16:242212검색

1: 서문

이번에는 히말라야 인기 칼럼에 속한 모든 라디오 방송국의 채널별 정보와 채널 내 오디오 데이터별 다양한 정보를 크롤링한 후, 크롤링한 데이터를 mongodb에 저장하여 추후 활용하도록 했습니다. 이번에는 데이터 양이 70만 개 정도다. 오디오 데이터에는 오디오 다운로드 주소, 채널 정보, 소개 등이 많이 있습니다.
어제 첫 인터뷰를 했는데요. 상대방이 2학년 여름방학에 인턴을 하려고 했는데, 오디오 데이터를 크롤링해 달라고 해서 오디오를 분석하러 왔습니다. 히말라야. 데이터가 크롤링됩니다. 현재 저는 아직도 3번의 면접을 기다리고 있거나, 최종 면접 소식을 통보받기를 기다리고 있습니다. (확실한 인정을 받을 수 있기 때문에 성공, 실패에 관계없이 매우 행복합니다)


2: 실행 환경

  • IDE: Pycharm 2017

  • Python3.6

  • pymongo 3.4.0

  • requests 2.14.2

  • lxml 3.7.2

  • BeautifulSoup 4.5.3


Three: 예제 분석

1. 먼저 이 크롤링의 메인 페이지에 들어가면 12개의 채널을 볼 수 있습니다. 각 페이지에는 각 채널 아래에 많은 오디오가 있으며 일부 채널에는 많은 페이지 매김이 있습니다. 크롤링 계획: 84페이지를 반복하고 각 페이지를 구문 분석한 후 각 채널의 이름, 이미지 링크 및 채널 링크를 가져와 mongodb에 저장합니다.


인기 채널

2. 개발자 모드를 열고 페이지를 분석해 원하는 데이터의 위치를 ​​빠르게 찾아보세요. 다음 코드는 모든 인기 채널의 정보를 수집하여 mongodb에 저장하는 것을 구현합니다.

start_urls = ['http://www.ximalaya.com/dq/all/{}'.format(num) for num in range(1, 85)]for start_url in start_urls:html = requests.get(start_url, headers=headers1).text
    soup = BeautifulSoup(html, 'lxml')for item in soup.find_all(class_="albumfaceOutter"):content = {'href': item.a['href'],'title': item.img['alt'],'img_url': item.img['src']
        }
        print(content)

채널 분석

3. 다음 단계는 각 채널의 모든 오디오 데이터를 가져오는 것입니다. 분석 페이지를 통해 미국 채널에 대한 링크를 얻었습니다. 예를 들어 우리는 이 링크를 입력한 후 페이지 구조를 분석합니다. 각 오디오에는 div의 속성에서 얻을 수 있는 특정 ID가 있음을 알 수 있습니다. 개별 ID로 변환하려면 분할() 및 int()를 사용하십시오.


채널 페이지 분석

4. 그런 다음 오디오 링크를 클릭하고 개발자 모드로 들어가서 페이지를 새로 고치고 XHR을 클릭한 다음 json 링크를 클릭하여 이 오디오의 모든 세부 정보를 확인하세요.

html = requests.get(url, headers=headers2).text
numlist = etree.HTML(html).xpath('//div[@class="personal_body"]/@sound_ids')[0].split(',')for i in numlist:
    murl = 'http://www.ximalaya.com/tracks/{}.json'.format(i)html = requests.get(murl, headers=headers1).text
    dic = json.loads(html)

오디오 페이지 분석


5. 위의 내용은 채널 메인 페이지의 모든 오디오 정보만 분석한 것인데, 실제로 해당 채널의 오디오 링크에는 페이지 매김이 많습니다.

html = requests.get(url, headers=headers2).text
ifanother = etree.HTML(html).xpath('//div[@class="pagingBar_wrapper"]/a[last()-1]/@data-page')if len(ifanother):num = ifanother[0]
    print('本频道资源存在' + num + '个页面')for n in range(1, int(num)):
        print('开始解析{}个中的第{}个页面'.format(num, n))
        url2 = url + '?page={}'.format(n)# 之后就接解析音频页函数就行,后面有完整代码说明

Paging

6. 전체 코드 주소 github.com/rieuse/learnPython

__author__ = '布咯咯_rieuse'import jsonimport randomimport timeimport pymongoimport requestsfrom bs4 import BeautifulSoupfrom lxml import etree

clients = pymongo.MongoClient('localhost')
db = clients["XiMaLaYa"]
col1 = db["album"]
col2 = db["detaile"]

UA_LIST = []  # 很多User-Agent用来随机使用可以防ban,显示不方便不贴出来了
headers1 = {} # 访问网页的headers,这里显示不方便我就不贴出来了
headers2 = {} # 访问网页的headers这里显示不方便我就不贴出来了def get_url():
    start_urls = ['http://www.ximalaya.com/dq/all/{}'.format(num) for num in range(1, 85)]for start_url in start_urls:
        html = requests.get(start_url, headers=headers1).text
        soup = BeautifulSoup(html, 'lxml')for item in soup.find_all(class_="albumfaceOutter"):
            content = {'href': item.a['href'],'title': item.img['alt'],'img_url': item.img['src']
            }
            col1.insert(content)
            print('写入一个频道' + item.a['href'])
            print(content)
            another(item.a['href'])
        time.sleep(1)def another(url):
    html = requests.get(url, headers=headers2).text
    ifanother = etree.HTML(html).xpath('//div[@class="pagingBar_wrapper"]/a[last()-1]/@data-page')if len(ifanother):
        num = ifanother[0]
        print('本频道资源存在' + num + '个页面')for n in range(1, int(num)):
            print('开始解析{}个中的第{}个页面'.format(num, n))
            url2 = url + '?page={}'.format(n)
            get_m4a(url2)
    get_m4a(url)def get_m4a(url):
    time.sleep(1)
    html = requests.get(url, headers=headers2).text
    numlist = etree.HTML(html).xpath('//div[@class="personal_body"]/@sound_ids')[0].split(',')for i in numlist:
        murl = 'http://www.ximalaya.com/tracks/{}.json'.format(i)
        html = requests.get(murl, headers=headers1).text
        dic = json.loads(html)
        col2.insert(dic)
        print(murl + '中的数据已被成功插入mongodb')if __name__ == '__main__':
    get_url()

7로 수정하면 더 빠릅니다. 평소보다 분당 거의 100개에 가까운 데이터를 얻으려고 노력했습니다. 이 소스코드는 github에도 있습니다.


비동기

위 내용은 Python 크롤러 오디오 데이터 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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